鱼C论坛

 找回密码
 立即注册
查看: 2196|回复: 1

[已解决]带你学C带你飞第48课中的通讯录建设,关于链表删除函数导致程序崩溃

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

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

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

x
这个程序中的删除函数4(void delPerson(PNODE head))里面我想用if语句来判别,如果输入的信息通讯录中没有数据,就提示printf("未找到要删除的通讯录");但是我输入通讯录没有的数据后程序就崩溃了,想请诸位给解答一下,我到底是那里错了,我已经派了一天的错了,没找到原因。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct Boss
{
                char name[120];  //姓名
                int  number[120];      //电话
                char addr[1024]; //地址
                struct Boss *next; //信息域
}NODE, *PNODE;



void addPerson(PNODE *head); //插入新的联系人
void my_scanf(PNODE phead);  //输入数据函数
void fidPerson(PNODE head); //查找已有联系人
void changePerson(PNODE head); //更改已有联系人
void delPerson(PNODE head);  //删除已有联系人
void my_printf(PNODE phead); //显示查找目录
void displayPerson(PNODE head);  //显示当前通讯录
void releasePerson(PNODE *head);  //退出通讯录程序,释放内存空间



void addPerson(PNODE *head)      //插入新的联系人
{
                PNODE phead;
                static PNODE tail;

                phead = (PNODE)malloc(sizeof(NODE));
                if(phead == NULL)
                {
                                printf("内存分配失败");
                                exit(1);
                }

                my_scanf(phead);

                if((*head)->next != NULL)
                {
                                tail->next = phead;
                                phead->next = NULL;
                }
                else
                {
                                (*head)->next = phead;
                                phead->next = NULL;
                }
                tail = phead;
                

}

void my_scanf(PNODE phead)       //输入数据函数
{
                printf("姓名:");
                scanf("%s", &phead->name);
                printf("电话:");
                scanf("%s", &phead->number);
                printf("地址:");
                scanf("%s", &phead->addr);
}

void fidPerson(PNODE head)     //查找已有联系人
{

                char temp[120];

                printf("请输入你要查找姓名:");
                scanf("%s", &temp);
                
                while(head != NULL)
                {
                                if(!strcmp(head->name, temp))
                                {
                                                my_printf(head);
                                }
                                
                                head = head->next;
                                
                                if(head == NULL)
                                {
                                                printf("该通讯录中没有%s的信息\n", temp);
                                }
                }
}
void changePerson(PNODE head)   //更改已有联系人
{
                char temp[120];
                PNODE first;
                PNODE second;

                first = (PNODE)malloc(sizeof(NODE));

                printf("请输入你要更改的通讯录:");
                scanf("%s",&temp);

                /*printf("将%s的目录更改为:\n", temp);*/
                /*my_scanf(first);*/

                while(head != NULL)
                {
                                if(!strcmp(head->name, temp))
                                {
                                                printf("将%s的目录更改为:\n", temp);
                                                my_scanf(head);
                                                break;
                                }
                                                
                                head = head->next;

                                if(head == NULL)
                                {
                                                printf("该通讯录中没有%s的信息,可以更改\n", temp);
                                }
                }

                /*while(head != NULL)
                {
                                second = head;
                                head = head->next;
                                if(!strcmp(head->name, temp))
                                {
                                                break;
                                }
                }*/
                
}
void delPerson(PNODE head)      //删除已有联系人,并同时释放内存空间
{
                char temp[120];
                PNODE first;
                PNODE second;

                printf("请输入你要删除通讯录的姓名:");
                scanf("%s", &temp);

                while(head != NULL)
                {
                                first = head;
                                head = head->next;
                                second = head;
                                if(!strcmp(head->name, temp))
                                {
                                                first->next = head->next;
                                                free(second);
                                                break;
                                }

                                if(head == NULL)
                                {
                                                printf("未找到要删除的通讯录");
                                }
                }

}
void my_printf(PNODE phead)
{
                printf("以查找的你所需要的信息内容如下:\n");
                printf("姓名:%s\n", phead->name);
                printf("电话:%s\n", phead->number);
                printf("地址:%s\n", phead->addr);
}
void displayPerson(PNODE head)  //显示当前通讯录
{
                PNODE temp;
                temp = head->next;
                
                while(temp != NULL)
                {
                                printf("姓名:%s\n", temp->name);
                                printf("电话:%s\n", temp->number);
                                printf("地址:%s\n", temp->addr);
                                temp = temp->next;
                }
}
void releasePerson(PNODE *head)  //退出通讯录程序,释放内存空间
{
                PNODE temp;
                
                while(*head != NULL)
                {
                                temp = (*head)->next;
                                *head = (*head)->next;
                                free(temp);
                }
}

