题目:通讯录的维护——单链表应用问题说明:假设有一个通讯录,信息包括:姓名、电话号码、邮箱。现在需要你设计程序来实现通讯录的建立、信息插入、信息删除等操作。操作要求:初始化一个以单链表为存储结构的线性表;按姓名首字母顺序插入若干条通讯录信息(提示:使用直接插入排序);按指定的姓名,查找显示出该条通讯录,待用户确认后删除该条记录录。注意:程序应以菜单控制的方式运行。(即,以上的(2)、(3)功能可以反复多次的执行。)
该回答引用ChatGPT4与博主@晓码自在合作编写:
这里是一个解决该问题的C++程序:
cpp
#include <iostream>
#include <string>
using namespace std;
// 联系人信息结构体
struct PersonInfo {
string name;
string tel;
string email;
PersonInfo *next;
};
// 通讯录结构体
struct AddressList {
PersonInfo *head; // 链表头指针
};
// 初始化通讯录
AddressList initList() {
AddressList list;
list.head = nullptr;
return list;
}
// 按名称插入联系人
void insertPerson(AddressList &list, string name, string tel, string email) {
// 创建新节点
PersonInfo *newNode = new PersonInfo();
newNode->name = name;
newNode->tel = tel;
newNode->email = email;
// 空链表,新节点为头节点
if (list.head == nullptr) {
list.head = newNode;
return;
}
// 找到插入位置
PersonInfo *curr = list.head;
PersonInfo *prev = nullptr;
while (curr != nullptr && curr->name < name) {
prev = curr;
curr = curr->next;
}
// 插入新节点
if (prev == nullptr) { // 插入至头节点
newNode->next = list.head;
list.head = newNode;
} else {
prev->next = newNode;
newNode->next = curr;
}
}
// 查找并删除指定联系人
void deletePerson(AddressList &list, string name) {
PersonInfo *curr = list.head;
PersonInfo *prev = nullptr;
while (curr != nullptr && curr->name != name) {
prev = curr;
curr = curr->next;
}
// 找到指定联系人
if (curr != nullptr) {
if (prev == nullptr) { // 删除头节点
list.head = curr->next;
} else {
prev->next = curr->next;
}
delete curr;
cout << "成功删除联系人:" << name << endl;
} else {
cout << "未找到联系人:" << name << endl;
}
}
int main() {
AddressList list = initList();
//菜单
while (true) {
cout << "1. 添加联系人" << endl;
cout << "2. 删除联系人" << endl;
cout << "3. 退出" << endl;
cout << "请选择:";
string choice;
cin >> choice;
if (choice == "1") {
// 添加联系人
string name, tel, email;
cout << "姓名:";
cin >> name;
cout << "电话:";
cin >> tel;
cout << "邮箱:";
cin >> email;
insertPerson(list, name, tel, email);
} else if (choice == "2") {
// 删除联系人
cout << "请输入要删除的联系人姓名:";
string name;
cin >> name;
deletePerson(list, name);
} else if (choice == "3") {
break;
}
}
}
这个程序实现了:
关键在于单链表的插入、删除操作以及查找指定节点。