循环链表是另一种形式的链式存储结构,特点就是链表的为节点指向头结点,从而形成一个环,所以从链表的任意一个节点出发都可以访问整个链表
而不像单链表那样必须从头结点开始.
循环链表的操作和单链表类似.差别就是算法之中的结束条件不是 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;
}