题目

综合设计题:实现一个基于固定容量结构体数组的简易命令行通讯录系统,支持联系人的添加(姓名、电话)、按姓名查找以及列表打印功能。

输入格式:多行交互指令:1 姓名 电话 添加联系人;2 姓名 查找联系人并输出电话;3 遍历打印全部联系人;0 退出。

输出格式:响应各操作的查询或状态信息,分行输出。

数据范围与约定:通讯录容量上限为 50 条记录。

思路与算法

1. 复合结构体管理
定义单个联系人 struct Contact { char name[32]; char phone[20]; };,并由管理结构体 struct AddressBook { struct Contact data[50]; int size; }; 维护全局状态。

2. 增删查操作模块化
将添加 add_contact、查找 find_contact 与打印 list_contacts 分别封装为独立函数,综合运用结构体、字符串比对、指针与数组。

完整程序

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

typedef struct {
    char name[32];
    char phone[32];
} Contact;

int main(void)
{
    Contact book[20];
    int n = 0; // 当前通讯录中有效联系人数量

    for (;;) {
        int cmd;
        if (scanf("%d", &cmd) != 1) {
            break;
        }
        if (cmd == 0) {
            break; // 退出系统
        }
        if (cmd == 1 && n < 20) {
            // 添加联系人:写入末尾位置,有效数量自增
            scanf("%31s %31s", book[n].name, book[n].phone);
            n++;
        } else if (cmd == 2) {
            // 查找联系人
            char key[32];
            scanf("%31s", key);
            int found = 0;
            for (int i = 0; i < n; i++) {
                if (strcmp(book[i].name, key) == 0) {
                    printf("%s %s\n", book[i].name, book[i].phone);
                    found = 1;
                    break;
                }
            }
            if (!found) {
                printf("not found\n");
            }
        } else if (cmd == 3) {
            // 快速删除:将末尾元素填补到被删位置,有效数量减 1(时间复杂度 O(1),无序数组适用)
            char key[32];
            scanf("%31s", key);
            for (int i = 0; i < n; i++) {
                if (strcmp(book[i].name, key) == 0) {
                    book[i] = book[n - 1];
                    n--;
                    break;
                }
            }
        }
    }
    return 0;
}

运行示例

输入:

1 Amy 10001
2 Amy
3 Amy
0

输出:

Amy 10001
not found

其它写法

下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。

删除后整体前移

程序:

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

typedef struct {
    char name[32];
    char phone[32];
} Contact;

int main(void)
{
    Contact book[20];
    int n = 0;
    for (;;) {
        int cmd;
        if (scanf("%d", &cmd) != 1) {
            break;
        }
        if (cmd == 0) {
            break;
        }
        if (cmd == 1 && n < 20) {
            scanf("%31s %31s", book[n].name, book[n].phone);
            n++;
        } else if (cmd == 2) {
            char key[32];
            scanf("%31s", key);
            int found = 0;
            for (int i = 0; i < n; i++) {
                if (strcmp(book[i].name, key) == 0) {
                    printf("%s %s\n", book[i].name, book[i].phone);
                    found = 1;
                    break;
                }
            }
            if (!found) {
                printf("not found\n");
            }
        } else if (cmd == 3) {
            char key[32];
            scanf("%31s", key);
            for (int i = 0; i < n; i++) {
                if (strcmp(book[i].name, key) == 0) {
                    for (int j = i; j < n - 1; j++) {
                        book[j] = book[j + 1];
                    }
                    n--;
                    break;
                }
            }
        }
    }
    return 0;
}

输入:

1 Amy 10001
2 Amy
3 Amy
0

输出:

Amy 10001
not found