任务
创建一个包含头节点的循环链表。用这个链表存储键盘输入的整数,整数的数量由键盘输入给定。要求使用尾指针(tail)表示链表,其中尾指针指向最新输入的数据。
编写打印函数,输出链表中的所有数据。要求从链表的第一个节点开始输出。
编写插入函数,实现在第i个节点(i由键盘输入,i=0表示插入的结点作为第1个结点)之后插入一个元素为x的节点。
#include<iostream>
using namespace std;
#define NodePosition Node<T>*
template <typename T>
struct Node {
T data;
NodePosition next;
Node(){}
Node(T d, NodePosition n = NULL) :data(d),next(n) {}
} ;
template <typename T>
class LinkedList
{
private:
int length;
NodePosition tail;
NodePosition header;
public:
LinkedList() {
header = new Node<T>;
tail = new Node<T>;
header->next = header;
tail = header;
length = 0;
}
~LinkedList()
{
/*
if (length == 0)
{
delete tail;
delete header;
}
else
{
NodePosition flag = new Node<T>;
NodePosition a = tail->next->next;
while (a != tail)
{
flag = a;
a = a->next;
delete flag;
}
delete tail;
delete header;
}
*/
}
void InsertAsLast(T d) {
NodePosition a = new Node<T>(d);
if (length == 0)
{
tail = a;
a->next = header;
header->next = a;
}
else
{
tail->next = a;
a->next = header;
tail = a;
}
length++;
}
void PrintList() {
if (length == 0)
{
cout << "list is empty" << endl;
return;
}
NodePosition flag = tail->next->next;
cout << "data:";
while (flag != header)
{
cout << flag->data << " ";
flag = flag->next;
}
cout << endl;
}
void Insert(T d, int n)
{
NodePosition flag = header;
NodePosition a = new Node<T>(d);
if (n > length + 1)
{
cout << "length is not enough"<<endl;
return;
}
else if (length == 0)
{
tail = a;
a->next = header;
header->next = a;
}
else if (n == length)
{
InsertAsLast(d);
}
else
{
while (n)
{
flag = flag->next;
n--;
}
a->next = flag->next;
flag->next = a;
}
}
};
int main()
{
int len = 0;
int a = 0;
int b = 1;
int c = 0;
LinkedList<int> list;
while (b)
{
int control = 0;
cout << "1.Initial" << endl;
cout << "2.InsertAsLast" << endl;
cout << "3. Print" << endl;
cout << "4.Insert" << endl;
cout << "0.exit" << endl;
cin >> control;
cout << endl;
switch (control)
{
case 1:
cout << "length:" << endl;
cin >> len;
while (len > 0)
{
cin >> a;
list.InsertAsLast(a);
len--;
}
break;
case 2:
cout << "insert:";
cin >> a;
cout << endl;
list.InsertAsLast(a);
list.PrintList();
break;
case 3:
list.PrintList();
break;
case 4:
cout << "Position? ";
cin >> c;
cout << endl << "insert:";
cin >> a;
list.Insert(a, c);
break;
case 0:
b = 0;
break;
}
}
return 0;
}