黄翼 发表于 2020-2-22 20:20:48

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

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



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Telbook
{
        char name;
        char beizhu;
        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);
        }
}


4goodworld 发表于 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吗?
以上个人的理解,不知对不对,不对请大佬更正!

chxchxkkk 发表于 2020-2-23 10:58:34

看错误提示,应该是指针指向了不明区域造成了崩溃

黄翼 发表于 2020-2-23 12:55:46

4goodworld 发表于 2020-2-22 22:09
我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行


New=(PLRPIN)malloc(sizeof(PLRPIN));
找到了,是这一句的问题,您猜,哈哈。我一条一条排错排出来的

黄翼 发表于 2020-2-23 12:56:28

chxchxkkk 发表于 2020-2-23 10:58
看错误提示,应该是指针指向了不明区域造成了崩溃

谢谢哈!

4goodworld 发表于 2020-2-23 19:28:16

黄翼 发表于 2020-2-23 12:55
找到了,是这一句的问题,您猜,哈哈。我一条一条排错排出来的

正确的应该是什么呢?

黄翼 发表于 2020-2-23 21:00:46

4goodworld 发表于 2020-2-23 19:28
正确的应该是什么呢?

就是上面的那个。我复制出来的那个

4goodworld 发表于 2020-2-23 21:22:27

黄翼 发表于 2020-2-23 21:00
就是上面的那个。我复制出来的那个

不和你的原代码一模一样吗?你改成啥样了呢?

黄翼 发表于 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;

4goodworld 发表于 2020-2-23 22:02:35

黄翼 发表于 2020-2-23 21:55
原来是这样
我改成了这样

哈哈,sizeof(PLRPIN)是指针了,原来如此,咋一看真的容易忽略

黄翼 发表于 2020-2-23 23:36:54

4goodworld 发表于 2020-2-23 22:02
哈哈,sizeof(PLRPIN)是指针了,原来如此,咋一看真的容易忽略

就是,只哈
页: [1]
查看完整版本: 单链表,都出错,按着小甲鱼代码查了N遍还是没找出问题,请大师吗,帮忙。