鱼C论坛

 找回密码
 立即注册
查看: 3082|回复: 8

[已解决]我的unionlist哪里错了?为什么执行不出来??

[复制链接]
发表于 2018-4-18 19:29:11 | 显示全部楼层 |阅读模式

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

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

x
  1. # include<stdio.h>
  2. # include<stdlib.h>
  3. typedef struct Node{
  4.         int data;
  5.         struct Node* next;
  6. }Node,*linklist;

  7. void initlist(linklist *L)
  8. {
  9.         (*L)=(linklist)malloc(sizeof(Node));
  10.         if(!(*L))
  11.         {
  12.                 printf("对不起,初始化失败。\n");
  13.         }
  14.         else
  15.         {
  16.                 (*L)->next=NULL;
  17.                 printf("初始化成功。\n");
  18.         }
  19. }

  20. void creatlist(linklist L) //尾插法建立单链表
  21. {
  22.         int num,i;
  23.         linklist r,q;
  24.         r=L;
  25.         printf("请问你想要建立几个元素的单链表:\n");
  26.         scanf("%d",&num);
  27.         for(i=0;i<num;i++)
  28.         {
  29.                 q=(linklist)malloc(sizeof(Node));
  30.                 if(!q)
  31.                 {
  32.                         printf("对不起,存储空间分配失败。\n");
  33.                 }
  34.                 else
  35.                 {
  36.                         printf("请输入第%d个元素:",i+1);
  37.                         scanf("%d",&q->data);
  38.                         q->next=NULL;
  39.                         r->next=q;
  40.                         r=q;
  41.                 }
  42.         }
  43.         printf("单链表创建完毕。\n");
  44. }

  45. void printlist(linklist L)
  46. {
  47.         linklist p;
  48.         p=L->next;
  49.         while(p!=NULL)
  50.         {
  51.                 printf("%d ",p->data);
  52.                 p=p->next;
  53.         }
  54.         printf("单链表打印完毕。\n");
  55. }

  56. linklist unionlist(linklist L1,linklist L2,linklist L3)
  57. {
  58.         linklist p1,p2,p3;
  59.         L3=L1;
  60.         p1=L1->next;
  61.         p2=L2->next;
  62.        
  63.         while(p1&&p2)
  64.         {
  65.                 if(p1->data<=p2->data)
  66.                 {
  67.                         p3->next=p1;
  68.                         p3=p1;
  69.                         p1=p1->next;
  70.                 }
  71.                 else
  72.                 {
  73.                         p3->next=p2;
  74.                         p3=p2;
  75.                         p2=p2->next;
  76.                 }
  77.         }
  78.         p3->next=p1?p1:p2;
  79.         free(L2);
  80.         return L3;
  81. }



  82. int main()
  83. {
  84.         linklist L1,L2,L3;
  85.         printf("请创建第一个链表:");
  86.         initlist(&L1);
  87.         creatlist(L1);        printlist(L1);
  88.         printf("请创建第二个链表:");
  89.         initlist(&L2);
  90.         creatlist(L2);        printlist(L2);
  91.         printf("合并两个链表:");
  92.         unionlist(L1,L2,L3);
  93.         printlist(L3);
  94.         return 0;
  95. }
