鱼C论坛

 找回密码
 立即注册
查看: 2689|回复: 11

[已解决]链表输出的问题

[复制链接]
发表于 2021-11-15 19:12:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 a327904410 于 2021-11-15 20:10 编辑

屏幕截图 2021-11-15 200915.png

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef int ElemType;
  4. typedef struct node {
  5.         ElemType data;
  6.         struct node* next;
  7. }Node;

  8. int InitNode(Node* L) {
  9.         L = (Node*)malloc(sizeof(Node));
  10.         L->next = L;
  11.         return 1;
  12. }

  13. // 尾插
  14. int InsNode(Node* L, ElemType x, int i) {
  15.         int j = 1;
  16.         Node* pre = L, * p = pre->next, * s;
  17.         if (i <= 0)
  18.                 return 0;
  19.         while (p != L && j < i) {
  20.                 j++;
  21.                 pre = p; p = p->next;
  22.         }
  23.         if (p == L && i > j + 1)
  24.                 return 0;
  25.         else {
  26.                 s = (Node*)malloc(sizeof(Node));
  27.                 s->data = x;
  28.                 s->next = pre->next;
  29.                 pre->next = s;
  30.                 return 1;
  31.         }
  32. }

  33. //输出线性表运算算法
  34. void DispList(Node* L) {            
  35.         Node* p = L->next;
  36.         while (p != L) {
  37.                 printf("%d ", p->data);
  38.                 p = p->next;
  39.         }
  40.         printf("\n");
  41. }

  42. int main() {
  43.         int i;
  44.         Node L;
  45.         InitNode(&L);
  46.         InsNode(&L, 1, 1);
  47.         InsNode(&L, 3, 2);
  48.         InsNode(&L, 1, 3);
  49.         InsNode(&L, 5, 4);
  50.         InsNode(&L, 4, 5);
  51.         InsNode(&L, 2, 6);

  52.         DispList(&L);
  53.         return 0;
  54. }
复制代码
最佳答案
2021-11-16 15:01:25
本帖最后由 jhq999 于 2021-11-16 15:10 编辑
a327904410 发表于 2021-11-16 12:56
这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的


明白了
  1. int InitNode(Node* L) {
  2.         //L = (Node*)malloc(sizeof(Node));//画蛇添足,L已经有实例了不需要申请内存,
  3.         //申请了新内存空间只不过是让形参的指针指向新内存,形参和实参再也没有关系
  4.         L->next = L;
  5.         return 1;
  6. }
复制代码

