鱼C论坛

 找回密码
 立即注册
查看: 1214|回复: 10

[已解决]单链表,都出错,按着小甲鱼代码查了N遍还是没找出问题,请大师吗,帮忙。

[复制链接]
发表于 2020-2-22 20:20:48 | 显示全部楼层 |阅读模式

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

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

x
单链表中,查了很多遍没查出原因,求大师帮忙
顺便想问,可不可以一次性将单链表的数据写出文件我试了一下,没成功
如果有,可否给个例子代码,谢谢

1.jpg
2.png

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

  4. typedef struct Telbook
  5. {
  6.         char name[12];
  7.         char beizhu[24];
  8.         unsigned long long number;
  9.         struct Telbook *next;
  10. } PLR,*PLRPIN;


  11. void PrintInfo(PLRPIN Info);
  12. void InsertInfo(PLRPIN *Info); //把地址给它,用*把系统分给头指针的地址里的值拿出来做修改,就可以指向其它的值,所以要两层引用
  13. void InputInfo(PLRPIN);
  14. void releaseInfo(PLRPIN *Info);//释放所有内存空间,不是一个结构哟

  15. #define ME_ALLCARD 1
  16. #define ME_FOUNDCARD 2
  17. #define ME_DELCARD 3
  18. #define ME_MODIFYCARD 4
  19. #define ME_NEWCARD 5
  20. #define ME_EXIT 0

  21. #define _CRT_SECURE_NO_WARNINGS //排错
  22. int main()
  23. {
  24.         int iMenu;
  25.         char cExit,cInput;
  26.         PLRPIN Headr=NULL; //声明一个头指针,并给值等0;

  27.         printf("\n|-------------------------------|菜单|-----------------------------------|\n\n");
  28.         printf("|  1.显示所有名片|2.查找名片|3.删除名片|4.修改名片|5.新建名片|0.退出  |\n\n");
  29.         printf("|--------------------------------------------------------------------------|\n");

  30.         do
  31.         {
  32.                 printf("\n请输入数字选择菜单:");
  33. reInput:
  34.                 scanf("%d",&iMenu);
  35.                 switch(iMenu)
  36.                 {
  37.                 case ME_ALLCARD:
  38.                         PrintInfo(Headr);
  39.                         break;
  40.                 case ME_FOUNDCARD:
  41.                         break;
  42.                 case ME_DELCARD:
  43.                         break;
  44.                 case ME_NEWCARD:
  45.                         while(1)
  46.                         {
  47.                                 printf("请问是否要新建名片(Y/N):");
  48.                                 do
  49.                                 {
  50.                                         cInput=getchar();

  51.                                 }while(cInput !='Y' && cInput != 'N');
  52.                                 if(cInput == 'Y')
  53.                                 {
  54.                                         InsertInfo(&Headr);
  55.                                 }
  56.                                 else
  57.                                 {
  58.                                         break;
  59.                                 }
  60.                         }
  61.                        
  62.                         break;
  63.                 case ME_MODIFYCARD:
  64.                         break;
  65.                 case ME_EXIT:
  66.                         printf("感谢您的使用,程序准备退出!\n确认退出请输入(Y/N):");
  67.                         do
  68.                         {
  69.                         cExit=getchar();
  70.                         }while(cExit != 'Y' && cExit != 'N');
  71.                         if(cExit == 'Y')
  72.                         {
  73.                                 releaseInfo(&Headr);
  74.                                 exit(1);
  75.                         }
  76.                         break;
  77.                 default :
  78.                         printf("输入的选项无效,请重新输入(1~5):");
  79.                         goto reInput;
  80.                         break;
  81.                 }
  82.         }while(1);
  83.         //releaseInfo(&Headr);
  84.         return 0;
  85. }



  86. void InsertInfo(PLRPIN *Info) //传入指向指针结构的指针来修改指针
  87. {
  88.         PLRPIN Temp,New;

  89.         New=(PLRPIN)malloc(sizeof(PLRPIN));

  90.         if(NULL == New)
  91.         {
  92.                 printf("新的空间分配失败\n");
  93.                 return ;
  94.         }

  95.         InputInfo(New);

  96.         if(*Info != NULL)
  97.         {
  98.                 Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
  99.                 *Info=New;
  100.                 New->next=Temp;
  101.         }
  102.         else
  103.         {
  104.                 *Info=New;
  105.                 New->next=NULL;
  106.         }
  107.                
  108. }

  109. void InputInfo(PLRPIN Info)
  110. {
  111.        
  112.         printf("请输入姓名:");
  113.         scanf("%s",Info->name);
  114.         printf("请给人物添加备注:");
  115.         scanf("%s",Info->beizhu);
  116.         printf("请输入号码:");
  117.         scanf("%llu",&Info->number);
  118. }

  119. void PrintInfo(PLRPIN Info)
  120. {
  121.        
  122.         PLRPIN New;
  123.         int count =1;

  124.         New=Info;

  125.         printf("\n\n----------------------------------------------------------------------------\n");
  126.         printf("|编号|    |姓名|     |备注|         |联系方式|       \n");
  127.         while(New != NULL )
  128.         {
  129.                 printf("    %d        %s         %s          %llu     \n",count,New->name,New->beizhu,New->number);
  130.                 New=New->next;
  131.                 count++;
  132.         }
  133. }

  134. void releaseInfo(PLRPIN *Info)
  135. {
  136.         PLRPIN Temp;
  137.         while (*Info != NULL)
  138.         {
  139.                 Temp=*Info;
  140.                 *Info=(*Info)->next;
  141.                 free(Temp);
  142.         }
  143. }
