循环链表是另一种形式的链式存储结构,特点就是链表的为节点指向头结点,从而形成一个环,所以从链表的任意一个节点出发都可以访问整个链表
而不像单链表那样必须从头结点开始.
循环链表的操作和单链表类似.差别就是算法之中的结束条件不是 head->next == NULL;
而是 head == head->next.当然了循环链表的表示形式有两种:带有头指针和带有为指针
如下图所示:
循环链表的操作和单链表差别不大(除了删除和清空),所以下面的代码就没有太多的操作:
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; } *linklist,list; void InitList(linklist head); void CreatList(linklist head); void DeleteList(linklist head,int number); void PrintList(linklist head); void DestroyList(linklist head); void InitList(linklist head) { head->next = head; } void CreatList(linklist head) { linklist tmp,p; int number; tmp = head; while(scanf("%d",&number) != EOF) { p = (linklist)malloc(sizeof(list)); p->data = number; p->next = tmp->next;tmp->next = p; tmp = tmp->next; } } void PrintList(linklist head) { linklist p = head->next; if(p == head) { printf("this is an empty list.\n"); return ; } while(p != head) { printf("%d ",p->data); p = p->next; } printf("\n"); } void DeleteList(linklist head,int number) { linklist p = head->next,q = head; if(head == head->next) { printf("this is an empty list.\n"); exit(1); } while(p!=head) { if(p->data == number)break; p = p->next; q = q->next; } if(p == head){printf("this number does not exist.\n");exit(1);} if(p->next == head && q == head){free(p);head->next = head;} else { q->next = p->next; free(p); } } void DestroyList(linklist head) { linklist p = head->next; linklist q = p; while(p!=head) { q = p->next; free(p); p = q; } free(head); head = NULL; } int main() { linklist head; int number; head = (linklist)malloc(sizeof(list)); InitList(head); CreatList(head); PrintList(head); printf("input the number you want to delete.\n"); scanf("%d",&number); DeleteList(head,number); PrintList(head); DestroyList(head); return 0; }