int main(void)
{
                PNODE head;
                head->next = NULL;
                int ch;

                printf("插入新的联系人'1'\n");
                printf("查找已有联系人'2'\n");
                printf("更改已有联系人'3'\n");
                printf("删除已有联系人'4'\n");
                printf("显示当前目录'5'\n");
                printf("退出通讯录,并释放空间'6'\n");

                while(1)
                {
                                printf("请输入代码:");

                                if((ch = getchar()) == '1')
                                {
                                                addPerson(&head);
                                }
                                else if(ch == '2')
                                {
                                                fidPerson(head);
                                }
                                else if(ch == '3')
                                {
                                                changePerson(head);
                                }
                                else if(ch == '4')
                                {
                                                delPerson(head);
                                }
                                else if(ch == '5')
                                {
                                                displayPerson(head);
                                }
                                else if(ch == '6')
                                {
                                                releasePerson(&head);
                                                break;
                                }
                                else
                                {
                                                getchar();
                                                printf("您输入的信息有误请从新输入\n");
                                }
                                getchar();
                }
                



                return 0;
}
最佳答案
2018-4-19 18:18:45
138行要写成
scanf("%s", temp);
那个删除功能的函数我给改写了一下,,
void delPerson(PNODE head)      //删除已有联系人,并同时释放内存空间
{
        char temp[120];
        PNODE first;
        PNODE second;

        printf("请输入你要删除通讯录的姓名:");
        scanf("%s", temp);//这里要写对
        if (head->next == NULL){
                printf("通讯录为空\n");
                return;
        }


        while (head->next != NULL)
        {
                first = head;
                head = head->next;
                second = head;
                if (!strcmp(head->name, temp))
                {
                        first->next = head->next;
                        free(second);
                        break;
                }

                if (head->next == NULL)
                {
                        printf("未找到要删除的通讯录");
                }
        }

}

这个时侯这个功能可以正常运行了,
但是还有主函数中的前两句:
PNODE head = (PNODE)malloc(sizeof(NODE));//这里要动态申请空间
        head->next = NULL;//这里要是用的话一定要之前动态申请空间啊
不是很明白楼主为啥要head->next = NULL;
我没有看过这个视频,但是感觉这个head->next = NULL;有点怪,还有注意看我的注释,main函数里没有分配空间的话我的VS2013是运行时Runtime Error的,
还有这个程序的功能4是解决了,但是功能6还是有一点问题,自己可以试一下,找一找bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-19 18:18:45 | 显示全部楼层    本楼为最佳答案   
138行要写成
scanf("%s", temp);
那个删除功能的函数我给改写了一下,,
void delPerson(PNODE head)      //删除已有联系人,并同时释放内存空间
{
        char temp[120];
        PNODE first;
        PNODE second;

        printf("请输入你要删除通讯录的姓名:");
        scanf("%s", temp);//这里要写对
        if (head->next == NULL){
                printf("通讯录为空\n");
                return;
        }


        while (head->next != NULL)
        {
                first = head;
                head = head->next;
                second = head;
                if (!strcmp(head->name, temp))
                {
                        first->next = head->next;
                        free(second);
                        break;
                }

                if (head->next == NULL)
                {
                        printf("未找到要删除的通讯录");
                }
        }

}

这个时侯这个功能可以正常运行了,
但是还有主函数中的前两句:
PNODE head = (PNODE)malloc(sizeof(NODE));//这里要动态申请空间
        head->next = NULL;//这里要是用的话一定要之前动态申请空间啊
不是很明白楼主为啥要head->next = NULL;
我没有看过这个视频,但是感觉这个head->next = NULL;有点怪,还有注意看我的注释,main函数里没有分配空间的话我的VS2013是运行时Runtime Error的,
还有这个程序的功能4是解决了,但是功能6还是有一点问题,自己可以试一下,找一找bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 21:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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