实验三 有序链表操作
一、 要求完成时间
实验开始后的第四周之前完成
二、 实验目的
1、 掌握有序链表的基本操作:插入、删除、查找。
2、 掌握链表遍历器的使用方法。
三、 实验内容
- 输入n个不为零的整数作为节点元素值,遇到0代表输入结束(不创建元素值为0的节点),创建有序链表。输出整个链表。
- 输入一个整数,将该数插入到有有序链表相应位置。输出整个链表。
- 输入一个整数,在链表中进行搜索,输出其在链表中的第一个出现的位置。如果不存在输出0。
- 再一次输入一个整数,在链表中进行搜索,输出其在链表中的第一个出现的位置。如果不存在输出0。
- 再一次输入n个不为零的整数作为节点元素值,遇到0代表输入结束(不创建元素值为0的节点),创建一个新的有序链表。输出整个链表。
- 使用链表遍历器实现上面两个有序链表的合并,输出合并后的有序链表。
- 提示:注意单节点链表的测试。
四、 特别提醒:运行结果不稳定的原因
这个实验的程序最容易出现运行结果不稳定情况,也容易出现死循环或者不正常退出的情况,造成的原因大多是使用的非法内存,也就是一个变量没有赋值就直接引用,例如下面的引用就会造成非法引用。
ChainNode<T> *y1 = new ChainNode<T>;
y1->data = x;
ChainNode<T>y2
y2=y1->link;
//y1->link没有赋值,y2就指向一个随时位置
cout << y2->data<< endl;
//这句话就会输出一个不确定数值。
y2->data=123;
//这句话就在给一个不去确定的内存赋值,造成系统严重错误。
//正确做法是申请到节点后,一定要给里面的指针赋值为空:
ChainNode<T> *y1 = new ChainNode<T>;
y1->link = null;
#include <iostream>
using namespace std;
class Chain;
class ChainNode {
friend Chain;
private:
int data;
ChainNode *link;
};
class Chain {
public:
Chain() {
first = new ChainNode;
first->link = 0; first->data = 0;
}
Chain & Merge(Chain &x);
Chain & Append(int a);
void Output(ostream& out);
Chain & Insert(int i, int x);
int Find(int x);
Chain & Reverse();
private:
ChainNode *first;
};
Chain & Chain::Reverse()