鱼C论坛

 找回密码
 立即注册
查看: 2895|回复: 13

[已解决]新建链表并填充数据的问题

[复制链接]
发表于 2018-2-18 15:04:48 | 显示全部楼层 |阅读模式

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

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

x
我想新建立一个链表并在里面添加数字输出,但是总是崩溃,求高手给指点以下那里错了麻烦。
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. struct Day
  4. {
  5.                 int number;
  6.                 struct Day *next;
  7. };

  8. void addnumber(struct Day **my);
  9. void my_scanf(struct Day *may);
  10. void my_print(struct Day *my);


  11. int main(void)
  12. {
  13.                 int i;
  14.                 struct Day *my; //创建一个头节点
  15.                 /*my->next = NULL;  //清空头节点中的信息域*/

  16.                 for(i = 0; i < 2; i++)
  17.                 {
  18.                                 addnumber(&my);
  19.                 }


  20.                 my_print(my);

  21.                
  22.                 return 0;
  23. }
  24. void addnumber(struct Day **my)
  25. {
  26.                 struct Day *may; //创建一个首节点
  27.                 struct Day *temp; //创建一个临时节点

  28.                 may = (struct Day *)malloc(sizeof(struct Day));

  29.                 if(may == NULL)
  30.                 {
  31.                                 printf("内存分配失败!\n");
  32.                                 exit(1);
  33.                 }

  34.                 my_scanf(may);


  35.                 if(*my != NULL)
  36.                 {
  37.                                 temp = *my;
  38.                                 *my = may;
  39.                                 may->next = temp;
  40.                 }
  41.                 else
  42.                 {
  43.                                 *my = may;
  44.                                 may->next = NULL;
  45.                 }
  46.                
  47. }

  48. void my_scanf(struct Day *may)
  49. {
  50.                 printf("请输入一个数字");
  51.                 scanf("%d", may->number);
  52. }

  53. void my_print(struct Day *my)
  54. {
  55.                 while (my != NULL)
  56.                 {
  57.                                 printf("%d", my->number);
  58.                                 my = my->next;
  59.                 }
  60. }
复制代码
最佳答案
2018-2-18 19:58:00
  1. 1>------ 已启动全部重新生成: 项目: tmp, 配置: Debug Win32 ------
  2. 1>main.c
  3. 1>c:\visualstudioprojects\tmp\tmp\main.c(54): warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数,但可变参数 1 拥有了类型“int”
  4. 1>c:\visualstudioprojects\tmp\tmp\main.c(54): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  5. 1>c:\program files (x86)\windows kits\10\include\10.0.15063.0\ucrt\stdio.h(1272): note: 参见“scanf”的声明
  6. 1>c:\visualstudioprojects\tmp\tmp\main.c(66): warning C4477: “printf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“Kong *”
  7. 1>tmp.vcxproj -> C:\VisualStudioProjects\tmp\Debug\tmp.exe
  8. 1>已完成生成项目“tmp.vcxproj”的操作。
  9. ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
复制代码



c:\visualstudioprojects\tmp\tmp\main.c(54): warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数,但可变参数 1 拥有了类型“int”

我相信你的编译器也一定有这个警告
54行 scanf 有一个 %d,这个 %d 需要一个 int 指针的参数,但现在这个参数不是int指针,而是int类型

  1. #include<stdio.h>

  2. struct Test
  3. {
  4.         int num;
  5.         char str[10];
  6. };

  7. int main(void)
  8. {
  9.         struct Test test = {0};
  10.         struct Test *p = &test;

  11.         scanf("%d", &test.num);
  12.         scanf("%d", &p->num);

  13.         return 0;
  14. }
复制代码


多留意警告,编译器不会平白无故报警告
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-18 17:10:08 | 显示全部楼层
来个人回答一下问题阿
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 17:59:00 | 显示全部楼层
1.

  1. typedef struct Day   // 我觉得这里用tyepedef会更方便~
  2. {
  3.     int number;
  4.     struct Day *next;
  5.    
  6. }DAY, *PDAY;   
复制代码


2.
  1.                 for(i = 0; i < 2; i++)
  2.                 {                                               
  3.                     addnumber(&my);   // 这里执行两次是什么意思?
  4.                                                                         //  发送两次头结点的地址?
  5.                                                                         //  那么你的两个地址都是挂到头结点上?                                          
  6.                 }
复制代码


3.

  1. may = (PDAY)malloc(sizeof(DAY)); // 按照我的理解, 这个才应该是头结点
复制代码

然后生成后一个结点应该挂到这个后面,而不是在main函数里面发送两次



其他的待会回家了再发。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 18:09:41 | 显示全部楼层

