单向循环链表C语言实现

http://blog.csdn.net/morixinguan/article/details/51771633

我们都知道,单向链表最后指向为NULL,也就是为空,那单向循环链表就是不指向为NULL了,指向头节点,所以下面这个程序运行结果就是,你将会看到遍历链表的时候就是一个死循环,因为它不指向为NULL,也是周而复始的执行。串成了一个环型。

     

[cpp]  view plain  copy
 print ?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. typedef struct node  
  4. {  
  5.     char name[20];  
  6.     struct node *link;  
  7. }student;  
  8.   
  9. student * creat(int n)    /*建立单链表的函数,形参n为人数*/  
  10. {  
  11.     /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/  
  12.     student *p,*h,*s;       
  13.     int i;  
  14.     if((h=(student *)malloc(sizeof(student)))==NULL) /*分配空间并检测*/  
  15.     {  
  16.         printf("不能分配内存空间!");  
  17.         exit(0);  
  18.     }  
  19.     h->name[0]='\0';     /*把表头结点的数据域置空*/  
  20.     h->link=NULL;        /*把表头结点的链域置空*/  
  21.     p=h;                /*p指向表头结点*/  
  22.     for(i=0;i<n;i++)  
  23.     {  
  24.         if((s= (student *) malloc(sizeof(student)))==NULL) /*分配新存储空间并检测*/  
  25.         {  
  26.             printf("不能分配内存空间!");  
  27.             exit(0);  
  28.         }  
  29.         p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/  
  30.         printf("请输入第%d个人的姓名",i+1);  
  31.         //指向结构体中的数据   
  32.         scanf("%s",s->name);  
  33.         s->link=NULL;  
  34.         p=s;  
  35.     }  
  36.     //如果是单向链表,这里为NULL,环形链表需要指向保存表头节点的指针。   
  37.     p->link=h;   
  38.     return(h);  
  39. }  
  40.   
  41. int main(void)  
  42. {  
  43.     int number;   
  44.     student *head; /*head是保存单链表头结点地址的指针*/  
  45.     student *p;  
  46.     printf("请输入相应的人数:\n");  
  47.     scanf("%d",&number);  
  48.     head=creat(number); /*把所新建的单链表头地址赋给head*/  
  49.     p=head;  
  50.     while(p->link)  
  51.     {  
  52.         printf("%s\n",p->name);  
  53.         p=p->link;  
  54.     }  
  55.   
  56.     return 0 ;  
  57. }  
运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值