线性链表和单循环链表

来源:互联网 发布:率土之滨魅族端口 编辑:程序博客网 时间:2024/05/21 22:43
template<class T>class linklist;
template<class T> class listnode
{
public:
friend class linklist<T>;/*友元类*/
private:
T data;
listnode<T>* next;
};
template<class T> class linklist
{
public:
linklist(){ head=NULL;}
~linklist(){}
void insertf();
void insertr();
void insert();
bool isempty(){ head==NULL;}
int linklength();
int localdata(T x);
bool getdata(int i, T &x);
void insertnode(int i, T x);
void deletenode(int i,T &x);
void printlist();
private:
listnode<T>*head;
};
/*头插法建立链表*/
template<class T> void linklist::insertf()
{
listnode<T>*p=head,*s;
T ch;
getchar();
while(ch!='\n'){
s=new listnode<T>;
s->data=ch;
s->next=p;
p=s;
ch=getchar();
}
head=p;
}
/*尾插法建立链表*/
template<class T> void linklist::insertr()
{  


listnode<T>*s,*rear=NULL;
T ch;
ch=getchar();
while(ch!='\n')
{
s=new listnode<T>;
s->data=ch;
if(head==NULL) head=s;
else
rear->next=s;
rear=s;
ch=getchar();
}
rear->next=NULL;
}
/*带头结点创建链表*/
template<class T> void linklist::insert()

listnode<T>*s,*rear=NULL;
T ch;
ch=getchar();
head=new listnode<T>;
rear=head;
while(ch!='\n')
{
s=new listnode<T>;
s->data=ch;
rear->next=s;
rear=s;
ch=getchar();
}
rear->next=NULL;
}
/*列表长度*/
template<class T> int linklist::linklength()
{
listnode<T>*p=head->next;
int length=0;
if(head==NULL)
return 0;
while(p!=NULL)
{length++;
p=p->next;}
return length;
}
/*获取值为x的结点在链表中的位置*/
template<class T> int linklist::localdata(T x)
{
listnode<T>*p=head->next;
int num=0;
while(p&&p->data!=x)

num++;
p=p->next;
}
if(p)
return num;
else return -1;
}
/*获取第i个结点的值并将其存到x 中*/
template<class T> bool linklist::getdata(int i, T &x)
{
listnode<T>*p=head->next;
int k=1;
while(p&&k<i)
{p=p->next;
k++;}
if(p&&k==i)
{
x=p->data;
return true;
}
else
return false;
}
/*在第i个结点后插入新结点*/
template<class T> void linklist::insertnode(int i, T x)
{
if(i<0||i>length){
cout<<"无效位置"<<endl;
return;}
listnode<T>*p=head, *s;
for(int j=0;j<i;j++)
p=p->next;
s=new listnode<T>;
s->data=x;
s->next=p->next;
p->next=s;
}
/*删除第i个结点,并把值存到x中*/
template<class T> void linklist::deletenode(int i,T &x)
{
if(i<0||i>length){
cout<<"无效位置"<<endl;
return;}
listnode<T>*p=head, *s;
s=p;
for(int j=0;j<i;j++)
{ s=p;
p=p->next;
}
x=p->data;
s->next=p->next;
delete p;
}
/*列表输出*/
template<class T> void linklist:: printlist()
{
listnode<T>*p=head->next;
while(p)
{
cout<<p->data<<" "<<;
p=p->next;
}
cout<<endl;

}

单循环链表的结点类型与单链表完全相同,在操作上也与单链表基本一致,差别仅在于算法中循环的结束判断条件不在是p或者p->next是否为空,而是它们是否等于头指针。

在用头指针表示的单循环链表中,查找任何结点都必须从开始结点查起,而在实际应用中,表的操作常常会在表尾或表头进行,此时若用尾指针表示单循环链表,可使某些操作简单化。

0 0
原创粉丝点击