单向循环链表,与单向链表相比,链表建立时,增加了个尾指针,指向头指针,从而使整个链表循环。
注意:每次开辟新节点后,都要连接好头指针与尾指针。
这里删除节点与单向链表无大异。
#include<stdio.h>
#include<stdlib.h>
int len;
typedef struct Data
{ int node;
struct Data*next;
} data,*pdata;
pdata creat()
{
pdata head=(pdata)malloc(sizeof(data)); //初始化头结点 ,这里头节点不存储数据
pdata tail=head,pnew=NULL; //初始化尾节点
int i;
printf("输入此循环链表的长度:");
scanf("%d",&len);
for(i=0;i<len;i++)
{
pnew=(pdata)malloc(sizeof(data)); //开辟新节点 ,存储数据。
printf("输入第%d个元素的值:", i+1);
scanf("%d",&(pnew->node));
pnew->next=head; //新节点的指针域始终指向头结点
tail->next=pnew; //连接尾节点与新节点
tail=pnew; //使尾指针指向新建立的节点
}
return head; //返回头指针
}
void delele(pdata p,int w)//删除节点的函数
{
int i;
pdata head=p;
pdata plast=NULL,pnext=NULL,p1=p;
for(i=1;p->next!=head;i++)//遍历一遍链表,删除节点存储的数据比较需要
{
plast=p;
if(i==w)
{
p1=p->next;
pnext=p1->next;
free(p1);
plast->next=pnext;
}
p=p->next;
}
p=p->next;
}
void print(pdata p)
{
pdata p1=p->next; //p1指向头节点后的第一个有存放数据的节点
while(p1!=p) //p1遍历完链表后,指向头指针,循环链表结束
{
printf("%d ",p1->node);
p1=p1->next;
}
printf("\n");
}
int main()
{
int i=0;
pdata p;
p=creat();
print(p);
printf("输入要删除的节点:");
scanf("%d",&i);
delele(p,i);
print(p);
return 0;
}