这是正确的代码,给下次问同样问题的同学一个参考吧,感谢版主的帮助
#include<iostream>
using namespace std;
template<class T>
struct Node//循环链表的结点结构体
{
T data;
Node<T>*next;
};
template<class T>
class list
{
public:
list();
list(T a[],int n);//建立链表
~list();
int Length(){return length;}
Node<T>*Index(int i);//按位查找,返回i结点指
void Delete();//删除操作
void print();//遍历操作
private:
Node<T>*first;//建立头结点
int length;//表的长度
};
template<class T>//创建一个空表
list<T>::list()
{
first=new Node<T>;
first->next=first;
length=0;
}
template<class T>
list<T>::list(T a[],int n)
{
Node<T>*s,*r;
first=new Node<T>;//生成头结点,这一步必不可少,通用的
r=first;//r也指向头指针,尾指针初始化
for(int i=0;i!=n;++i)
{
//每个数组建立一个结点,赋值
s=new Node<T>;
s->data=a[i];
r->next=s;//将每个节点链在一起
r=s;
}
r->next=first;//尾部结点与头结点相连
length=n;
}
template<class T>
list<T>::~list()//析构函数将循环链表的所有节点的存储空间释放
{
Node<T>*q;
while(!length)
{
q=first;
first=first->next;
delete q;
}
cout<<"链表已经删除"<<endl;
}
template<class T>
Node<T> *list<T>::Index(int i)//按位查找的方法
{
Node<T> *p;
p=first->next;
if(i<0||i>length)
{
cout<<"位置"<<i<<"不对"<<endl;
exit(1);
}
if(i==0)
return first;
for(int j=1;j<i;++j)
p=p->next;
return p;
}
template<class T>
void list<T>::Delete()
{
Node<T>*q,*p,*s,*t;
t=new Node<T>;
s=new Node<T>;
p=first->next;
while(p!=first)
{ s=t=p;
q=p->next;
while(q!=first)
{
if(p->data==q->data)
{
t->next=q->next;
length--;
}
else t=q;
q=q->next;
}
p=p->next;
}
}//
template<class T>
void list<T>::print()//遍历操作
{
Node<T>*p;
p=first->next;
while(p!=first)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
}
void main()
{
int a[]={1,2,6,5,3,4,6,3,5,4,2,3,1,2,4};
list<int>mylist(a,15);
mylist.print();
cout<<"输出链表的长度"<<mylist.Length()<<endl;
mylist.Delete();
mylist.print();
cout<<"链表的长度"<<mylist.Length()<<endl;
}
#include<iostream>
using namespace std;
template<class T>
struct Node//循环链表的结点结构体
{
T data;
Node<T>*next;
};
template<class T>
class list
{
public:
list();
list(T a[],int n);//建立链表
~list();
int Length(){return length;}
Node<T>*Index(int i);//按位查找,返回i结点指
void Delete();//删除操作
void print();//遍历操作
private:
Node<T>*first;//建立头结点
int length;//表的长度
};
template<class T>//创建一个空表
list<T>::list()
{
first=new Node<T>;
first->next=first;
length=0;
}
template<class T>
list<T>::list(T a[],int n)
{
Node<T>*s,*r;
first=new Node<T>;//生成头结点,这一步必不可少,通用的
r=first;//r也指向头指针,尾指针初始化
for(int i=0;i!=n;++i)
{
//每个数组建立一个结点,赋值
s=new Node<T>;
s->data=a[i];
r->next=s;//将每个节点链在一起
r=s;
}
r->next=first;//尾部结点与头结点相连
length=n;
}
template<class T>
list<T>::~list()//析构函数将循环链表的所有节点的存储空间释放
{
Node<T>*q;
while(!length)
{
q=first;
first=first->next;
delete q;
}
cout<<"链表已经删除"<<endl;
}
template<class T>
Node<T> *list<T>::Index(int i)//按位查找的方法
{
Node<T> *p;
p=first->next;
if(i<0||i>length)
{
cout<<"位置"<<i<<"不对"<<endl;
exit(1);
}
if(i==0)
return first;
for(int j=1;j<i;++j)
p=p->next;
return p;
}
template<class T>
void list<T>::Delete()
{
Node<T>*q,*p,*s,*t;
t=new Node<T>;
s=new Node<T>;
p=first->next;
while(p!=first)
{ s=t=p;
q=p->next;
while(q!=first)
{
if(p->data==q->data)
{
t->next=q->next;
length--;
}
else t=q;
q=q->next;
}
p=p->next;
}
}//
template<class T>
void list<T>::print()//遍历操作
{
Node<T>*p;
p=first->next;
while(p!=first)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
}
void main()
{
int a[]={1,2,6,5,3,4,6,3,5,4,2,3,1,2,4};
list<int>mylist(a,15);
mylist.print();
cout<<"输出链表的长度"<<mylist.Length()<<endl;
mylist.Delete();
mylist.print();
cout<<"链表的长度"<<mylist.Length()<<endl;
}