这个是我注解我自己认为写的更详细的一个,还麻烦您给看看看那里错了,麻烦了,实在是不知道错误出在那里了,但是就是不能执行,快崩溃了。
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. //创建一个节点类型
  4. typedef struct Kong
  5. {
  6.                 int num;   //数据域
  7.                 struct Kong *next; //指针域
  8. }NODE, *PNODE;

  9. void my_add(PNODE *lib);
  10. void my_scanf(PNODE num2);
  11. void my_print(PNODE lib);

  12. int main(void)
  13. {
  14.                 int i = 3;
  15.                 PNODE head = NULL;  //创建一个头节点
  16.                
  17.                 /*my_add(&head);*/

  18.                 while(i--)
  19.                 {
  20.                                 my_add(&head);
  21.                 }
  22.                 my_print(head);

  23.                 return 0;
  24. }

  25. //创建一个链表
  26. void my_add(PNODE *lib)
  27. {
  28.                 PNODE num2; //创建首个节点
  29.                 PNODE num3; //创建临时节点
  30.                 num2 = (PNODE)malloc(sizeof(NODE));  //给首节点分配内存空间
  31.                 if(num2 == NULL)
  32.                 {
  33.                                 printf("内存空间分配失败!\n");
  34.                                 exit(1);
  35.                 }

  36.                 my_scanf(num2);  //调用输入函数scanf

  37.                 num3 = *lib; //把头节点的地址传给临时节点
  38.                 *lib = num2;
  39.                 num2->next = num3;
  40. }

  41. //给此链表付值
  42. void my_scanf(PNODE num2)
  43. {
  44.                 printf("请输入一个数字:");
  45.                 scanf("%d", num2->num);
  46. }

  47. //打印链表
  48. void my_print(PNODE lib)
  49. {
  50.                 PNODE prin;
  51.                 prin = lib;

  52.                 while(prin != NULL)
  53.                 {
  54.                                 printf("打印链表:");
  55.                                 printf("%d", prin->next);
  56.                                 prin = prin->next;
  57.                 }

  58. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 18:12:31 | 显示全部楼层

这里我是想向链表中输入两次数据所以才这么写的
  1. or(i = 0; i < 2; i++)
  2.                 {                                               
  3.                     addnumber(&my);   // 这里执行两次是什么意思?
  4.                                                                         //  发送两次头结点的地址?
  5.                                                                         //  那么你的两个地址都是挂到头结点上?                                          
  6.                 }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 19:58:00 | 显示全部楼层    本楼为最佳答案   
  1. 1>------ 已启动全部重新生成: 项目: tmp, 配置: Debug Win32 ------
  2. 1>main.c
  3. 1>c:\visualstudioprojects\tmp\tmp\main.c(54): warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数,但可变参数 1 拥有了类型“int”
  4. 1>c:\visualstudioprojects\tmp\tmp\main.c(54): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  5. 1>c:\program files (x86)\windows kits\10\include\10.0.15063.0\ucrt\stdio.h(1272): note: 参见“scanf”的声明
  6. 1>c:\visualstudioprojects\tmp\tmp\main.c(66): warning C4477: “printf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“Kong *”
  7. 1>tmp.vcxproj -> C:\VisualStudioProjects\tmp\Debug\tmp.exe
  8. 1>已完成生成项目“tmp.vcxproj”的操作。
  9. ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
复制代码



c:\visualstudioprojects\tmp\tmp\main.c(54): warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数,但可变参数 1 拥有了类型“int”

我相信你的编译器也一定有这个警告
54行 scanf 有一个 %d,这个 %d 需要一个 int 指针的参数,但现在这个参数不是int指针,而是int类型

  1. #include<stdio.h>

  2. struct Test
  3. {
  4.         int num;
  5.         char str[10];
  6. };

  7. int main(void)
  8. {
  9.         struct Test test = {0};
  10.         struct Test *p = &test;

  11.         scanf("%d", &test.num);
  12.         scanf("%d", &p->num);

  13.         return 0;
  14. }
复制代码


多留意警告,编译器不会平白无故报警告
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 21:06:49 | 显示全部楼层
人造人 发表于 2018-2-18 19:58
c:\visualstudioprojects\tmp\tmp\main.c(54): warning C4477: “scanf”: 格式字符串“%d”需要类型 ...

我用的是linux的GCC,毛都没有提示一个,气死我了,谢谢阿,我都在这网上等了,快三个小时了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 21:07:35 | 显示全部楼层
奥普瓯江 发表于 2018-2-18 21:06
我用的是linux的GCC,毛都没有提示一个,气死我了,谢谢阿,我都在这网上等了,快三个小时了。

这链表就不是人学的,太虐人了累心
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 21:25:20 | 显示全部楼层
奥普瓯江 发表于 2018-2-18 21:06
我用的是linux的GCC,毛都没有提示一个,气死我了,谢谢阿,我都在这网上等了,快三个小时了。
  1. $ gcc -Wall main.c
  2. main.c: In function 'my_scanf':
  3. main.c:54:23: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
  4.                  scanf("%d", num2->num);
  5.                        ^
  6. main.c:54:23: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
  7. main.c: In function 'my_print':
  8. main.c:66:40: warning: format '%d' expects argument of type 'int', but argument 2 has type 'struct Kong *' [-Wformat=]
  9.                                  printf("%d", prin->next);
  10.                                         ^
  11. main.c:66:40: warning: format '%d' expects argument of type 'int', but argument 2 has type 'struct Kong *' [-Wformat=]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 21:26:23 | 显示全部楼层
奥普瓯江 发表于 2018-2-18 21:07
这链表就不是人学的,太虐人了累心

如果说链表很难,那后面的树和图怎么办?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 21:51:26 | 显示全部楼层
本帖最后由 风过无痕丶 于 2018-2-18 21:53 编辑

哈哈 来晚了啊~
  1. #pragma warning(disable : 4996)
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include <malloc.h>

  5. //创建一个节点类型
  6. typedef struct Kong
  7. {
  8.         int num;   //数据域
  9.         struct Kong *next; //指针域

  10. }NODE, *PNODE;

  11. PNODE my_add(void);
  12. void my_print(PNODE phead);


  13. int main(void)
  14. {
  15.         PNODE head = NULL;  //创建一个头节点
  16.         head = my_add();
  17.         my_print(head);

  18.         while (1) {
  19.                 getchar();
  20.         }

  21.         return 0;
  22. }


  23. //创建一个链表
  24. PNODE my_add(void)
  25. {       
  26.         int n;  // 临时存放节点的值
  27.         int len; // 节点的个数

  28.         PNODE num2 = (PNODE)malloc(sizeof(NODE));  //给首节点分配内存空间

  29.         if (num2 == NULL)
  30.         {
  31.                 printf("内存空间分配失败!\n");
  32.                 exit(-1);
  33.         }

  34.         PNODE num3 = num2; // 让他永远指向尾节点
  35.         num3->next = NULL;  // 尾节点的特性是指针域为空


  36.         printf("请输入您需要生成的链表节点的个数:");
  37.         scanf("%d", &len);

  38.         for (int i = 0; i < len; i++) {
  39.                 printf("请输入第%d个节点的值", i + 1);
  40.                 scanf("%d", &n);

  41.                 PNODE pNew = (PNODE)malloc(sizeof(NODE)); //  这里是循环一次生成一个节点
  42.                                                                                                   //  下面要做的就是给节点赋值,并且把他们连接起来
  43.                
  44.                 //  这里再判断一下 是不是每个节点都生成成功了
  45.                 if (pNew == NULL)
  46.                 {
  47.                         printf("内存空间分配失败!\n");
  48.                         exit(-1);
  49.                 }
  50.                
  51.                 pNew->num = n; // 给新的节点赋值
  52.                 num3->next = pNew;   // 把尾节点挂到后面去
  53.                 pNew->next = NULL;  // 清空
  54.                 num3 = pNew; // 这一步是关键,保证num3永远是尾节点
  55.         }

  56.         return num2;
  57. }



  58. //打印链表
  59. void my_print(PNODE phead)
  60. {
  61.         PNODE p = phead->next;

  62.         // 这个逻辑很简单,就是判断指针域是不是为空,为空肯定就是尾节点了,不为空的话 就打印数据域
  63.         while (p != NULL) {
  64.                 printf("%d ", p->num);
  65.                 p = p->next; //  把p移到下一个节点去~
  66.         }
  67.         // 。。。美观一点 再换个行~
  68.         printf("\n");

  69.         return;
  70. }
复制代码


我帮你改造了一下
QQ截图20180218214830.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-19 23:18:59 | 显示全部楼层

谢谢谢谢,不晚不晚,麻烦你了,我这边对这个C语言或者说算法不怎么熟悉,因为刚学,算是给了我另一种解题的思路谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-19 23:24:55 | 显示全部楼层
本帖最后由 奥普瓯江 于 2018-2-19 23:26 编辑
人造人 发表于 2018-2-18 21:26
如果说链表很难,那后面的树和图怎么办?


暂时不知道怎么回答,谢谢,我刚学编程,反正对我都是一样的难,至于后面的要是难怎么办,现在对我来说,就是学,难的学会就不难了,不学会就都是难的,我在努力,在这里先说谢谢。麻烦了,以后还有问题的化还望多指点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-19 23:58:15 | 显示全部楼层
奥普瓯江 发表于 2018-2-19 23:24
暂时不知道怎么回答,谢谢,我刚学编程,反正对我都是一样的难,至于后面的要是难怎么办,现在对我来说 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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