今天被老师拉去做“苦力”没有学多少。。。惭愧
接第二弹
循环链表
与单链表区别在于尾结点的指针不是NULL,而是指向head
算法没什么大的区别,注意尾结点p2->next=NULL改为p2->next=head;
遍历时,p1->next!=NULL改为p1->next!=head;
- 循环链表的创建算法
#include <malloc.h>
tyepdef struct node
{
int num;
struct node *next;
}stud;
stud *create(int n)
{
stud *head,*p1,*p2;
head=p1=p2=NULL;
for(int i=0;i<n;i++)
{
p1=(stud *)malloc(sizeof(stud));
p1->num=i;
if(i==0)
head=p1;
else
p2->next=p1;
p2=p1;
}
p2->next=head;//!!!!!!!
return head;
}
- 循环链表的查找算法
stud *find(stud *head,int i)
{
stud *p1;
p1=head;
while(p1!=NULL)
{
if(p1->num==i)
{
break;
}
else
{
p1=p1->next;
if(p1==head)//!!!!!!!
{
p1=NULL;
}
}
}
return p1;
}
- 循环链表的删除算法
bool del(stud *head ,int i)
{
bool consq=false;
if(head)
{
stud *p1,*p2;
p1=head;
while(p1->num!=i&&p1->next!=head)//!!!
{
p2=p1;
p1=p1->next;
}
if(p1->num==i)
{
if(p1==head)//!!!!
{
head=p1->next;
}
else
{
p2->next=p1->next;
}
free(p1);//!!!!
consq=true;
}
}
return consq
}
都是不考虑重复元素的,碰到重复的情况,算法需要进行调整。目前想法是碰到一个删除一个,直到遍历完成,而不是这里的先遍历,一旦碰到符合条件的就停止进行处理。还需考虑有序无序。
- 循环链表的插入算法
stud *insert(stud *head,stud *p)
{
if(!head)
{
head=p;
p->next=head; //!!!!!
}
else
{
stud *p1,*p2;
p1=head;
while(p->num >p1->num && p1->next!=head)
{
p2=p1;
p1=p1->next;
}
if(p->num<=p1->num)
{
if(p1==head)
{
head=p;
p->next=head;//书上没加,我觉得应该加一个
}
else
{
p2->next=p;
p->next=p1;
}
}
else //注意点!单链表我没加,略微不同,我觉得单链表那书上也写这个有点多余
{
p1->next=p;
p->next=head;
}
}
}
双向链表
待续。。。