鱼C论坛

 找回密码
 立即注册
查看: 4584|回复: 6

C语言链表问题

[复制链接]
发表于 2012-12-9 17:20:06 | 显示全部楼层 |阅读模式
1鱼币
#include "stdio.h"
#include "malloc.h"
struct str
{
    int data;  
    struct str *next;  
};
void main()
{
    struct str *p,*r,*list=NULL;
int n=5;
    int val;
    for(int i=1;i<=n;i++)
{
        scanf("%d",&val);
        p=(struct str*)malloc(sizeof(struct str));
        p->data=val;;
        p->next=NULL;
        if(!list)
            list=p;
        else
            r->next=p;
            r=p;
    }
   for(;NULL!=list->next;list=list->next)
   {
   printf("%d\n",list->data);
   }
free(p);
}

这下面代码是什么意思 我看不懂
   if(!list)
            list=p;
        else
            r->next=p;
            r=p;



最佳答案

查看完整内容

希望对你有帮助{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-9 17:20:07 | 显示全部楼层
  1. #include "stdio.h"
  2. #include "malloc.h"
  3. struct str
  4. {
  5.     int data;  
  6.     struct str *next;  
  7. };//结构体的声明
  8. void main()
  9. {
  10.     struct str *p,*r,*list=NULL;//结构体变量和指针的声明,这里的指针list=NULL值为0
  11. int n=5;
  12.     int val;
  13.     for(int i=1;i<=n;i++)
  14. {
  15.         scanf("%d",&val);

  16.         p=(struct str*)malloc(sizeof(struct str));
  17.         p->data=val;;
  18.         p->next=NULL;
  19.         if(!list)//如果链表头list是为空
  20.             list=p;//那么执行list=p,保存第1个节点的地址
  21.         else//如果链表头list已经存在
  22.                 //第一次执行的过程的说明如下:
  23.                 {r->next=p;}//第一次执行这句的时候,r已经被赋予链表头地址了,r->next表示链表头里的next
  24.             r=p;//这句不属于判断语句,第一次运行这句时,链表头地址赋予r。
  25.                 //一直循环下去,就生成了一个单链表
  26.     }
  27.    for(;NULL!=list;list=list->next)//这句要改,原先无法显示最后的节点data值,因为最后节点上next为NULL,但是data有值
  28.    {
  29.            printf("%d\n",list->data);
  30.    }

  31. //用循环删除节点
  32.    while(NULL!=list)//循环至list为空
  33.    {
  34.                 r=list->next;//将链表内的next地址赋予r;
  35.                 free(list);//释放节点list
  36.                 list=r;//将下一个节点地址赋值给list
  37.    }

  38. }
复制代码
希望对你有帮助{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-9 18:13:25 | 显示全部楼层
我也是个初学者,说说自己的观点参考参考。判断是不是头指针第一个元素啊,如果为NULL的话就初始化list的值,如果不是说明已经建立好了链表,else后面的就是开始接着链下去。欢迎大家指正
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-9 18:24:49 | 显示全部楼层
本帖最后由 /yhhEAST/zhh 于 2012-12-9 18:26 编辑
  1. if(!list)
  2.              list=p; //如果链表为空 那么 将p作为表头
  3.          else
  4.              r->next=p;
  5.              r=p; //如果链表不为空那么 将p做为链表 的最后一个节点 /*总体作用  将元素 组成链表*/
复制代码
节点 就是struct str
{
     int data;  
     struct str *next;  
};
带不了 链表中的一个元素

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-9 19:57:36 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-9 20:45:11 | 显示全部楼层
贱人一个 发表于 2012-12-9 19:57

r->next=p;  这句是什么意思
  1. if(!list)
  2.              list=p; //如果链表为空 那么 将p作为表头

  3.          else

  4.              r->next=p;//如果链表不空 r的下一个 指向p

  5.              r=p; //将p赋给r
复制代码
链表不空 即链表已经初始化完成此事r是表尾节点   p要进入链表先将链表 表尾节点 即r的next指向p 即 r->next=p 在将p赋给r 使r永远是链表 的表尾节点
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-9 22:15:54 | 显示全部楼层
消失在黑暗中 发表于 2012-12-9 17:20
希望对你有帮助

后面的链表list已经被改了,for(;NULL!=list;list=list->next),不能作为链表头了,不能这么删除链表,还要改的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表