一、两种循环链表的比较
1、头指针表示的循环链表:
(1)找a1的时间复杂度为O(1);
(2)找an的时间复杂度为O(n);
所以面对时常在首尾进行的表的操作时不方便;
2、尾指针表示的循环链表:
(1)a1的存储地址:R->next->next;
(2)an的存储位置:R;
时间复杂度均为O(1);
二、相关函数
1、尾插法建立尾指针循环链表
void creat_list_w(Linklist **L,int n)
{
*L=(Linklist*)malloc(sizeof(Linklist));
(*L)->next=*L;
Linklist *p;
int i;
for(i=0;i<n;i++)
{
p=(Linklist*)malloc(sizeof(Linklist));
scanf("%s%s%lf",p->date.isbn,p->date.name,p->date.price);
p->next=(*L)->next;
(*L)->next=p;
(*L)=p;
}
}
2、头插法建立尾指针循环链表
void creat_list_t(Linklist **L,int n)
{
*L=(Linklist*)malloc(sizeof(Linklist));
(*L)->next=*L;
Linklist *p,*q;
q=(Linklist*)malloc(sizeof(Linklist));
scanf("%s%s%lf",q->date.isbn,q->date.name,q->date.price);
q->next=(*L)->next;
(*L)->next=q;
(*L)=q;
int i;
for(i=1;i<n;i++)
{
Linklist *p;
p=(Linklist*)malloc(sizeof(Linklist));
scanf("%s%s%lf",p->date.isbn,p->date.name,p->date.price);
p->next=((*L)->next)->next;
((*L)->next)->next=p;
}
}
3、插入节点
bool insert_elem(Linklist **L,int i,BOOK e)
{
if(i<1||(*L)->next!=*L)
{
return false;
}
Linklist *p;
p=((*L)->next)->next;
int j=0;
while(p!=(*L)->next&&j!=i-1)
{
j++;
p=p->next;
}
if(p==(*L)->next||j<i-1)
{
return false;
}
if(j==i-1&&p!=(*L)->next)
{
Linklist *r;
r=(Linklist*)malloc(sizeof(Linklist));
r->date=e;
r->next=p->next;
p->next=r;
}
if(j==i-1&&p==(*L)->next)
{
Linklist *q;
q=(Linklist*)malloc(sizeof(Linklist));
q->date=e;
p->next=q;
q->next=(*L)->next;
*L=q;
}
}