需求:實現一個可存儲 1000 人信息的通訊錄,每人包含姓名、性別、年齡、電話、住址。提供菜單驅動的 7 大功能:添加、刪除、查找、修改、顯示全部、清空、按姓名排序。
contact.h):定義結構體 Peo(單人信息)與 Contact(通訊錄陣列+計數器),聲明所有操作函式。test.c):菜單顯示、用戶輸入接收、switch 分發調用具體功能函式。contact.c):各具體操作的邏輯代碼,均接收 Contact* 指針操作同一份數據。#pragma once
typedef struct Peo {
char name[20];
char sex[4];
int age;
char tell[12];
char address[20];
} Peo;
typedef struct Contact {
Peo Dhb[1000];
int count;
} Contact;
void add_stu(Contact *p);
void del_stu(Contact *p);
void find_stu(Contact *p);
void modify_stu(Contact *p);
void show_stu(Contact *p);
void clear_stu(Contact *p);
void sort_stu(Contact *p);
// 統一查找函式,返回索引或 -1
int search(Contact *p, char *name) {
for (int i = 0; i < p->count; i++)
if (strcmp(p->Dhb[i].name, name) == 0) return i;
return -1;
}
// 添加
void add_stu(Contact *p) {
scanf("%s %s %d %s %s", p->Dhb[p->count].name, p->Dhb[p->count].sex,
&p->Dhb[p->count].age, p->Dhb[p->count].tell, p->Dhb[p->count].address);
p->count++;
printf("添加成功\n");
}
// 刪除(覆蓋法)
void del_stu(Contact *p) {
char name[20]; scanf("%s", name);
int idx = search(p, name);
if (idx != -1) {
for (int i = idx; i < p->count - 1; i++) p->Dhb[i] = p->Dhb[i + 1];
p->count--; printf("刪除成功\n");
} else printf("不存在\n");
}
// 排序(冒泡法按姓名升序)
void sort_stu(Contact *p) {
for (int i = 0; i < p->count - 1; i++)
for (int j = 0; j < p->count - 1 - i; j++)
if (strcmp(p->Dhb[j].name, p->Dhb[j+1].name) > 0) {
Peo tmp = p->Dhb[j];
p->Dhb[j] = p->Dhb[j+1];
p->Dhb[j+1] = tmp;
}
show_stu(p);
}
Contact con = {0};
void menu() { /* 打印 1~7 選項 */ }
void test() {
int input = 1;
while (input) {
menu();
scanf("%d", &input);
switch (input) {
case 1: add_stu(&con); break;
case 2: del_stu(&con); break;
case 3: find_stu(&con); break;
case 4: modify_stu(&con); break;
case 5: show_stu(&con); break;
case 6: clear_stu(&con); break;
case 7: sort_stu(&con); break;
case 0: exit(0);
}
}
}
int main() { test(); return 0; }
scanf("%s") 遇空格截斷,姓名/地址含空格時需改用 fgets 並去換行。scanf("%19s") 限制寬度。qsort。