复制代码
@人造人
最佳答案
2018-4-20 08:57:19
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结点要分配空间的,
你在main函数里定义了L3,要分配给L3链表的空间,也就是要初始化一下
还有你的unionlist函数有返回值,在main函数里就是L3 = unionlist(L1,L2,L3);
还有unionlist里的p3指针要进行初始化,否则就是野指针,
具体见程序注释,我调试过,应该没有错,楼主也可以实验一下
  1. # include<stdio.h>
  2. # include<stdlib.h>
  3. typedef struct Node{
  4.         int data;
  5.         struct Node* next;
  6. }Node, *linklist;

  7. void initlist(linklist *L)
  8. {
  9.         (*L) = (linklist)malloc(sizeof(Node));
  10.         if (!(*L))
  11.         {
  12.                 printf("对不起,初始化失败。\n");
  13.         }
  14.         else
  15.         {
  16.                 (*L)->next = NULL;
  17.                 printf("初始化成功。\n");
  18.         }
  19. }

  20. void creatlist(linklist L) //尾插法建立单链表
  21. {
  22.         int num, i;
  23.         linklist r, q;
  24.         r = L;
  25.         printf("请问你想要建立几个元素的单链表:\n");
  26.         scanf("%d", &num);
  27.         for (i = 0; i<num; i++)
  28.         {
  29.                 q = (linklist)malloc(sizeof(Node));
  30.                 if (!q)
  31.                 {
  32.                         printf("对不起,存储空间分配失败。\n");
  33.                 }
  34.                 else
  35.                 {
  36.                         printf("请输入第%d个元素:", i + 1);
  37.                         scanf("%d", &q->data);
  38.                         q->next = NULL;
  39.                         r->next = q;
  40.                         r = q;
  41.                 }
  42.         }
  43.         printf("单链表创建完毕。\n");
  44. }

  45. void printlist(linklist L)
  46. {
  47.         linklist p;
  48.         p = L->next;
  49.         while (p != NULL)
  50.         {
  51.                 printf("%d ", p->data);
  52.                 p = p->next;
  53.         }
  54.         printf("单链表打印完毕。\n");
  55. }

  56. linklist unionlist(linklist L1, linklist L2, linklist L3)
  57. {
  58.         linklist p1, p2, p3;
  59.         p3 = L3 = L1;//p3这里的指针要初始化,要不就是野指针
  60.         p1 = L1->next;
  61.         p2 = L2->next;

  62.         while (p1&&p2)
  63.         {
  64.                 if (p1->data <= p2->data)
  65.                 {
  66.                         p3->next = p1;
  67.                         p3 = p1;
  68.                         p1 = p1->next;
  69.                 }
  70.                 else
  71.                 {
  72.                         p3->next = p2;
  73.                         p3 = p2;
  74.                         p2 = p2->next;
  75.                 }
  76.         }
  77.         p3->next = p1 ? p1 : p2;
  78.         free(L2);
  79.         return L3;
  80. }



  81. int main()
  82. {
  83.         linklist L1, L2, L3;
  84.         printf("请创建第一个链表:");
  85.         initlist(&L1);
  86.         creatlist(L1);        printlist(L1);
  87.         printf("请创建第二个链表:");
  88.         initlist(&L2);
  89.         creatlist(L2);        printlist(L2);
  90.         initlist(&L3);//这句要写上,因为楼上说的有道理的,这里要新建一个链表,分配空间,初始化
  91.         printf("合并两个链表:");
  92.         L3 = unionlist(L1, L2, L3);//这里记得要有返回值。。。
  93.         printlist(L3);
  94.         return 0;
  95. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-18 19:41:20 | 显示全部楼层
有些警告是有意义的

360截图17571122426362.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-18 21:12:42 | 显示全部楼层
人造人 发表于 2018-4-18 19:41
有些警告是有意义的

可是我L3已经定义了它的类型啊,我只需要让它在unionlist中指向L1就好了啊,这样不通吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-20 08:57:19 | 显示全部楼层    本楼为最佳答案   
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结点要分配空间的,
你在main函数里定义了L3,要分配给L3链表的空间,也就是要初始化一下
还有你的unionlist函数有返回值,在main函数里就是L3 = unionlist(L1,L2,L3);
还有unionlist里的p3指针要进行初始化,否则就是野指针,
具体见程序注释,我调试过,应该没有错,楼主也可以实验一下
  1. # include<stdio.h>
  2. # include<stdlib.h>
  3. typedef struct Node{
  4.         int data;
  5.         struct Node* next;
  6. }Node, *linklist;

  7. void initlist(linklist *L)
  8. {
  9.         (*L) = (linklist)malloc(sizeof(Node));
  10.         if (!(*L))
  11.         {
  12.                 printf("对不起,初始化失败。\n");
  13.         }
  14.         else
  15.         {
  16.                 (*L)->next = NULL;
  17.                 printf("初始化成功。\n");
  18.         }
  19. }

  20. void creatlist(linklist L) //尾插法建立单链表
  21. {
  22.         int num, i;
  23.         linklist r, q;
  24.         r = L;
  25.         printf("请问你想要建立几个元素的单链表:\n");
  26.         scanf("%d", &num);
  27.         for (i = 0; i<num; i++)
  28.         {
  29.                 q = (linklist)malloc(sizeof(Node));
  30.                 if (!q)
  31.                 {
  32.                         printf("对不起,存储空间分配失败。\n");
  33.                 }
  34.                 else
  35.                 {
  36.                         printf("请输入第%d个元素:", i + 1);
  37.                         scanf("%d", &q->data);
  38.                         q->next = NULL;
  39.                         r->next = q;
  40.                         r = q;
  41.                 }
  42.         }
  43.         printf("单链表创建完毕。\n");
  44. }

  45. void printlist(linklist L)
  46. {
  47.         linklist p;
  48.         p = L->next;
  49.         while (p != NULL)
  50.         {
  51.                 printf("%d ", p->data);
  52.                 p = p->next;
  53.         }
  54.         printf("单链表打印完毕。\n");
  55. }

  56. linklist unionlist(linklist L1, linklist L2, linklist L3)
  57. {
  58.         linklist p1, p2, p3;
  59.         p3 = L3 = L1;//p3这里的指针要初始化,要不就是野指针
  60.         p1 = L1->next;
  61.         p2 = L2->next;

  62.         while (p1&&p2)
  63.         {
  64.                 if (p1->data <= p2->data)
  65.                 {
  66.                         p3->next = p1;
  67.                         p3 = p1;
  68.                         p1 = p1->next;
  69.                 }
  70.                 else
  71.                 {
  72.                         p3->next = p2;
  73.                         p3 = p2;
  74.                         p2 = p2->next;
  75.                 }
  76.         }
  77.         p3->next = p1 ? p1 : p2;
  78.         free(L2);
  79.         return L3;
  80. }



  81. int main()
  82. {
  83.         linklist L1, L2, L3;
  84.         printf("请创建第一个链表:");
  85.         initlist(&L1);
  86.         creatlist(L1);        printlist(L1);
  87.         printf("请创建第二个链表:");
  88.         initlist(&L2);
  89.         creatlist(L2);        printlist(L2);
  90.         initlist(&L3);//这句要写上,因为楼上说的有道理的,这里要新建一个链表,分配空间,初始化
  91.         printf("合并两个链表:");
  92.         L3 = unionlist(L1, L2, L3);//这里记得要有返回值。。。
  93.         printlist(L3);
  94.         return 0;
  95. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-20 23:18:41 | 显示全部楼层
溯影 发表于 2018-4-20 08:57
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结 ...

哇谢谢你!!!!!我明天参考你的程序调试看看~
谢谢!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-23 10:31:45 | 显示全部楼层
溯影 发表于 2018-4-20 08:57
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结 ...

我按照你给我的提示然后我自己也运行出来啦~
但是我就是有点不太明白“initlist(&L3);//这句要写上,因为楼上说的有道理的,这里要新建一个链表,分配空间,初始化” 这句语句

我如果理解:我只是要定义一个和L1指向同一个结点的头指针,L1这个头结点已经初始化了,我只是再定义一个类型和它一样的头指针而已,为什么还要再将L3初始化??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 11:59:40 | 显示全部楼层
因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点的,当然要分配空间啦,但是你看你的那个unionlist的函数里一开始声明的那个结点型指针p1,p2,这个就不用分配空间,因为他只是起到指向的作用,并不充当结点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 12:00:28 | 显示全部楼层
愿你 发表于 2018-4-23 10:31
我按照你给我的提示然后我自己也运行出来啦~
但是我就是有点不太明白“initlist(&L3);//这句 ...

因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点的,当然要分配空间啦,但是你看你的那个unionlist的函数里一开始声明的那个结点型指针p1,p2,这个就不用分配空间,因为他只是起到指向的作用,并不充当结点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-23 16:16:21 | 显示全部楼层
溯影 发表于 2018-4-23 12:00
因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点 ...

那我不能理解成L3也只是一个我索引到L1吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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