L1ve 发表于 2023-9-13 14:33:21

单链表的通讯录作业

main函数

#include <stdio.h>
#include "add.h"
#include "display.h"
#include "find.h"

struct Address
{
        char name;
        char number;
        struct Address* next;
};

int main(void)
{
        printf("| 欢 迎 使 用 通 讯 录 管 理 程 序 |\n");
        printf("|--- 1:插入新的联系人 ---|\n");
        printf("|--- 2:查找已有联系人 ---|\n");
        printf("|--- 3:更改已有联系人 ---|\n");
        printf("|--- 4:删除已有联系人 ---|\n");
        printf("|--- 5:显示当前通讯录 ---|\n");
        printf("|--- 6:退出通讯录程序 ---|\n");
        printf("|---Power by Rui Qiang---|\n");
        putchar('\n');

        int caozuo;
        struct Address* contacts;
       

        while (1)
        {
                printf("请输入指令代码:");
                scanf("%d", &caozuo);
                //输入操作代码
               
                //操作1添加联系人
                if (caozuo == 1)
                {
                        addperson(&contacts);
                }
               
                //操作2搜索联系人
                else if (caozuo == 2)
                {
                        struct Address *person;
                        char target;
                       
                        printf("请输入需要搜索的联系人信息:");
               
                        scanf("%s", target);
                        person = findPerson(contacts, target);
               
                        if(person == NULL)
                        {
                                printf("对不起,没找到!\n");
                        }
                        else
                        {
                                findResult(person);
                        }
                }
               
               
                //操作3
                else if (caozuo == 3)
                {
                        printf("操作3");
                }
               
               
                //操作4
                else if (caozuo == 4)
                {
                        printf("操作4");
                }
               
                //操作5显示联系人
                else if (caozuo == 5)
                {
                        displayContacts(contacts);
                }
               
                //操作6
                else if (caozuo == 6)
                {
                        printf("操作6");
                        break;
                }
                putchar('\n');
        }


        return 0;
}
添加联系人函数
#include <stdio.h>
#include <stdlib.h>

struct Address
{
        char name;
        char number;
        struct Address* next;
};

void getInput(struct Address* persons)
{
        printf("请输入联系人名字(不要加空格):");
        scanf("%s", persons->name);
        printf("请输入联系人联系方式:");
        scanf("%s", persons->number);
}

void addperson(struct Address** persons)
{
        struct Address* person;
        static struct Address* tail;

        person = (struct Address*)malloc(sizeof(struct Address));

        if (person == NULL)
        {
                printf("分配内存失败");
                exit(1);
        }

        getInput(person);

        if (*persons == NULL)
        {
                *persons = person;
                person->next = NULL;
        }
        else
        {
                tail->next = person;
                person->next = NULL;
        }
        tail = person;
}
搜索函数
#include <stdio.h>
#include <string.h>

struct Address
{
        char name;
        char number;
        struct Address* next;
};

struct Address* findPerson(struct Address *contacts,char *target)
{
        struct Address *person;
       
        person = contacts;
       
        while(1)
        {
                if(!strcmp(person->name, target) || !strcmp(person->number, target))
                {
                        break;
                }
                person = person->next;
        }
        return person;
}

void findResult(struct Address *person)
{
        printf("结果是:\n");
        printf("联系人:%s\n",person->name);
        printf("联系方式:%s\n", person->number);
}
展示联系人信息函数
#include <stdio.h>

struct Address
{
        char name;
        char number;
        struct Address* next;
};

void displayContacts(struct Address *contacts)
{
        struct Address *person;
        person = contacts;
       
        int count = 1;//计数联系人第几号
       
        while(person != NULL)
        {
                printf("联系人%d:", count);
                printf("%s\n", person->name);
                printf("联系方式:");
                printf("%s\n", person->number);
                count++;
                person = person->next;
                putchar('\n');
        }
}


在我编写好添加联系人函数和显示函数后,运行没有问题,但是把搜索联系人函数加进去后就有问题了


isdkz 发表于 2023-9-13 14:33:25

很抱歉,您没有提供足够的信息让我能够回答您的问题。请提供更具体的问题或上下文,这样我才能够帮助您。谢谢!

yinda_peng 发表于 2023-9-13 16:32:10

本帖最后由 yinda_peng 于 2023-9-13 16:42 编辑

这个报错发生在tail这一句的话,有可能是tail->next为空然后去写入,就会报这个错误,但是你说你在没有加入搜索函数之前是正常的,可能是你将tail设置为静态变量的问题,但问题在于你的搜索函数并没有用到tail,我初步暂时没有看出问题所在

yinda_peng 发表于 2023-9-13 17:00:16

本帖最后由 yinda_peng 于 2023-9-13 17:22 编辑



跑你的代码情况相同,不过我不懂汇编,看了debug也不太明白,尝试过给tail一个初始值等一些操作但是没有用,可能我没办法解决你的问题
页: [1]
查看完整版本: 单链表的通讯录作业