任务1:编写链表的创建函数,打印函数和释放函数。创建函数把键盘输入的整数存入链表,其中最新加入的数在链表的头部。创建函数每次将一个数据存入链表,如果需要存多个数据,那么需要多次调用创建函数。打印函数则将链表中的元素,按照从头到尾的顺序全部输出,需要考虑链表为空的情况。释放函数主要用来将链表占用的内存释放,在主程序结束之前执行。要求链表的头指针定义为全局变量,名字为head
任务2:编写主函数,通过调用链表的创建函数,插入函数,删除函数,打印函数和释放函数,对键盘输入的整数进程存储和删除。要求进行插入或删除的操作后,都要执行一次打印函数,以便于观察操作是否完成。要求链表的头指针定义为全局变量,名字为head
#include<iostream>
using namespace std;
#define NodePosition Node<T>*
template <typename T>
struct Node {
T data;
NodePosition pre;
NodePosition later;
Node() {}
Node(T d, NodePosition p = NULL, NodePosition l = NULL) :data(d), pre(p), later(l) {}
};
template <typename T>
class LinkedList
{
private:
int length;
NodePosition header;
NodePosition trailer;
public:
LinkedList() {
header = new Node<T>;
trailer = new Node<T>;
header->later = trailer;
trailer->pre = header;
header->pre = NULL;
trailer->later = NULL;
length = 0;
}
~LinkedList()
{
ClearWholeList();
delete header;
delete trailer;
}
void InsertAsFirst(int d) {
NodePosition a = new Node<T>;
a->data = d;
a->later = header->later;
header->later = a;
a->later->pre = a;
a->pre = header;
length++;
}
void InsertAsLast(int d) {
NodePosition a = new Node<T>;
a->data = d;
a->later = trailer;
trailer->pre->later = a;
a->pre = trailer->pre;
trailer->pre = a;
length++;
}
void PrintList() {
if (length == 0)
{
cout << "list is null" << endl;
return;
}
NodePosition flag = header->later;
cout << "data:";
while (flag != trailer)
{
cout << flag->data <<" ";
flag = flag->later;
}
cout << endl;
}
void DeleteNode(NodePosition p){
p->pre->later = p->later;
p->later->pre = p->pre;
delete p;
length--;
}
NodePosition FindNode(T e)
{
NodePosition flag = header->later;
while (flag != trailer)
{
if (flag->data == e)
return flag;
flag = flag->later;
}
cout << "NOT FOUND";
return NULL;
}
void ClearWholeList()
{
NodePosition flag = header->later;
while (flag != trailer)
{
DeleteNode(flag);
delete flag;
}
}
};
int main()
{
int a = 0;
int b = 1;
LinkedList<int> list;
while (b)
{
int flag = 0;
cout << "1.InsertAsFirst" << endl;
cout << "2.delete" << endl;
cout << "-1.exit"<<endl;
cin >> flag;
cout << endl;
switch (flag)
{
case 1:
cout << "insert:";
cin >> a;
cout << endl;
list.InsertAsFirst(a);
list.PrintList();
break;
case 2:
cout << "detele :" ;
cin >> a;
list.DeleteNode(list.FindNode(a));
list.PrintList();
break;
case -1:
b = 0;
break;
}
}
return 0;
}