鱼C论坛

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

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

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

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

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

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

1.jpg
2.png
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Telbook
{
        char name[12];
        char beizhu[24];
        unsigned long long number;
        struct Telbook *next;
} PLR,*PLRPIN;


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

#define ME_ALLCARD 1
#define ME_FOUNDCARD 2
#define ME_DELCARD 3
#define ME_MODIFYCARD 4
#define ME_NEWCARD 5
#define ME_EXIT 0

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

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

        do
        {
                printf("\n请输入数字选择菜单:");
reInput:
                scanf("%d",&iMenu);
                switch(iMenu)
                {
                case ME_ALLCARD:
                        PrintInfo(Headr);
                        break;
                case ME_FOUNDCARD:
                        break;
                case ME_DELCARD:
                        break;
                case ME_NEWCARD:
                        while(1)
                        {
                                printf("请问是否要新建名片(Y/N):");
                                do
                                {
                                        cInput=getchar();

                                }while(cInput !='Y' && cInput != 'N');
                                if(cInput == 'Y')
                                {
                                        InsertInfo(&Headr);
                                }
                                else
                                {
                                        break;
                                }
                        }
                        
                        break;
                case ME_MODIFYCARD:
                        break;
                case ME_EXIT:
                        printf("感谢您的使用,程序准备退出!\n确认退出请输入(Y/N):");
                        do
                        {
                        cExit=getchar();
                        }while(cExit != 'Y' && cExit != 'N');
                        if(cExit == 'Y')
                        {
                                releaseInfo(&Headr);
                                exit(1);
                        }
                        break;
                default :
                        printf("输入的选项无效,请重新输入(1~5):");
                        goto reInput;
                        break;
                }
        }while(1);
        //releaseInfo(&Headr);
        return 0;
}



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

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

        if(NULL == New)
        {
                printf("新的空间分配失败\n");
                return ;
        }

        InputInfo(New);

        if(*Info != NULL) 
        {
                Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
                *Info=New;
                New->next=Temp;
        }
        else
        {
                *Info=New;
                New->next=NULL;
        }
                
}

void InputInfo(PLRPIN Info)
{
        
        printf("请输入姓名:");
        scanf("%s",Info->name);
        printf("请给人物添加备注:");
        scanf("%s",Info->beizhu);
        printf("请输入号码:");
        scanf("%llu",&Info->number);
}

void PrintInfo(PLRPIN Info)
{
        
        PLRPIN New;
        int count =1;

        New=Info;

        printf("\n\n----------------------------------------------------------------------------\n");
        printf("|编号|    |姓名|     |备注|         |联系方式|       \n");
        while(New != NULL )
        {
                printf("    %d        %s         %s          %llu     \n",count,New->name,New->beizhu,New->number);
                New=New->next;
                count++;
        }
}

void releaseInfo(PLRPIN *Info)
{
        PLRPIN Temp;
        while (*Info != NULL)
        {
                Temp=*Info;
                *Info=(*Info)->next;
                free(Temp);
        }
}

最佳答案
2020-2-22 22:09:48
 if(*Info != NULL) 
        {
                Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
                *Info=New;
                New->next=Temp;
        }
我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行
{
*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 | 显示全部楼层    本楼为最佳答案   
 if(*Info != NULL) 
        {
                Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
                *Info=New;
                New->next=Temp;
        }
我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行
{
*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
我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行
  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
不和你的原代码一模一样吗?你改成啥样了呢?
New=(PLRPIN)malloc(sizeof(PLRPIN));
原来是这样
我改成了这样
New=(PLRPIN)malloc(sizeof(PLR));
type sturct Telbook
 {
 ....
}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, 2025-1-16 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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