鱼C论坛

 找回密码
 立即注册
查看: 1170|回复: 2

[已解决]MMP的链表-----心态崩了

[复制链接]
发表于 2019-7-18 15:28:41 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 bin554385863 于 2019-7-18 15:30 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*链表结构体 */
  4. typedef struct Node
  5. {
  6.     int value;
  7.     struct Node *next;
  8. } node;

  9. /*创建链表 */
  10. node *creatlinklist(node *arg)
  11. {
  12.     node *p1, *p2;
  13.     p1 = p2 = (node *)malloc(sizeof(node));

  14.     if (p2 != NULL)
  15.     {
  16.         /*输入节点的值 */
  17.         scanf("%d ", &p2->value);
  18.         /*新节点指针成员赋值为空 */
  19.         p2->next = NULL;
  20.     }
  21.     /*以-1作为结束标志 */
  22.     while (p2->value != -1)
  23.     {
  24.         /*若为空表,接入表头 */
  25.         if (arg == NULL)
  26.         {
  27.             arg = p2;
  28.         }
  29.         /*反之接入表尾 */
  30.         else
  31.         {
  32.             p1->next = p2;
  33.         }
  34.         p1 = p2;
  35.         p2 = (node *)malloc(sizeof(node));

  36.         if (p2 != NULL)
  37.         {
  38.             /*输入节点的值 */
  39.             scanf("%d", &p2->value);
  40.             p2->next = NULL;
  41.         }
  42.     }
  43.     return arg;
  44. }

  45. /*输出链表的值 */
  46. void printarg(node *arg)
  47. {
  48.     node *temp;
  49.     temp = arg;
  50.     while (temp != NULL)
  51.     {
  52.         printf("%d  ", temp->value);
  53.         temp = temp->next;
  54.     }
  55. }
  56. int main(int argc, char const *argv[])
  57. {
  58.     node *number = NULL;
  59.     number = creatlinklist(number);
  60.     printarg(number);
  61.     return 0;
  62. }
复制代码

---------------------------------------------------------------------------
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.24.0\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-2jp1x1jj.all --stdout=Microsoft-MIEngine-Out-vkpcu5n3.f0r --stderr=Microsoft-MIEngine-Error-c1ah2wzj.cej --pid=Microsoft-MIEngine-Pid-xby5uia2.iia --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
1 2 3 4 5 6 7 8 9 -1
1  2  3  4  5  6  7  8  9
E:\Administrator\Documents\My C>

-------------------------------------------------------------------------------------------------
输出链表我理解
链表的创建,脑壳痛
这段代码我翻来覆去的看,关于链表的视频,百度文档,还有手头的实体书一直在看,还是无法理解.
最佳答案
2019-7-18 15:28:42
本帖最后由 砚堂_ 于 2019-7-18 22:39 编辑

中心思想:arg代表整个链表,指向第一个节点,p1指向链表已输入的部分的最后一个节点,p2永远指向空的新节点。在循环过程中,每次输入的值都存入p2的value,如果它不是-1,那么尚未结束,p2要保存,并且要继续输入。把p2挂接到p1的后面,就保存了p2;此时p2变成了已完成链表的最后一个节点,所以要把p1也指向p2(别忘记了p1的任务就是指向最后一个节点!),然后p2需要指向一个新的空节点(p2的任务)。接着就是下一轮循环了。
小细节:
1,按理来说arg只需要指向第一个节点,那么只要赋值一次就可以了,所以是可以写在循环体的外面的。但是如果写在外面的话,就要先找到第一个节点,并对第一个节点做特殊处理。有时特殊处理会非常复杂繁琐。所以很多情况下会设一个虚拟存在的节点放在最前面,这样原本的第一个节点就变成了第二个节点,所有的节点都处于平等的位置,做同样的处理就可以了。最后返回的时候,抛弃第一个虚拟的节点,返回第二个节点就可以了。这是代码中arg=p2而不是arg=p1的原因。
2,一般来说,链表的最后一个节点的next应该是NULL。所以在返回arg之前,把p1(p1总是指向最后一个节点!)的next赋值为NULL就可以了。但是这面临一个问题:可能p1本身就是NULL,这就需要对p1先做判断。还有一种解决办法是,强制使每次添加完新节点,p1的next都是NULL,那在返回arg之前就不必再处理链表的尾部了。具体实现就是代码中的,每次新生成的节点p2,其next先预置NULL。

最佳答案

查看完整内容

中心思想:arg代表整个链表,指向第一个节点,p1指向链表已输入的部分的最后一个节点,p2永远指向空的新节点。在循环过程中,每次输入的值都存入p2的value,如果它不是-1,那么尚未结束,p2要保存,并且要继续输入。把p2挂接到p1的后面,就保存了p2;此时p2变成了已完成链表的最后一个节点,所以要把p1也指向p2(别忘记了p1的任务就是指向最后一个节点!),然后p2需要指向一个新的空节点(p2的任务)。接着就是下一轮循环了。 小 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-18 15:28:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 砚堂_ 于 2019-7-18 22:39 编辑

中心思想:arg代表整个链表,指向第一个节点,p1指向链表已输入的部分的最后一个节点,p2永远指向空的新节点。在循环过程中,每次输入的值都存入p2的value,如果它不是-1,那么尚未结束,p2要保存,并且要继续输入。把p2挂接到p1的后面,就保存了p2;此时p2变成了已完成链表的最后一个节点,所以要把p1也指向p2(别忘记了p1的任务就是指向最后一个节点!),然后p2需要指向一个新的空节点(p2的任务)。接着就是下一轮循环了。
小细节:
1,按理来说arg只需要指向第一个节点,那么只要赋值一次就可以了,所以是可以写在循环体的外面的。但是如果写在外面的话,就要先找到第一个节点,并对第一个节点做特殊处理。有时特殊处理会非常复杂繁琐。所以很多情况下会设一个虚拟存在的节点放在最前面,这样原本的第一个节点就变成了第二个节点,所有的节点都处于平等的位置,做同样的处理就可以了。最后返回的时候,抛弃第一个虚拟的节点,返回第二个节点就可以了。这是代码中arg=p2而不是arg=p1的原因。
2,一般来说,链表的最后一个节点的next应该是NULL。所以在返回arg之前,把p1(p1总是指向最后一个节点!)的next赋值为NULL就可以了。但是这面临一个问题:可能p1本身就是NULL,这就需要对p1先做判断。还有一种解决办法是,强制使每次添加完新节点,p1的next都是NULL,那在返回arg之前就不必再处理链表的尾部了。具体实现就是代码中的,每次新生成的节点p2,其next先预置NULL。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-18 15:45:38 | 显示全部楼层
建议不要直接看其他人的代码,自己先想一想,如果给你一串数字,让你创建个链表存进去,你会怎么做
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 20:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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