链表 3之单向循环链表

     单向循环链表,与单向链表相比,链表建立时,增加了个尾指针,指向头指针,从而使整个链表循环。

注意:每次开辟新节点后,都要连接好头指针与尾指针。

这里删除节点与单向链表无大异。

#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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值