//实现循环单链表各种基本运算的算法
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LinkList;
//新建一个只含头结点的空循环链表
void InitList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->data=0;
L->next=L;
}
//采用尾插法插入数据x
void ListInsertTail(LinkList *&L,int x)
{
LinkList *p=NULL,*q=NULL;
q=(LinkList *)malloc(sizeof(LinkList));
p=L;
if(L->data==0)//只有一个空结点时
{
L->data=x;
return ;
}
while(p->next!=L)
{
p=p->next;
}
q->data=x;
q->next=L;
p->next=q;
}
//计算链表的长度
int ListLength(LinkList *L)
{
int k=1;
LinkList *p=L;
while(p->next!=L)
{
k++;
p=p->next;
}
return k;
}
//将数据x插入到循环链表的第i个位置
void ListInsert(LinkList *&L,int x,int i)
{
int j=1;
LinkList *p=NULL,*q=NULL;
if(i<1||i>ListLength(L)+1)
{
printf("插入不成功!位置选择错误...\n");
return ;
}
q=(LinkList *)malloc(sizeof(LinkList));
q->data=x;
p=L;
if(i==1)
{
while(p->next!=L)
{
p=p->next;
}
p->next=q;
q->next=L;
L=q;
return ;
}
while(j!=i-1)
{
p=p->next;
j++;
}
q->next=p->next;
p->next=q;
}
//输出链表
void DispList(LinkList *L)
{
LinkList *p=L;
while(p->next!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d\n",p->data);
}
//销毁链表
void DestroyList(LinkList *&L)
{
LinkList *p=NULL;
while(L->next!=L)
{
p=L->next;
L->next=L->next->next;
free(p);
}
free(L);
}
void main(void)
{
int x,y;
LinkList *L=NULL;
//新建一个只有一个节点的空链表
InitList(L);
//采用尾插法插入数据
printf("请输入一串整数,以 0 结束:\n");
scanf("%d",&x);
while(x!=0)
{
ListInsertTail(L,x);
scanf("%d",&x);
}
//显示链表
DispList(L);
printf("链表的长度为:%d\n",ListLength(L));
//在链表的第y个位置插入数据x
printf("请输入要插入的位置 y 以及数据 x :\n");
scanf("%d%d",&y,&x);
ListInsert(L,x,y);
printf("在链表的第%d个位置插入数据%d后,链表为:",y,x);
DispList(L);
//销毁链表
DestroyList(L);
}