前面介绍了单链表的一些练习题,本节介绍循环链表,顾名思义,肯定得循环起来,就是表中的最后一个结点的指针指向头结点,使整个链表形成一个环。
根据前面单链表中介绍的头插法和尾插法,稍微思考一下,就知道再循环链表中应该选择用尾插法这种方式来建立循环链表,因为尾插法每次都是在链表的末尾插入新的元素。
和原来的尾插法建立单链表只是多了一行代码,就是tail->next=head,也就是让链表循环起来。
struct LinkList *tailInsert(){
struct LinkList *head=NULL,*tmp=NULL,*tail=NULL;
int val;
while(scanf("%d",&val)){
if(val==-1) break;
tmp=(struct LinkList *)malloc(sizeof(struct LinkList));
tmp->next=NULL;
tmp->data=val;
if(head==NULL){
head=(struct LinkList *)malloc(sizeof(struct LinkList));
head->next=tmp;
tail=tmp;
}
else{
tail->next=tmp;
tail=tail->next;
}
}
tail->next=head;
return head;
}
遍历循环链表和求循环链表的长度也都和原来一样,只不过现在的循环判断条件是tmp!=head,代码如下:
int length(struct LinkList *head){
int i=0;
if(head==NULL) return i;
struct LinkList *tmp=head->next;
while(tmp!=head){
i++;
tmp=tmp->next;
}
return i;
}
void display(struct LinkList *head){
if(head==NULL) return ;
struct LinkList *tmp=head->next;
while(tmp!=head){
printf("%d ",tm