复制代码


最佳答案
2020-2-22 22:09:48
  1. if(*Info != NULL)
  2.         {
  3.                 Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
  4.                 *Info=New;
  5.                 New->next=Temp;
  6.         }
复制代码

我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行
{
*Info=New;
New->next=NULL;
}
这两个命令
Header有了真的值,
如果第二次插入,那么就执行
{
Temp=*Info;
*Info=New;
New->next=Temp;
}
而第一结构体就是当前代码中的*Info
一顿操作之后,请问原来*Info->next是什么呢?或者说temp->next是啥呢?这个不应该指向的是new吗?
以上个人的理解,不知对不对,不对请大佬更正!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-22 22:09:48 | 显示全部楼层    本楼为最佳答案   
  1. if(*Info != NULL)
  2.         {
  3.                 Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
  4.                 *Info=New;
  5.                 New->next=Temp;
  6.         }
复制代码

我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行
{
*Info=New;
New->next=NULL;
}
这两个命令
Header有了真的值,
如果第二次插入,那么就执行
{
Temp=*Info;
*Info=New;
New->next=Temp;
}
而第一结构体就是当前代码中的*Info
一顿操作之后,请问原来*Info->next是什么呢?或者说temp->next是啥呢?这个不应该指向的是new吗?
以上个人的理解,不知对不对,不对请大佬更正!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 10:58:34 | 显示全部楼层
看错误提示,应该是指针指向了不明区域造成了崩溃
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 12:55:46 | 显示全部楼层
4goodworld 发表于 2020-2-22 22:09
我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行
  1.   New=(PLRPIN)malloc(sizeof(PLRPIN));
复制代码

找到了,是这一句的问题,您猜,哈哈。我一条一条排错排出来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 12:56:28 | 显示全部楼层
chxchxkkk 发表于 2020-2-23 10:58
看错误提示,应该是指针指向了不明区域造成了崩溃

谢谢哈!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 19:28:16 | 显示全部楼层
黄翼 发表于 2020-2-23 12:55
找到了,是这一句的问题,您猜,哈哈。我一条一条排错排出来的

正确的应该是什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 21:00:46 | 显示全部楼层
4goodworld 发表于 2020-2-23 19:28
正确的应该是什么呢?

就是上面的那个。我复制出来的那个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 21:22:27 | 显示全部楼层
黄翼 发表于 2020-2-23 21:00
就是上面的那个。我复制出来的那个

不和你的原代码一模一样吗?你改成啥样了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 21:55:28 | 显示全部楼层
4goodworld 发表于 2020-2-23 21:22
不和你的原代码一模一样吗?你改成啥样了呢?
  1. New=(PLRPIN)malloc(sizeof(PLRPIN));
复制代码

原来是这样
我改成了这样
  1. New=(PLRPIN)malloc(sizeof(PLR));
复制代码
  1. type sturct Telbook
  2. {
  3. ....
  4. }PLR,*PLRPIN;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 22:02:35 | 显示全部楼层
黄翼 发表于 2020-2-23 21:55
原来是这样
我改成了这样


哈哈,sizeof(PLRPIN)是指针了,原来如此,咋一看真的容易忽略
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 23:36:54 | 显示全部楼层
4goodworld 发表于 2020-2-23 22:02
哈哈,sizeof(PLRPIN)是指针了,原来如此,咋一看真的容易忽略

就是,只哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 04:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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