#include <iostream>
using namespace std;
/***----------单链表--------***/
/***---有头节点,无尾指针---***/
/***----------尾插法--------***/
/***------head为头结点,元素从head.next开始----***/
/***或许可以把head的data里面存上length更美观***/
/***功能简单,有错请指正***/
template<typename T>
class LinkList
{
public:
typedef struct Node
{
T data;
struct Node *next;
}Node;
LinkList()
{
Head=new Node; /***Head始终存在***/
Head->next=NULL; /***初始状态:0,NULL***/
Length=0;
}
bool InitList()
{
LinkList();
}
bool ListEmpty()
{
if (Length==0&&Head->next==NULL)/***是否为初始状态***/
{
return true;
}
else
return false;
}
void ClearList()
{
if (ListEmpty())
{
return;
}
Node *p=new Node;
Node *q=new Node;
p=Head;
q=p->next; /***q始终指向p下一元素***/
while(q->next!=NULL) /***p的next及q是否为尾元素***/
{
p->next=NULL; /***本来想在这里使head=NULL,发现不行,不知道为什么***/
free(p); /***释放p指向的空间,但指针变量p中还有地址值,所以可以p=q***/
p=q; /***p指向删除前元素的下一元素***/
q=q->next; /***q也后移***/
}
free(p);p=NULL; /***释放p指向空间,释放指针p***/
free(q);q=NULL;
Head->next=NULL; /***头指针为空***/
Length=0;
}
/***用e获得第i(1,2,...)个元素值***/
bool GetElem(int i,T *e)
{
if (i>Length||i<1)
{
return false;
}
Node *p=new Node;
p=Head->next; /***p指向第一个元素***/
int j=1;
for(;j<i;j++)
{
p=p->next;
}
*e=p->data;
}
/***返回0为list中不存在e***/
int LocateElem(T e)
{
Node *p=new Node;
p=Head;
int j=0;
while(p->next!=NULL&&p->data!=e)/***p在尾元素之前找到值e***/
{
p=p->next;
j++;
}
if (j==Length&&p->data!=e)/***p到达末尾仍未找到***/
{
return 0;
}
return j;/***返回第j个***/
}
/***第i(1,2,3...)个后方插入元素e***/
bool InsertList(int i,T e)
{
if (i>Length||i<0)
{
return false;
}
if (Head->next==NULL&&i==0)/***空表插入***/
{
Node *tem=new Node;
tem->data=e;
Head->next=tem; /***第一个元素***/
tem->next=NULL;
Length++;
}
else if (i==Length&&Length!=0)/***末尾插入***/
{
Node *p=new Node;
p=Head->next;
while(p->next!=NULL)
{
p=p->next;
}
Node *tem=new Node;
tem->data=e;
p->next=tem; /***末尾插入***/
tem->next=NULL;
Length++;
}
else /***正常情况***/
{
int j=1;
Node *p=new Node;
p=Head->next;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
Node * tem=new Node;
tem->data=e;
tem->next=p->next;
p->next=tem;
Length++;
}
return true;
}
bool ListDelete(int i,T *e)
{
if (i>Length)
{
return false;
}
int j=0;
Node *p=new Node;
p=Head;
while(j<i-1) /***p指向被删元素前一元素***/
{
p=p->next;
j++;
}
Node *pnext=new Node;
pnext=p->next;
*e=pnext->data;
p->next=p->next->next; /***删除指向关系***/
free(pnext);
return true;
}
int ListLength()
{
return Length;
}
void DisplayList()
{
if (ListEmpty())
{
cout<<"Empty List"<<endl;
return;
}
Node *p=Head->next;
int i=0;
while(p!=NULL&&i<Length)
{
i++;
cout<<"The "<<i<<" element "<<p->data<<endl;
p=p->next;
}
}
private:
Node *Head;
int Length;
};
int main()
{
LinkList<int> MyList;
for (int i=0;i<10;i++)
{
MyList.InsertList(i,i+1);
}
/***第10个元素后插入新元素11***/
MyList.InsertList(10,11);
MyList.DisplayList();
int e=0;
MyList.GetElem(5,&e);
cout<<"GetElem(5) "<<e<<endl;
int k=MyList.LocateElem(11);
cout<<"LocateElem(11)"<<k<<endl;
/***删除第X个元素***/
int m=0;
MyList.ListDelete(10,&m);
cout<<"ListDelete(10) "<<m<<endl;
MyList.DisplayList();
MyList.ClearList();
MyList.DisplayList();
return 0;
}