鱼C论坛

 找回密码
 立即注册
查看: 6700|回复: 10

[已解决]链表可以没有名字?

[复制链接]
发表于 2015-6-9 22:43:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
RT,程序来自鱼哥的教学视频,按我的理解,链表在内存中就是一段数据,在这个程序中没有用到每个结构体的结构体名,而是用指针交叉地定义赋值,最后也是用的指针来读取的,我理解是指针就是一个地址数据,就是说可以靠对地址的读取来定义和读取链表?
另外,链表其实就是一种结构体?我的理解不错吧?
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>

  4. #define LEN sizeof(struct student)                //student结构的大小

  5. struct student
  6. {
  7.         int num;
  8.         float score;
  9.         struct student *next;
  10. };

  11. struct student *creatic();                        //创建链表
  12. void print(struct student *head);           //打印链表, 可以为 void print()

  13. int n;

  14. int main()
  15. {
  16.         struct student *stu;

  17.         stu = creatic();
  18.         print(stu);

  19.         printf("\n\n");
  20.         system("pause");

  21.         return 0;
  22. }

  23. struct student *creatic()
  24. {
  25.         struct student *head;
  26.         struct student *p1, *p2;

  27.         p1 = p2 = (struct student *)malloc(LEN);                //LEN是student结构的大小

  28.         printf("Please enter the num:        ");
  29.         scanf("%d", &p1->num);
  30.         printf("Please enter the score:        ");
  31.         scanf("%f", &p1->score);

  32.         head = NULL;
  33.         n = 0;

  34.         while(p1->num)                                //即:while(p1-> num != 0)
  35.         {
  36.                 n++;
  37.                 if(1 == n)
  38.                 {
  39.                         head = p1;
  40.                 }
  41.                 else
  42.                 {
  43.                         p2->next = p1;
  44.                 }

  45.                 p2 = p1;
  46.                 p1 = (struct student *)malloc(LEN);

  47.                 printf("\nPlease enter the num:        ");
  48.                 scanf("%d", &p1->num);
  49.                 if(!p1->num)
  50.         {
  51.             break;
  52.         }
  53.                 printf("Please enter the score:        ");
  54.                 scanf("%f", &p1->score);
  55.         }

  56.         p2->next = NULL;

  57.         return head;
  58. }

  59. void print(struct student *head)
  60. {
  61.         struct student *p;
  62.         printf("\nThere are %d records!\n\n", n);

  63.         p = head;
  64.         if(head)                                // NULL != head;
  65.         {
  66.                 do
  67.                 {
  68.                         printf("The student whose number is %d score is :%f\n", p->num, p->score);
  69.                         p = p->next;
  70.                 }while(p);                        //NULL != p;
  71.         }
  72. }
复制代码
最佳答案
2015-6-19 14:11:04
你的理解没错。其实任何变量都是保存在内存中的,都可以通过地址来访问它。

对于有名字的变量,是编译器在管理它的生存周期,所以编译器可以将a,b,c这些变量名在编译时转换为对应的地址。

对于无名变量,就像你这里的链表malloc后,天晓得你什么时候free它,这时,编译器就不可能再管理它的生命周期,就要靠你来管理它的生命周期(就是说你应该在合适的时候free它)。所以编译器就没有必要给这类变量起名字。。。所以你一般就只能自己通过地址来访问它们。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-10 11:27:36 | 显示全部楼层
我只是来打酱油的。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-10 16:43:05 | 显示全部楼层
w120699 发表于 2015-6-10 11:27
我只是来打酱油的。。。

请,附送一罐老干妈。八百年,老干妈,好品质
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-11 21:40:49 | 显示全部楼层
虽然代码和中文我都看得懂,但是不理解你要表达什么?
建议你去百度“函数指针和指针函数”的区别~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-12 19:55:48 | 显示全部楼层
~风介~ 发表于 2015-6-11 21:40
虽然代码和中文我都看得懂,但是不理解你要表达什么?
建议你去百度“函数指针和指针函数”的区 ...

谢谢,不过函数指针和指针函数这个我还是能理解的,但我想问的是链表,就我的理解其实就是分配了一段存储空间然后确定好指向该段存储空间的指针,这样,只要读取这个指针就能够指向这个存储空间而不必为每个存储空间命名。不知我这样想是否正确。谁能召唤一下鱼哥,毕竟我是从他的教程视频上学的链表。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-12 20:02:58 | 显示全部楼层
焚琴煮鹤 发表于 2015-6-12 19:55
谢谢,不过函数指针和指针函数这个我还是能理解的,但我想问的是链表,就我的理解其实就是分配了一段存储 ...

@小甲鱼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-14 11:00:09 | 显示全部楼层
@小甲鱼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-15 16:55:37 | 显示全部楼层
小甲鱼云游去了,不知什么时才回来!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-15 21:05:53 | 显示全部楼层
怡静 发表于 2015-6-15 16:55
小甲鱼云游去了,不知什么时才回来!

鱼哥是汕头的吗?我也是汕头的,如果可以很想见见他呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-19 14:11:04 | 显示全部楼层    本楼为最佳答案   
你的理解没错。其实任何变量都是保存在内存中的,都可以通过地址来访问它。

对于有名字的变量,是编译器在管理它的生存周期,所以编译器可以将a,b,c这些变量名在编译时转换为对应的地址。

对于无名变量,就像你这里的链表malloc后,天晓得你什么时候free它,这时,编译器就不可能再管理它的生命周期,就要靠你来管理它的生命周期(就是说你应该在合适的时候free它)。所以编译器就没有必要给这类变量起名字。。。所以你一般就只能自己通过地址来访问它们。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-6-19 20:03:45 | 显示全部楼层
仰望天上的光 发表于 2015-6-19 14:11
你的理解没错。其实任何变量都是保存在内存中的,都可以通过地址来访问它。

对于有名字的变量,是编译器 ...

谢谢,解释的很清晰
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 14:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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