或者
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef int ElemType;
  4. typedef struct node {
  5.         ElemType data;
  6.         struct node* next;
  7. }Node;

  8. int InitNode(Node**L) {//////////////
  9.         *L = (Node*)malloc(sizeof(Node));
  10.         (*L)->next = *L;
  11.         return 1;
  12. }

  13. // 尾插
  14. int InsNode(Node* L, ElemType x, int i) {
  15.         int j = 1;
  16.         Node* pre = L, * p = pre->next, * s;
  17.         if (i <= 0)
  18.                 return 0;
  19.         while (p != L && j < i) {
  20.                 j++;
  21.                 pre = p; p = p->next;
  22.         }
  23.         if (p == L && i > j + 1)
  24.                 return 0;
  25.         else {
  26.                 s = (Node*)malloc(sizeof(Node));
  27.                 s->data = x;
  28.                 s->next = pre->next;
  29.                 pre->next = s;
  30.                 return 1;
  31.         }
  32. }

  33. //输出线性表运算算法
  34. void DispList(Node* L) {            
  35.         Node* p = L->next;
  36.         while (p != L) {
  37.                 printf("%d ", p->data);
  38.                 p = p->next;
  39.         }
  40.         printf("\n");
  41. }

  42. int main() {
  43.         int i;
  44.         Node *L=NULL;/////////
  45.         InitNode(&L);//////////
  46.         InsNode(L, 1, 1);
  47.         InsNode(L, 3, 2);
  48.         InsNode(L, 1, 3);
  49.         InsNode(L, 5, 4);
  50.         InsNode(L, 4, 5);
  51.         InsNode(L, 2, 6);

  52.         DispList(L);
  53.         return 0;
  54. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-15 19:24:17 | 显示全部楼层
大意了,最后输出肯定错的,可能打得急了没检查到。但我目前想知道上面显示的错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 19:26:48 | 显示全部楼层
  1. int main() {
  2.         int i;
  3.         Node L={0},*pL=&L;
  4.         InitNode(&L);
  5.         InsNode(&L, 1, 1);
  6.         InsNode(&L, 3, 2);
  7.         InsNode(&L, 1, 3);
  8.         InsNode(&L, 5, 4);
  9.         InsNode(&L, 4, 5);
  10.         InsNode(&L, 2, 6);
  11.                
  12.         while (pL->next != NULL) {
  13.                 pL = pL->next;
  14.                 printf("%d ", pL->data);
  15.         }
  16.         return 0;
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-15 19:38:25 | 显示全部楼层

想问下上面的报错是什么意思,感觉每次输出都会有这类报错。上面代码是临时敲出来的,之前敲过一些单链表输出也会有这种情况出现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-15 20:11:05 | 显示全部楼层

我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 20:54:42 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-15 20:59 编辑
a327904410 发表于 2021-11-15 20:11
我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题?


L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习惯,要不bug早晚找上门,
如果你记性好当我没说
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-16 00:01:16 | 显示全部楼层
jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...

刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道是不是这个原因导致的程序错误,虽然能输出结果。大佬方便帮我改下代码吗,看了其他人写的单链表还是不懂怎么修改。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-16 06:46:12 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-16 06:51 编辑
a327904410 发表于 2021-11-16 00:01
刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道 ...


单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头是个圈而不是链没有结尾,你在查找时就是死循环。
看3楼已经给你答案了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-16 12:56:08 | 显示全部楼层
jhq999 发表于 2021-11-16 06:46
单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头 ...

这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-16 15:01:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-11-16 15:10 编辑
a327904410 发表于 2021-11-16 12:56
这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的


明白了
  1. int InitNode(Node* L) {
  2.         //L = (Node*)malloc(sizeof(Node));//画蛇添足,L已经有实例了不需要申请内存,
  3.         //申请了新内存空间只不过是让形参的指针指向新内存,形参和实参再也没有关系
  4.         L->next = L;
  5.         return 1;
  6. }
复制代码

或者
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef int ElemType;
  4. typedef struct node {
  5.         ElemType data;
  6.         struct node* next;
  7. }Node;

  8. int InitNode(Node**L) {//////////////
  9.         *L = (Node*)malloc(sizeof(Node));
  10.         (*L)->next = *L;
  11.         return 1;
  12. }

  13. // 尾插
  14. int InsNode(Node* L, ElemType x, int i) {
  15.         int j = 1;
  16.         Node* pre = L, * p = pre->next, * s;
  17.         if (i <= 0)
  18.                 return 0;
  19.         while (p != L && j < i) {
  20.                 j++;
  21.                 pre = p; p = p->next;
  22.         }
  23.         if (p == L && i > j + 1)
  24.                 return 0;
  25.         else {
  26.                 s = (Node*)malloc(sizeof(Node));
  27.                 s->data = x;
  28.                 s->next = pre->next;
  29.                 pre->next = s;
  30.                 return 1;
  31.         }
  32. }

  33. //输出线性表运算算法
  34. void DispList(Node* L) {            
  35.         Node* p = L->next;
  36.         while (p != L) {
  37.                 printf("%d ", p->data);
  38.                 p = p->next;
  39.         }
  40.         printf("\n");
  41. }

  42. int main() {
  43.         int i;
  44.         Node *L=NULL;/////////
  45.         InitNode(&L);//////////
  46.         InsNode(L, 1, 1);
  47.         InsNode(L, 3, 2);
  48.         InsNode(L, 1, 3);
  49.         InsNode(L, 5, 4);
  50.         InsNode(L, 4, 5);
  51.         InsNode(L, 2, 6);

  52.         DispList(L);
  53.         return 0;
  54. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-16 19:11:17 | 显示全部楼层

看来我对指针了解还是不够,得去补补课了。谢谢大佬的改正
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-19 00:35:54 | 显示全部楼层
jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...

这句话现在懂了,看了几天关于动态内存申请视频。因为我是敲C/C++书本的代码,之前不懂指针要初始化,以为都是创建好然后再赋值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 15:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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