鱼C论坛

 找回密码
 立即注册
查看: 854|回复: 0

[技术交流] 自学C语言链表最终版

[复制链接]
发表于 2019-7-21 11:24:53 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 bin554385863 于 2019-7-21 12:42 编辑

不废话,上代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*创建自引用结构体 */
  4. typedef struct _node
  5. {
  6.     int value;
  7.     struct _node *next;
  8. } node;
  9. #define MALLOC (node *)malloc(sizeof(node))

  10. int main(int argc, char const *argv[])
  11. {
  12.     /*定义头结点 */
  13.     node *p1 = NULL;
  14.     /*定义尾结点 */
  15.     node *p2 = NULL;
  16.     /*定义待插入节点 */
  17.     node *p3 = NULL;
  18.     /*分配第一个节点空间 */
  19.     p2 = MALLOC;
  20.     /*判断是否分配节点空间成功 */
  21.     if (p2 != NULL)
  22.     {
  23.         /*头结点指向第一个节点 */
  24.         p1 = p2;
  25.         /*头结点数据成员为空 */
  26.         p1->value = NULL;
  27.         /*循环创建链表 */
  28.         while (1)
  29.         {
  30.             /*开辟新节点空间 */
  31.             p3 = MALLOC;
  32.             /*判断新节点是否开辟成功 */
  33.             if (p3 != NULL)
  34.             {
  35.                 /*继续输入新节点的数据 */
  36.                 scanf("%d", &p3->value);
  37.                 /*-1为结束符 */
  38.                 if (p3->value == -1)
  39.                 {
  40.                     break;
  41.                 }

  42.                 /*尾结点指针成员指向新开辟的节点 */
  43.                 p2->next = p3;
  44.                 /*使用递归的方法将所有的节点串联起来 */
  45.                 p2 = p2->next;
  46.             }
  47.         }
  48.         /*将尾结点置空 */
  49.         p2->next = NULL;
  50.     }
  51.     /*输出链表 */
  52.     /*因为头结点数据是空的不是我们需要的数据因此舍弃直接输出第一个有效节点的值 */
  53.     node *t = p1->next;
  54.     while (t != NULL)
  55.     {
  56.         printf("%d ", t->value);
  57.         t = t->next;
  58.     }

  59.     return 0;
  60. }
复制代码

-----------------------------------------------------------------------------------------------------------------------
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-dtfhakoh.vh3 --stdout=Microsoft-MIEngine-Out-z0s42jq4.twe --stderr=Microsoft-MIEngine-Error-yazk3hdn.pu1 --pid=Microsoft-MIEngine-Pid-qhv5dtyh.pwv --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
--------输入链表数据--------
-1
--------输出链表数据--------


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-o23bqjn4.3ip --stdout=Microsoft-MIEngine-Out-npswc3fz.e2x --stderr=Microsoft-MIEngine-Error-ny4her4f.k3v --pid=Microsoft-MIEngine-Pid-kfyckkw0.jsz --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>

=========================================================
上面的还有一点瑕疵,比如临时头结点p1没有释放占用的内存空间. 下面这个函数化的才是最终版本
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*创建自引用结构体 */
  4. typedef struct _node
  5. {
  6.     int value;
  7.     struct _node *next;
  8. } node;
  9. #define MALLOC (node *)malloc(sizeof(node))
  10. /*链表创建函数 */
  11. node *CreatNode(void)
  12. {
  13.     /*定义头结点 */
  14.     node *p0 = NULL;
  15.     /*定义临时头结点 */
  16.     node *p1 = NULL;
  17.     /*定义尾结点 */
  18.     node *p2 = NULL;
  19.     /*定义待插入节点 */
  20.     node *p3 = NULL;
  21.     /*分配第一个节点空间 */
  22.     p2 = MALLOC;
  23.     /*判断是否分配节点空间成功 */
  24.     if (p2 != NULL)
  25.     {
  26.         /*临时头结点指向第一个节点 */
  27.         p1 = p2;
  28.         /*临时头结点数据成员为空 */
  29.         p1->value = NULL;
  30.         /*循环创建链表 */
  31.         printf("--------输入链表数据--------\n");
  32.         while (1)
  33.         {
  34.             /*开辟新节点空间 */
  35.             p3 = MALLOC;
  36.             /*判断新节点是否开辟成功 */
  37.             if (p3 != NULL)
  38.             {
  39.                 /*继续输入新节点的数据 */
  40.                 scanf("%d", &p3->value);
  41.                 /*-1为结束符 */
  42.                 if (p3->value == -1)
  43.                 {
  44.                     break;
  45.                 }

  46.                 /*尾结点指针成员指向新开辟的节点 */
  47.                 p2->next = p3;
  48.                 /*使用递归的方法将所有的节点串联起来 */
  49.                 p2 = p2->next;
  50.             }
  51.         }
  52.         /*将尾结点置空 */
  53.         p2->next = NULL;
  54.     }
  55.     /*头结点指向第一个有效节点 */
  56.     p0 = p1->next;
  57.     /*释放临时头结点的内存空间 */
  58.     free(p1);
  59.     return p0;
  60. }
  61. /*链表输出函数 */
  62. void PrintNode(node *t_node)
  63. {
  64.     node *t = t_node;
  65.         while (t != NULL)
  66.     {
  67.         printf("%d ", t->value);
  68.         t = t->next;
  69.     }
  70. }
  71. int main(int argc, char const *argv[])
  72. {
  73.     node *linklist = NULL;
  74.     /*调用创建链表函数 */
  75.     linklist = CreatNode();
  76.     /*调用链表输出函数 */
  77.     PrintNode(linklist);
  78.     return 0;
  79. }
复制代码

-------------------------------------------------------------------------------------------
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-h0wqugoj.e51 --stdout=Microsoft-MIEngine-Out-pqsbx1jx.pnk --stderr=Microsoft-MIEngine-Error-ilxijexf.tzq --pid=Microsoft-MIEngine-Pid-jtmk4tw5.f5w --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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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