通讯录的维护 ~单链表应用问题

题目:通讯录的维护——单链表应用问题说明:假设有一个通讯录,信息包括:姓名、电话号码、邮箱。现在需要你设计程序来实现通讯录的建立、信息插入、信息删除等操作。操作要求:初始化一个以单链表为存储结构的线性表;按姓名首字母顺序插入若干条通讯录信息(提示:使用直接插入排序);按指定的姓名,查找显示出该条通讯录,待用户确认后删除该条记录录。注意:程序应以菜单控制的方式运行。(即,以上的(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;
        }
    }
}

这个程序实现了:

  1. 单链表存储结构的通讯录
  2. 按姓名首字母顺序插入联系人信息
  3. 删除指定联系人信息
  4. 菜单界面控制各个功能

关键在于单链表的插入、删除操作以及查找指定节点。