下面是C语言基于单链表实现通讯录功能的完整攻略。
一、需求分析
通讯录功能要求包括以下内容:
- 添加联系人;
- 删除联系人;
- 查找联系人;
- 查看联系人列表;
- 修改联系人信息。
为了实现这个功能,我们可以使用单链表来存储联系人的数据,并且定义结构体来表示每个联系人的信息,结构体至少包括姓名和电话两个属性。
二、设计算法
- 初始化链表:创建一个头节点,并将头指针指向该节点;
- 添加联系人:在尾节点后插入一个新节点;
- 删除联系人:根据用户输入的联系人名称在链表中查找节点,并将该节点从链表中删除;
- 查找联系人:根据用户输入的联系人名称在链表中查找节点,并返回该节点信息;
- 查看联系人列表:将链表中所有联系人信息依次输出;
- 修改联系人信息:根据用户输入的联系人名称在链表中查找节点,并修改该节点信息。
三、具体实现
下面我们来具体实现上面的算法。
首先,定义一个结构体来保存联系人信息:
typedef struct _Contact {
char name[20]; // 姓名
char phone[20]; // 电话
struct _Contact *next; // 指向下一个节点的指针
} Contact;
接下来,定义链表添加节点和删除节点的函数:
// 添加联系人到链表尾部
void add_contact(Contact **head, Contact *new_contact) {
Contact *p = *head;
while (p->next) {
p = p->next;
}
p->next = new_contact;
}
// 删除指定联系人
void delete_contact(Contact **head, char *name) {
Contact *p1 = *head;
Contact *p2 = p1->next;
while (p2 && strcmp(p2->name, name) != 0) {
p1 = p1->next;
p2 = p2->next;
}
if (!p2) {
printf("联系人不存在\n");
return;
}
p1->next = p2->next;
free(p2);
}
然后,定义显示链表中所有联系人的函数:
// 显示所有联系人
void show_contacts(Contact *head) {
Contact *p = head->next;
while (p) {
printf("姓名:%s 电话:%s\n", p->name, p->phone);
p = p->next;
}
}
接下来,我们来实现交互式控制台界面,让用户可以方便地使用通讯录功能:
int main() {
Contact *head = (Contact *)malloc(sizeof(Contact));
head->next = NULL;
while (true) {
printf("请选择您要进行的操作:\n");
printf("1. 添加联系人\n");
printf("2. 删除联系人\n");
printf("3. 查找联系人\n");
printf("4. 查看联系人列表\n");
printf("5. 修改联系人信息\n");
printf("6. 退出程序\n");
int choice;
scanf("%d", &choice);
if (choice == 1) {
printf("请输入联系人姓名和电话,用空格隔开:\n");
Contact *new_contact = (Contact *)malloc(sizeof(Contact));
scanf("%s %s", new_contact->name, new_contact->phone);
new_contact->next = NULL;
add_contact(&head, new_contact);
printf("联系人添加成功!\n");
} else if (choice == 2) {
printf("请输入要删除的联系人姓名:\n");
char name[20];
scanf("%s", name);
delete_contact(&head, name);
printf("联系人删除成功!\n");
} else if (choice == 3) {
printf("请输入要查找的联系人姓名:\n");
char name[20];
scanf("%s", name);
Contact *p = head->next;
while (p && strcmp(p->name, name) != 0) {
p = p->next;
}
if (!p) {
printf("联系人不存在\n");
} else {
printf("姓名:%s 电话:%s\n", p->name, p->phone);
}
} else if (choice == 4) {
show_contacts(head);
} else if (choice == 5) {
printf("请输入要修改的联系人姓名:\n");
char name[20];
scanf("%s", name);
Contact *p = head->next;
while (p && strcmp(p->name, name) != 0) {
p = p->next;
}
if (!p) {
printf("联系人不存在\n");
} else {
printf("请输入联系人的新电话:\n");
scanf("%s", p->phone);
printf("联系人信息修改成功!\n");
}
} else if (choice == 6) {
break;
} else {
printf("无效的选项,请重新选择!\n");
}
}
return 0;
}
四、示例说明
我们来看两个使用示例。
示例一:添加联系人
用户选择1,然后输入联系人姓名和电话:
请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
1
请输入联系人姓名和电话,用空格隔开:
Alice 13312345678
联系人添加成功!
下面执行查看联系人列表操作,可以看到已经添加的联系人信息:
请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
4
姓名:Alice 电话:13312345678
示例二:删除联系人
用户选择2,然后输入要删除的联系人姓名:
请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
2
请输入要删除的联系人姓名:
Alice
联系人删除成功!
下面再次执行查看联系人列表操作,可以看到该联系人已经被删除:
请选择您要进行的操作:
1. 添加联系人
2. 删除联系人
3. 查找联系人
4. 查看联系人列表
5. 修改联系人信息
6. 退出程序
4
输出结果为空,说明联系人已经被删除了。
五、总结
这里我们简单说明了如何基于单链表实现通讯录功能。通过对链表的添加、删除、查找等操作,结合交互式控制台界面,我们能够实现一个功能简单但实用的通讯录应用程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言基于单链表实现通讯录功能 - Python技术站