题目

综合:通讯录(增删查,固定容量数组版)

思路

结构体数组存姓名电话,菜单 1 追加到 count 2 按名查找 3 删除后前移或标记无效;容量满时拒绝添加,字符串比较用自写或 strcmp

解题分析

固定容量数组版通讯录:末尾下标 n 表示已有条数,添加在尾部写入,查找线性扫描姓名,删除可把最后一条搬到空洞(或整体前移)。数据量 20 以内,O(n) 查找可接受。

完整程序

#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) {
                    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