1.实验内容
实验4.1
要求封装链表类,链表迭代器类;
链表类需提供操作:在指定位置插入元素,删除指定元素,搜索链表中是否有指定元素,原地逆置链表,输出链表;
不得使用与链表实现相关的STL。
输入输出格式:
输入:第一行两个整数 N 和 Q。
第二行 N 个整数,作为节点的元素值,创建链表。
接下来 Q 行,执行各个操作,具体格式如下:
插入操作 : 1 idx val,在链表的idx位置插入元素val;
删除操作 : 2 val,删除链表中的 val 元素。若链表中存在多个该元素,仅删除第一个。若该元素不存在,输出 -1;
逆置操作 : 3,原地逆置链表;
查询操作 : 4 val,查询链表中的val元素,并输出其索引。若链表中存在多个该元素,输出第一个的索引。若不存在该元素,输出 -1;
输出操作 : 5,使用链表迭代器,输出当前链表索引与元素的异或和。
实验4.2
要求使用题目一中实现的链表类,迭代器类完成本题;
不得使用与题目实现相关的STL;
给定两组整数序列,你需要分别创建两个有序链表,使用链表迭代器实现链表的合并,并分别输出这三个有序链表的索引与元素的异或和。
注:给定序列是无序的,你需要首先得到一个有序的链表。
输入输出格式:
输入:
第一行两个整数 N 和 M;
第二行 N 个整数,代表第一组整数序列;
第三行 M 个整数,代表第二组整数序列。
输出:
三行整数。分别代表第一组数、第二组数对应的有序链表与合并后有序链表的索引与元素的异或和。
2.测试结果
实验4.1
输入:
10 10
6863 35084 11427 53377 34937 14116 5000 49692 70281 73704
4 6863
1 2 44199
5
4 21466
1 6 11483
5
4 34937
5
4 6863
1 10 18635
输出:
0
398665
-1
410141
5
410141
0
实验4.2
输入:
3 2
3 1 2
8 7
输出:
5
16
21
3.源代码
实验4.1
#include<iostream>
using namespace std;
template<class T> //定义节点结构体
struct chainNode
{
T element;
chainNode<T> *next;
chainNode()
{}
chainNode(const T &element)
{
this->element=element;
}
chainNode(const T &element,chainNode<T>*next)
{
this->element=element;
this->next=next;
}
};
template<class T> //定义链表类
class chain
{
public:
chain() //构造函数
{
firstNode=NULL;
listSize=0;
}
chain(const chain<T>&theList) //复制构造函数
{
listSize=theList.listSize;
if(listSize==0)
{
firstNode=NULL;
return;
}
chainNode<T>*sourceNode=theList.firstNode;
firstNode=new chainNode<T>(sourceNode->element);
sourceNode=sourceNode->next;
chainNode<T>*targetNode=firstNode;
while(sourceNode!=NULL)
{
targetNode->next=new chainNode<T>(sourceNode->element);
target