#include<iostream>
using namespace std;
template <class T>
class Node
{
public:
T data;
Node<T>* next;
};
template <class T>
class CLinkList
{
public:
CLinkList();
~CLinkList();
int getLength() { return this->length; };
void createList();
void printList();
void insert(int No, T data);
bool isEmpty();
Node<T>* getElem(int No);
void Delete(int No);
void printAll();
private:
Node<T>* rear;
int length;
};
template <class T>
CLinkList<T>::CLinkList()
{
rear = new Node<T>;
rear->next = rear;
this->length = 0;
}
template <class T>
CLinkList<T>::~CLinkList()
{
Node<T>* p = rear;
for(int i=0;i<this->length+1;i++)//这里要比链表长度多析构一个,这个+1是头结点
{
rear = p;
p = p->next;
delete rear;
}
}
template <class T>
void CLinkList<T>::createList()
{
Node<T>* p = rear->next;//建立工作指针
int length = 0;
T data;
cout << "输入新链表长度" << endl;
cin >> length;
this->length = length;
for (int i = 0; i < length; i++)
{
Node<T>* temp = new Node<T>;
cout << "输入第" << i + 1 << "个数据" << endl;
cin >> data;
temp->data = data;
//这两步就不难了,让当前结点的指针域和工作指针的结点指针域相同
//就是让工作结点指向当前结点
//然后更新工作结点p。
p->next = temp;
p = temp;
}
Node<T>* pRear;
pRear = p;//临时指针,让rear和p互换
p = rear;//更新尾指针
rear = pRear;
rear->next = p;//让链表循环*/
//cout << rear->data << endl;
cout << "尾指针数据1:" << this->rear->data << endl;
};
template <class T>
void CLinkList<T>::printList()
{
Node<T>* p = rear->next;
for(int i=0;i<this->getLength();i++)
{
p = p->next;
cout << p->data << " ";
}
cout << endl;
}
template <class T>
void CLinkList<T>::insert(int No, T data)
{
Node<T>* temp = new Node<T>;
if (No < length-1 && No>0)
{
Node<T>* p = this->getElem(No);
temp->data = p->data;
p->data = data;
temp->next = p->next;
p->next = temp;
this->length++;
}
else if (No == length)
{
Node<T>* p = rear;
temp->data = data;
temp->next = p->next;
p->next = temp;
rear = temp;
this->length++;
cout << "尾指针数据2:" << this->rear->data << endl;
}
else
{
cout << "输入错误" << endl;
return;
}
}
template <class T>
bool CLinkList<T>::isEmpty()
{
if (rear->next = rear)
{
return true;
}
else
{
return false;
}
}
template <class T>
Node<T>* CLinkList<T>::getElem(int No)
{
if (No < this->length && No >= 0)
{
Node<T>* p = rear->next->next;//初始化工作指针让他指向首元结点
int j = 0;
while (No != j)
{
p = p->next;
j++;
}
return p;
}
else
{
cout << "输入有误" << endl;
return NULL;
}
}
template <class T>
void CLinkList<T>::Delete(int No)
{
Node<T>* p = this->getElem(No);
Node<T>* priorP=p;
for (int i = 0; i < this->getLength() ; i++)//利用循环的特点找到要删除的结点的前一个结点
{
priorP = priorP->next;
}
priorP->next = p->next;
delete p;
this->length--;
}
template <class T>
void CLinkList<T>::printAll()
{
Node<T>* p = rear;
for (int i = 0; i <= length; i++)
{
p = p->next;
cout << p->data << " " ;
}
cout<<endl;
}
int main()
{
CLinkList<int> CL1;
CL1.createList();
CL1.printList();
CL1.insert(1, 100);
CL1.printList();
CL1.printAll();
//CL1.Delete(3);
//CL1.printList();
system("pause");
return 0;
}
插入部分还有毛病,心情不好,回头再改。