题目
综合:通讯录(增删查,固定容量数组版)
思路
结构体数组存姓名电话,菜单 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