鱼C论坛

 找回密码
 立即注册
查看: 1170|回复: 6

[已解决]【C语言】通讯录系统设计中遇到的问题

[复制链接]
发表于 2020-9-6 17:53:10 | 显示全部楼层 |阅读模式

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

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

x
各位大佬好!我用C语言编写了个通讯录系统,系统的要求就是小甲鱼视频当中的要求(见下图)。目前在删除通讯录这边碰到了bug。删除通讯录当中的问题就是当我执行删除操作后,整个主函数会直接结束,不知道为什么,还请各位大佬麻烦看看。

小甲鱼的要求:
截屏2020-09-06 下午5.43.56.png

全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Address_book;

void addPreson(struct Address_book **);

void findPerson(struct Address_book *);

void changePerson(struct Address_book *);

void delPerson(struct Address_book **);

void displayContacts(struct Address_book *);

void freeContacts(struct Address_book *);

int main(void) {
    int input;
    char name[40];
    long long phone_number;
    struct Address_book *head = NULL;//头指针

    do {
        printf("请输入操作号码:\n"
               "1.插入新的联系人\t2.查找已有联系人\t3.更改已有联系人\n"
               "4.删除已有联系人\t5.显示当前通讯录\t6.退出通讯录");
        putchar('\n');
        scanf("%d", &input);
        if (input < 1 || input > 6) {
            printf("非法输入!");
            continue;
        }


        switch (input) {
            case 1 :
                addPreson(&head);
                break;
            case 2:
                findPerson(head);
                break;
            case 3:
                changePerson(head);
                break;
            case 4:
                delPerson(&head);
                break;
            case 5:
                displayContacts(head);
                break;
            case 6:
                freeContacts();
                break;
        }
    } while (input != 6);

    return 0;
}

struct Address_book {
    char name[40];
    long long phone_number;
    struct Address_book *next;
};

void addPreson(struct Address_book **head) {    //添加
    struct Address_book *previous;
    struct Address_book *new;

    new = (struct Address_book *) malloc(sizeof(struct Address_book));
    if (new == NULL) {
        printf("分配新空间失败,请重试!");
        exit(1);
    }

    //给new赋值
    printf("请输入添加的联系人姓名:");
    scanf("%s", new->name);
    printf("请输入添加的联系人电话:");
    scanf("%lld", &new->phone_number);

    if (*head != NULL) {
        previous = *head;
        //定义单链表尾部位置
        while (previous->next != NULL) {
            previous = previous->next;
        }
        //插入数据
        previous->next = new;
        new->next = NULL;
    } else {
        *head = new;
        new->next = NULL;
    }
}

void findPerson(struct Address_book *head) {    //查找
    char name[40];
    printf("请输入你想查找的联系人姓名:");
    scanf("%s", name);

    struct Address_book *object;
    object = NULL;
    while (head != NULL) {
        if (!strcmp(head->name, name)) {
            object = head;
            printf("查询完毕!\n");
            printf("联系人姓名:%s\n", name);
            printf("联系人电话%lld\n", object->phone_number);
            return;
        }
        head = head->next;
    }

    printf("未找到该联系人!\n");
}

void changePerson(struct Address_book *head) {  //替换
    char name_1[40];
    printf("请输入替换人的姓名:");
    scanf("%s", name_1);

    while (head != NULL) {
        if (!strcmp(name_1, head->name)) {
            printf("请输入替换后的姓名:");
            scanf("%s", head->name);
            printf("请输入替换后的电话:");
            scanf("%lld", &head->phone_number);
            printf("替换成功!\n");
            return;
        }
        head = head->next;
    }
    printf("未找到该联系人!\n");
}

void delPerson(struct Address_book **head) { //删除指令
    char name[40];
    printf("请输入要删除的联系人姓名:");
    scanf("%s", name);

    struct Address_book *previous = NULL;  //前一个指针
    struct Address_book *current = *head;   //当前要删除的指针

    while ((*head) != NULL) {
        if (!strcmp(current->name, name)) { //定位完毕,删除,结束
            previous->next = current->next;
            free(current);
            return;
        }
        previous = current;
        current = current->next;
    }

    printf("未找到该联系人!\n");//函数走到了最后,说明没能遍历到
}


void displayContacts(struct Address_book *head) {
    struct Address_book *current;
    current = head;
    if (current == NULL) {
        printf("通讯录为空!");
    }
    while (current != NULL) {
        printf("姓名:%s\n", current->name);
        printf("电话:%lld\n", current->phone_number);
        current = current->next;
    }

    putchar('\n');
}

void freeContacts(struct Address_book *head) {
    struct Address_book *temp;
    while (head != NULL) {
        temp = head;
        free(head);
        head = temp->next;
    }
}
最佳答案
2020-9-7 19:00:39
抱歉我说错了,删除函数改成这样
void delPerson(struct Address_book **head) { //删除指令
    char name[40];
    printf("请输入要删除的联系人姓名:");
    scanf("%s", name);

    struct Address_book *previous = *head;  //前一个指针
    struct Address_book *current = *head;   //当前要删除的指针

    while ((*head) != NULL) {
        if (!strcmp(current->name, name)) { //定位完毕,删除,结束
            previous->next = current->next;
            free(current);
            return;
        }
        current = current->next;
    }

    printf("未找到该联系人!\n");//函数走到了最后,说明没能遍历到
}
另外你的56行释放函数也要改一下
freeContacts(head); // 不放参数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-6 17:54:35 | 显示全部楼层
各位大佬不好意思,之前发帖一直碰到问题,所以只能把全部代码一次性发出来了,还麻烦各位大佬找到删除函数了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-6 19:41:52 | 显示全部楼层
代码太长了,我就说哪个地方改吧
144行初始化有误,改为
struct Address_book *previous = *head;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 19:00:39 | 显示全部楼层    本楼为最佳答案   
抱歉我说错了,删除函数改成这样
void delPerson(struct Address_book **head) { //删除指令
    char name[40];
    printf("请输入要删除的联系人姓名:");
    scanf("%s", name);

    struct Address_book *previous = *head;  //前一个指针
    struct Address_book *current = *head;   //当前要删除的指针

    while ((*head) != NULL) {
        if (!strcmp(current->name, name)) { //定位完毕,删除,结束
            previous->next = current->next;
            free(current);
            return;
        }
        current = current->next;
    }

    printf("未找到该联系人!\n");//函数走到了最后,说明没能遍历到
}
另外你的56行释放函数也要改一下
freeContacts(head); // 不放参数?

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
z2521367787 + 5 + 5 + 3 无条件支持楼主!

查看全部评分

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

使用道具 举报

发表于 2020-9-7 19:01:28 | 显示全部楼层
昨天我都忘了。。。可以忽略我上一个答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-9 06:19:40 | 显示全部楼层
没有解决吗?我试的可以啊。看看这个帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-13 09:48:41 | 显示全部楼层
巴巴鲁 发表于 2020-9-7 19:00
抱歉我说错了,删除函数改成这样
另外你的56行释放函数也要改一下

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-28 08:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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