基于带头节点的单链表和C++语言写的一个简易通讯录管理系统,包含文件读取、文件保存、联系人添加、联系人删除、联系人查询、联系人修改、通讯录输出、通讯录排序、通讯录清空等功能。
部分界面效果: 主菜单: 添加联系人: 通讯录输出: 联系人查询: 文件保存: 源代码:#include#include #include #include #include #include #include using namespace std; typedef struct { int num; //编号 string name; //姓名 string phonenum; //电话 string address; //地址 string relation; //分组 }ElemType; typedef struct Node { ElemType data; struct Node* next; }Node, * linkList; void Read_linkList(linkList& L); //读取信息 void Save_linkList(const linkList& L); //保存信息 void Init_linkList(linkList& L); //初始化通讯录链表 void Create_linkList(linkList& L); //添加联系人 void Delete_linkList(linkList& L); //删除联系人 void Query_linkList(const linkList& L); //查询联系人 void Modify_linkList(linkList& L); //修改联系人 void Print_linkList(const linkList& L); //通讯录显示 bool compare(const ElemType& t1, const ElemType& t2); //定义sort函数的关系 void Sort_linkList(linkList& L); //通讯录排序 void Clear_linkList(linkList& L); //通讯录清空 void menu(linkList& L); //主控菜单 int main() { system("color 70"); linkList L; Init_linkList(L); Read_linkList(L); menu(L); return 0; } void Read_linkList(linkList& L) { Node* p = L; ifstream infile("contact.txt", ios::in); int len = 0; infile >> len; ElemType tem; while (len--) { infile >> tem.num >> tem.name >> tem.phonenum >> tem.address >> tem.relation; Node* t = new Node; t->data = tem; t->next = NULL; p->next = t; p = p->next; } infile.close(); } void Save_linkList(linkList& L) { Node* t = L, * cnt = L; ofstream outfile("contact.txt", ios::out); int len = 0; while (cnt->next) { len++; cnt = cnt->next; } outfile << len << endl; while (t) { if (t != L) outfile << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; t = t->next; } outfile.close(); } void Init_linkList(linkList& L) { L = new Node; L->next = NULL; } void Create_linkList(linkList& L) { system("cls"); cout << "ttt**************欢迎来到添加联系人功能***************" << endl; Node* t = L; int i = 1, flag = 1; while (t->next) { i++; t = t->next; } while (flag) { Node* p = new Node; cout << "ttt输入姓名:"; cin >> p->data.name; cout << "ttt输入电话:"; cin >> p->data.phonenum; cout << "ttt输入地址:"; cin >> p->data.address; cout << "ttt输入分组:"; cin >> p->data.relation; p->data.num = i++; p->next = NULL; t->next = p; t = t->next; Save_linkList(L); //将改动保存至文件中 cout << "ttt添加成功!是否继续添加?(1 是 0 否)" << endl; cout << "ttt请选择【0-1】:"; cin >> flag; } } void Delete_linkList(linkList& L) { system("cls"); cout << "ttt**************欢迎来到删除联系人功能***************" << endl; int sel = 0; Node* p = L, * t = NULL; ElemType tem; cout << "ttt-----------------" << endl; cout << "ttt1 按编号删除" << endl; cout << "ttt2 按姓名删除" << endl; cout << "ttt3 返回主菜单" << endl; cout << "ttt-----------------" << endl; cout << "ttt请选择【1-3】:"; cin >> sel; while (sel < 1 || sel>3) { cout << "ttt输入不合法,请重新选择【1-3】:"; cin >> sel; } if (sel == 1) { int flag = 0; cout << "ttt请输入待删除联系人的编号:"; cin >> tem.num; while (p->next) { t = p->next; if (t->data.num == tem.num) { cout << "ttt待删除联系人信息如下:" << endl; cout << "ttt编号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; flag = 1; break; } p = p->next; } if (flag == 0) cout << "ttt查无此人,无法删除!" << endl; else { cout << "ttt确认删除?(1 是 0 否)" << endl; cout << "ttt请选择【0-1】:"; cin >> sel; while (sel < 0 || sel>1) { cout << "ttt输入不合法,请重新选择【0-1】:"; cin >> sel; } if (sel == 0); else if (sel == 1) { p->next = t->next; delete t; cout << "ttt删除成功!" << endl; Save_linkList(L); //改动保存至文件中 } } cout << "nttt"; system("pause"); Delete_linkList(L); } else if (sel == 2) { int flag = 0; cout << "ttt请输入待删除联系人的姓名:"; cin >> tem.name; while (p->next) { t = p->next; if (t->data.name == tem.name) { cout << "ttt待删除联系人信息如下:" << endl; cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; flag = 1; break; } p = p->next; } if (flag == 0) cout << "ttt查无此人,无法删除!" << endl; else { cout << "ttt确认删除?(1 是 0 否)" << endl; cout << "ttt请选择【0-1】:"; cin >> sel; while (sel < 0 || sel>1) { cout << "ttt输入不合法,请重新选择【0-1】:"; cin >> sel; } if (sel == 0); else if (sel == 1) { p->next = t->next; delete t; cout << "ttt删除成功!" << endl; Save_linkList(L); //改动保存至文件中 } } cout << "nttt"; system("pause"); Delete_linkList(L); } else if (sel == 3) return; } void Query_linkList(const linkList& L) { system("cls"); cout << "ttt**************欢迎来到查询联系人功能***************" << endl; int sel = 0; Node* t = L; ElemType tem; cout << "ttt-----------------" << endl; cout << "ttt1 按编号查询" << endl; cout << "ttt2 按姓名查询" << endl; cout << "ttt3 返回主菜单" << endl; cout << "ttt-----------------" << endl; cout << "ttt请选择【1-3】:"; cin >> sel; while (sel < 1 || sel>3) { cout << "ttt输入不合法,请重新选择【1-3】:"; cin >> sel; } if (sel == 1) { int flag = 0; cout << "ttt请输入待查询联系人的编号:"; cin >> tem.num; while (t->next) { t = t->next; if (t->data.num == tem.num) { cout << "ttt待查询联系人信息如下:" << endl; cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; flag = 1; break; } } if (flag == 0) cout << "ttt查无此人!" << endl; cout << "nttt"; system("pause"); Query_linkList(L); } else if (sel == 2) { int flag = 0; cout << "ttt请输入待查询联系人的姓名:"; cin >> tem.name; while (t->next) { t = t->next; if (t->data.name == tem.name) { cout << "ttt待查询联系人信息如下:" << endl; cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; flag = 1; break; } } if (flag == 0) cout << "ttt查无此人!" << endl; cout << "nttt"; system("pause"); Query_linkList(L); } else if (sel == 3) { return; } } void Modify_linkList(linkList& L) { system("cls"); cout << "ttt**************欢迎来到修改联系人功能***************" << endl; int sel = 0; Node* t = L; ElemType tem; cout << "ttt-----------------" << endl; cout << "ttt1 按编号修改" << endl; cout << "ttt2 按姓名修改" << endl; cout << "ttt3 返回主菜单" << endl; cout << "ttt-----------------" << endl; cout << "ttt请选择【1-3】:"; cin >> sel; while (sel < 1 || sel>3) { cout << "ttt输入不合法,请重新输入【1-3】:"; cin >> sel; } if (sel == 1) { int flag = 0; cout << "ttt请输入待修改联系人的编号:"; cin >> tem.num; while (t->next) { t = t->next; if (t->data.num == tem.num) { cout << "ttt待修改联系人信息如下:" << endl; cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; flag = 1; break; } } if (flag == 0) cout << "ttt查无此人,无法修改!" << endl; else { ElemType tem; cout << "ttt输入修改后的联系人信息:" << endl; cout << "ttt输入姓名:"; cin >> tem.name; cout << "ttt输入电话:"; cin >> tem.phonenum; cout << "ttt输入地址:"; cin >> tem.address; cout << "ttt输入分组:"; cin >> tem.relation; tem.num = t->data.num; cout << "ttt确认修改?(1 是 0 否)" << endl; cout << "ttt请选择【0-1】:"; cin >> sel; while (sel < 0 || sel>1) { cout << "ttt输入不合法,请重新选择【0-1】:"; cin >> sel; } if (sel == 0); else if (sel == 1) { t->data = tem; cout << "ttt修改成功!" << endl; Save_linkList(L); //将改动保存至文件中 } } cout << "nttt"; system("pause"); Modify_linkList(L); } else if (sel == 2) { int flag = 0; cout << "ttt请输入待修改联系人的姓名:"; cin >> tem.name; while (t->next) { t = t->next; if (t->data.name == tem.name) { cout << "ttt待修改联系人信息如下:" << endl; cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; flag = 1; break; } } if (flag == 0) cout << "ttt查无此人,无法修改!" << endl; else { ElemType tem; cout << "ttt输入修改后的联系人信息:" << endl; cout << "ttt输入姓名:"; cin >> tem.name; cout << "ttt输入电话:"; cin >> tem.phonenum; cout << "ttt输入地址:"; cin >> tem.address; cout << "ttt输入分组:"; cin >> tem.relation; tem.num = t->data.num; cout << "ttt确认修改?(1 是 0 否)" << endl; cout << "ttt请选择【0-1】:"; cin >> sel; while (sel < 0 || sel>1) { cout << "ttt输入不合法,请重新选择【0-1】:"; cin >> sel; } if (sel == 0); else if (sel == 1) { t->data = tem; cout << "ttt修改成功!" << endl; Save_linkList(L); //将改动保存至文件中 } } cout << "nttt"; system("pause"); Delete_linkList(L); } else if (sel == 3) return; } void Print_linkList(const linkList& L) { system("cls"); cout << "ttt***************欢迎来到通讯录显示功能***************" << endl; Node* t = L->next; cout << "ttt-----------------------------------------------------" << endl; cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt-----------------------------------------------------" << endl; while (t) { cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; t = t->next; } cout << "ttt-----------------------------------------------------" << endl; cout << "ttt"; system("pause"); } bool compare(const ElemType& t1, const ElemType& t2) { return t1.name < t2.name; } void Sort_linkList(linkList& L) { system("cls"); cout << "ttt***************欢迎来到通讯录排序功能***************" << endl; Node* p = L; int cnt = 0, i = 0; while (p->next) { p = p->next; cnt++; } ElemType* arr = new ElemType[cnt]; p = L; while (p->next) { p = p->next; arr[i++] = p->data; } sort(arr, arr + cnt, compare); p = L, i = 0; while (p->next) { p = p->next; p->data = arr[i++]; p->data.num = i; } cout << "ttt对通讯录进行排序并整理如下:" << endl; Node* t = L->next; cout << "ttt-----------------------------------------------------" << endl; cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl; cout << "ttt-----------------------------------------------------" << endl; while (t) { cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl; t = t->next; } cout << "ttt-----------------------------------------------------" << endl; Save_linkList(L); //改动保存至文件中 cout << "ttt"; system("pause"); } void Clear_linkList(linkList& L) { int sel = 0; system("cls"); cout << "ttt**************欢迎来到通讯录清空功能*************" << endl; cout << "ttt-----------------" << endl; cout << "ttt1 确认清空通讯录" << endl; cout << "ttt2 返回主菜单" << endl; cout << "ttt-----------------" << endl; cout << "ttt请慎重选择【1-2】:"; cin >> sel; while (sel < 1 || sel>2) { cout << "ttt输入不合法,请重新输入【1-2】:"; cin >> sel; } if (sel == 1) { Node* head = L; if (head == NULL) { return; } //清空链表,是不清空头节点的,因此从第一个有数据的节点开始释放 Node* curNode = head->next; while (curNode != NULL) { //先保住下一个节点的位置 Node* nextNode = curNode->next; free(curNode); curNode = nextNode; } //将头结点next指针置空 head->next = NULL; Save_linkList(L); cout << "nttt"; system("pause"); } else if (sel == 2) return; } void menu(linkList& L) { char sel; system("cls"); cout << "ttt***********欢迎来到通讯录管理系统***********" << endl; cout << "ttt你可以进行以下操作:" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 1 添加联系人 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 2 删除联系人 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 3 修改联系人 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 4 查询联系人 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 5 通讯录显示 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 6 通讯录排序 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 7 通讯录清空 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt| 0 退出 |" << endl; cout << "ttt|------------------------------------------|" << endl; cout << "ttt请选择【0-7】:"; cin >> sel; while (sel < '0' || sel>'7') { cout << "ttt输入非法,请重新选择【0-7】:"; cin >> sel; } switch (sel) { case '1': Create_linkList(L); menu(L); break; case '2': Delete_linkList(L); menu(L); break; case '3': Modify_linkList(L); menu(L); break; case '4': Query_linkList(L); menu(L); break; case '5': Print_linkList(L); menu(L); break; case '6': Sort_linkList(L); menu(L); break; case '7': Clear_linkList(L); menu(L); break; case '0': exit(0); default: menu(L); } }
有问题欢迎交流~



