作业:
1> 思维导图
2> 将没有实现的功能实现一遍
3> 将单向链表操作自己再实现一遍
/*******************************************************/ //=> File Name: linklist.h //=> Author: Water //=> Mail: 1249496568@qq.com //=> Created Time: 2024年11月29日 星期五 10时48分03秒 /*******************************************************/#ifndef LINKLIST_H #define LINKLIST_H #include<myhead.h>typedef char datatype; //数据元素类型 //定义结点类型 typedef struct Node {union{int len; //指针长度datatype data; //普通节点数据域};struct Node *next; //指针域 }Node,*Node_ptr; //创建链表 Node_ptr list_create(); //链表判空 static int list_empty(Node_ptr L); //申请结点封装数据 static Node_ptr node_apply(datatype e); //单向链表头插 int list_insert_head(Node_ptr L,datatype e); //按位置查找结点并返回该节点的地址 Node_ptr list_find_node(Node_ptr L,int pos); //单向链表显示 void list_show(Node_ptr L); //单向链表按位置插入 int list_insert_pos(Node_ptr L,int pos,datatype e); //单向链表的尾插 int list_insert_end(Node_ptr L,datatype e); //单向链表头删 int list_del_head(Node_ptr L); //单向链表按位置删除 int list_del_pos(Node_ptr L,int pos); //单向链表尾删 int list_del_end(Node_ptr L); //单向链表按值查找返回位置 int list_find_pos(Node_ptr L,datatype e); //单向链表按位置修改 int list_update_pos(Node_ptr L,int pos,datatype e); //单向链表按值修改 int list_update_value(Node_ptr L,datatype ole_e,datatype new_e); //单向链表逆序 int list_reverse(Node_ptr L); //单向链表排序 int list_sort(Node_ptr L); //单向链表去重 int list_unique(Node_ptr L); //清空单向链表 void list_clear(Node_ptr L); //返回单向链表长度 int list_len(Node_ptr L); //销毁单向链表 void list_free(Node_ptr L); #endif
/*******************************************************/ //=> File Name: linklist.c //=> Author: Water //=> Mail: 1249496568@qq.com //=> Created Time: 2024年11月29日 星期五 10时48分03秒 /*******************************************************/#include"linklist.h"//创建链表 Node_ptr list_create() {//在堆区申请一个头结点的空间Node_ptr L = (Node_ptr)malloc(sizeof(Node));if(NULL == L){printf("单向链表创建失败\n");return NULL;}L->len = 0;L->next = NULL;printf("单向链表创建成功\n");return L; } //链表判空 static int list_empty(Node_ptr L) {//判空if(NULL == L){printf("链表不合法\n");return -1;}return L->next == NULL; } //申请结点封装数据 static Node_ptr node_apply(datatype e) {Node_ptr p = (Node_ptr)malloc(sizeof(Node));if(NULL == p){printf("结点申请失败\n");return NULL;}//将数据封装进结点的数据域p->data = e;p->next = NULL;return p; //将封装好的结点地址返回 } //单向链表头插 int list_insert_head(Node_ptr L,datatype e) {//判断是否合法if(NULL == L){printf("单向链表头插失败\n");return -1;}//申请结点封装数据Node_ptr p = node_apply(e);if(p == NULL){return -1;}//头插逻辑p->next = L->next;L->next = p;//表长变化L->len++;printf("单向链表头插成功\n"); } //按位置查找结点并返回该节点的地址 Node_ptr list_find_node(Node_ptr L,int pos) { //判断是否合法if(NULL == L || pos<0 || pos>L->len){printf("单向链表查找失败\n");return NULL;}Node_ptr key = L;for(int i=0;i<pos;i++){key = key->next;}return key; } //单向链表显示 void list_show(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("单向链表显示失败\n");return;}printf("该单向链表为:\n");/*for(int i=1;i<L->len;i++){Node_ptr key = list_find_node(L,i);printf("%c\t",key->data);}*/Node_ptr key = L->next;while(key){printf("%c\t",key->data);key = key->next;}printf("\n"); } //单向链表按位置插入 int list_insert_pos(Node_ptr L,int pos,datatype e) {//判断是否合法if(NULL == L || pos<1 || pos>L->len+1){printf("单向链表插入失败\n");return -1;}//找到要插入位置的前一个结点Node_ptr key = list_find_node(L,pos-1);//插入//申请结点封装数据Node_ptr p = node_apply(e);if(p == NULL){return -1;}//头插逻辑p->next = key->next;key->next = p;//表长变化L->len++;printf("单向链表第%d位插入成功\n",pos); } //单向链表的尾插 int list_insert_end(Node_ptr L,datatype e) {//判断是否合法if(NULL == L){printf("单向链表尾插失败\n");return -1;}//找到最后一个元素Node_ptr key = list_find_node(L,L->len);//插入 //申请结点封装数据Node_ptr p = node_apply(e);if(p == NULL){return -1;}//头插逻辑p->next = key->next;key->next = p;//表长变化L->len++;printf("单向链表尾插成功\n"); } //单向链表头删 int list_del_head(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("单向链表头删失败\n");return -1;}//标记Node_ptr p = L->next;//孤立L->next = p->next;//释放free(p);//防止野指针p = NULL;//表长变化L->len--;printf("单向链表头删成功\n");return 0; } //单向链表按位置删除 int list_del_pos(Node_ptr L,int pos) {//判断是否合法if(list_empty(L) || NULL == L || pos<1 || pos>L->len){printf("按位置删除失败\n");return -1;}//找到前驱Node_ptr q = list_find_node(L,pos-1);//标记Node_ptr p = q->next;//孤立q->next = p->next;//释放free(p);//防止野指针p = NULL;//表长变化L->len--;printf("单向链表第%d位删除成功\n",pos);return 0; } //单向链表尾删 int list_del_end(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("单向链表尾删失败\n");return -1;}//前驱Node_ptr q = list_find_node(L,L->len-1);//标记Node_ptr p = q->next;//孤立q->next = NULL;//释放free(p);//防止野指针p = NULL;//表长变化L->len--;printf("单向链表尾删成功\n");return 0; } //单向链表按值查找返回位置 int list_find_pos(Node_ptr L,datatype e) {//判断是否合法if(list_empty(L) || NULL == L){printf("单向链表按值查找失败\n");return -1;}Node_ptr key = L->next;for(int i=1;i<L->len;i++){if(key->data == e){printf("%c在该单向链表第%d个元素\n",key->data,i);return i;}key = key->next;}return -1; } //单向链表按位置修改 int list_update_pos(Node_ptr L,int pos,datatype e) {//判断是否合法if(list_empty(L) || NULL == L || pos<1 || pos>L->len){printf("按位置修改失败\n");return -1;}Node_ptr p = list_find_node(L,pos);p->data = e;printf("单向链表第%d位修改成功\n",pos);return 0; } //单向链表按值修改 int list_update_value(Node_ptr L,datatype ole_e,datatype new_e) {//判断是否合法if(list_empty(L) || NULL == L){printf("单向链表按值修改失败\n");return -1;}Node_ptr key = L->next;for(int i=1;i<L->len;i++){if(key->data == ole_e){key->data = new_e;}key = key->next;}printf("单向链表按值修改成功\n");return 0; } //单向链表逆序 int list_reverse(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L || L->len == 1){printf("单向链表逆序失败\n");return -1;}//逆序逻辑Node_ptr H = L->next;L->next = NULL;while(H != NULL){Node_ptr p = H;H = H->next;//以头插的形式将p插入到L中p->next = L->next;L->next = p;}printf("单向链表逆序成功\n");return 0; } //单向链表排序 int list_sort(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L || L->len == 1){printf("单向链表排序失败\n");return -1;}//单向链表排序for(int i=1;i<L->len;i++){for(int j=0;j<L->len-i;j++){Node_ptr m = list_find_node(L,j);Node_ptr n = list_find_node(L,j+1);if(m->data > n->data){Node temp;temp.data = m->data;m->data = n->data;n->data = temp.data;}}}printf("单向链表排序成功\n");return 0; } //单向链表去重 int list_unique(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L || L->len == 1){printf("单向链表去重失败\n");return -1;}//单向链表去重int key = 0;for(int i=1;i<L->len;i++){for(int j=i+1;j<L->len+1;j++){Node_ptr m = list_find_node(L,i);Node_ptr n = list_find_node(L,j);if(m->data == n->data){list_del_pos(L,j);j--;}}}printf("单向链表去重成功\n");return 0; } //清空单向链表 void list_clear(Node_ptr L) {if(NULL == L){printf("单向链表清空失败\n");return;}//对所有普通结点头删while(!list_empty){list_del_head(L);}L->next = NULL;L->len = 0;printf("单向链表清空成功\n"); } //返回单向链表长度 int list_len(Node_ptr L) {if(NULL == L){printf("单向链表返回长度失败\n");return -1;}printf("该单向链表的长度len为:%d\n",L->len);return L->len; } //销毁单向链表 void list_free(Node_ptr L) {if(NULL == L){printf("单向链表销毁失败\n");return;}//释放逻辑//将所有普通结点释放while(!list_empty){list_del_head(L);}//释放头结点free(L);L = NULL;printf("单向链表销毁成功\n"); }
/*******************************************************/ //=> File Name: main.c //=> Author: Water //=> Mail: 1249496568@qq.com //=> Created Time: 2024年11月29日 星期五 10时48分03秒 /*******************************************************/#include"linklist.h"int main(int argc, const char *argv[]) {Node_ptr L = list_create();if(NULL == L){return -1;}//单向链表头插list_insert_head(L,'h');list_insert_head(L,'e');list_insert_head(L,'l');list_insert_head(L,'l');list_insert_head(L,'o');Node_ptr node = list_find_node(L,3);printf("第3位的地址为:%p",node);list_show(L);list_insert_pos(L,1,'w');list_show(L);list_insert_pos(L,L->len+1,'a');list_show(L);list_insert_end(L,'x');list_show(L);list_del_head(L);list_show(L);list_del_pos(L,2);list_show(L);list_del_end(L);list_show(L);list_find_pos(L,'e');list_update_pos(L,1,'h');list_show(L);list_update_value(L,'h','m');list_show(L);list_reverse(L);list_show(L);list_sort(L);list_show(L);list_insert_head(L,'m');list_insert_head(L,'m');list_insert_head(L,'m');list_insert_head(L,'m');list_insert_head(L,'m');list_show(L);list_len(L);list_unique(L);list_show(L);list_len(L);list_clear(L);L = NULL; list_show(L);list_len(L);list_free(L);L = NULL;list_show(L);list_len(L);return 0; }
4> 周末作业:实现数据结构项目
项目:基于链表的通信录管理
意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度
模块:
一级菜单内容
1> 注册模块:完成用户信息的注册用于登录管理系统,将注册信息存入文件
2> 登录模块:使用输入的登录账号和密码与文件存储信息对比
3> 退出系统
二级菜单内容:
3> 创建模块create:创建链表完成对通信录的存储
4> 添加数据add:添加通信录的信息放入链表中
5> 查找信息find:可以通过姓名进行查找
6> 修改信息update:可以修改联系人信息并保存,修改联系人信息有包括了对联系人编号,姓名,性别,电话号码的分别修改,也可以同时对编号,姓名,性别,电话号码修改;
7> 删除信息delete:可根据输入的姓名进行删除
8> 插入信息insert:将给定的信息以及插入位置信息完成插入
9> 展示信息show:将通讯录的所有信息进行展示
10> 导出信息export:将通讯录信息导出到文件中
11> 按照姓名将通讯录排序
12> 返回上一级
辅助功能:
13> 初始化链表init:将链表进行初始化
14> 获取链表长度getLength:
15> 统计性别;
/*******************************************************/ //=> File Name: lianbiaotongxunluguanlixitong.h //=> Author: Water //=> Mail: 1249496568@qq.com //=> Created Time: 2024年11月30日 星期六 09时10分04秒 /*******************************************************/#ifndef TONGXUNLU_H #define TONGXUNLU_H #include<myhead.h>//共用函数声明 void dengdai(); //等待键入回车再返回到主菜单 void error1(); //误输入提示模块 //注册登录模块相关函数声明 int getch(); //按键读取函数 void mima(); //密码隐藏函数 void zhucedenglu(); //注册登录框架 void menu1(); //注册登录循环显示选择模块 void zhuce(); //注册模块 void denglu(); //登录模块 //通讯录管理模块相关函数声明 void tongxunluguanli(); //通讯录管理模块框架 void menu2(); //通讯录菜单循环显示选择模块 void error2(); //误操作提示模块//定义一个通讯录成员结构体 typedef struct Contact {int num;char name[20];char sex[10];char TEL[12]; }Contact,*Contact_ptr; typedef Contact datatype; //数据元素类型//定义结点类型 typedef struct Node {union{int len; //指针长度datatype data; //普通节点数据域};struct Node *next; //指针域 }Node,*Node_ptr;//通讯录管理模块功能函数//创建通讯录链表 Node_ptr case1(); //链表判空 int list_empty(Node_ptr L); //申请结点封装数据 Node_ptr node_apply(datatype e);//新增联系人 void case2(Node_ptr L);//查找联系人 void case3(Node_ptr L);//修改联系人信息 void case4(Node_ptr L);//信息修改选择菜单 void menu3(int * select3);//按位置查找结点并返回该节点的地址 Node_ptr list_find_node(Node_ptr L,int pos);//删除联系人 void case5(Node_ptr L);//插入联系人 void case6(Node_ptr L);//显示联系人信息 void case7(Node_ptr L);//导出联系人信息 void case8(Node_ptr L);//通讯录排序 void case9(Node_ptr L);//辅助功能 void case10(Node_ptr L);//辅助功能菜单 void menu4(int * select4);//通讯录初始化 void list_init(Node_ptr L);//统计联系人性别 void list_sex(Node_ptr L); #endif
/*******************************************************/ //=> File Name: lianbiaotongxunluguanlixitong.c //=> Author: Water //=> Mail: 1249496568@qq.com //=> Created Time: 2024年11月30日 星期六 09时10分04秒 /*******************************************************/#include"lianbiaotongxunluguanlixitong.h" //被调函数 //注册登录模块 //注册登录框架 void zhucedenglu() {char regest_usr[20] = ""; //注册名称char regest_pwd[20] = ""; //注册密码while(1){ int select1 = 0; //菜单1的选项menu1(&select1); //注册登录循环显示选择模块switch(select1) //多分支选择{case 1: //注册账号{zhuce(®est_usr,®est_pwd); //调用注册模块}break;case 2: //登录账号{denglu(®est_usr,®est_pwd); //调用登录模块tongxunluguanli(); //进入通讯录管理模块}break;case 0:exit(0);default:error1(); //误输入提示模块dengdai(); //等待键入回车再返回到主菜单}} } //注册登录循环显示选择模块 void menu1(int * select1) {system("clear"); //清屏printf("=====注册账号=====\n");printf("===1、注册账号====\n");printf("===2、登录账号====\n");printf("===0、退出系统====\n");printf("请键入选项(0~2):");scanf("%d",select1); } //按键读取函数 int getch() {int c = 0;struct termios org_opts, new_opts;int res = 0;res = tcgetattr(STDIN_FILENO, &org_opts);assert(res == 0);new_opts = org_opts;new_opts.c_lflag &= ~(ICANON | ECHO);tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);c = getchar();res = tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);assert(res == 0);return c; } //密码隐藏函数 void mima(char * pass) {int i = 0;while((getchar()) != '\n'); //清空缓冲区while(1){char c=getch();if(c=='\n'){break;}printf("*");pass[i++]=c;} } //注册模块 void zhuce(char * regest_usr,char * regest_pwd) {printf("请输入账号:");scanf("%s",regest_usr);printf("请输入密码:");mima(regest_pwd);printf("\n注册成功,请键入回车返回主菜单\n");getchar(); //等待键入回车再返回到主菜单 } //登录模块 void denglu(char * regest_usr,char * regest_pwd) {while(1){char usrName[20] = ""; //登录账号char pwd[20] = ""; //登录密码printf("请输入账号:");scanf("%s",usrName);printf("请输入密码:");mima(pwd);//判断登录是否成功if(strcmp(usrName,regest_usr) == 0 && strcmp(pwd,regest_pwd) == 0){printf("\n登录成功,请键入回车进入通讯录管理系统\n");getchar(); //等待键入回车再返回到主菜单break;}else{printf("\n登录失败,请重新登录\n");}} } //等待键入回车再返回到主菜单 void dengdai() {while((getchar()) != '\n'); //清空缓冲区getchar(); //等待键入回车再返回到主菜单 } void error1() //误输入提示模块 {printf("输入有误,请键入回车返回主菜单\n"); } //注册登录成功后进入通讯录管模块 //通讯录管理模块及相关函数 //通讯录管理模块框架 void tongxunluguanli() { Node_ptr L = NULL;while(1){int select2 = 0; //选项menu2(&select2); //通讯录菜单循环显示选择模块switch(select2){case 1: //创建通讯录{L = case1();}break;case 2: //新建联系人{case2(L);}break;case 3: //查找联系人{case3(L);}break;case 4: //修改联系人信息{case4(L);}break;case 5: //删除联系人{case5(L);}break;case 6: //插入联系人{case6(L);}break;case 7: //显示联系人信息{case7(L);}break;case 8: //导出联系人信息{case8(L);}break;case 9: //按序显示联系人{case9(L);}break;case 10: //辅助功能{case10(L);}break;case 0: //返回printf("请键入回车返回注册登录系统\n");return;default: //输入错误提示error1(); //误输入提示模块}dengdai(); //等待键入回车再返回到主菜单} } //通讯录菜单循环显示选择模块 void menu2(int * select2) {system("clear"); //清屏printf("===========通讯录管理系统=========\n");printf("==========1.创建通讯录============\n");printf("==========2.新增联系人============\n");printf("==========3.查找联系人============\n");printf("==========4.修改联系人信息========\n");printf("==========5.删除联系人============\n");printf("==========6.插入联系人============\n");printf("==========7.显示联系人信息========\n");printf("==========8.导出联系人信息========\n");printf("==========9.通讯录排序============\n");printf("==========10.辅助功能=============\n");printf("==========0.返回==================\n");printf("请键入选项(0~10):");scanf("%d",select2); } //误操作提示模块 void error2() {printf("请先创建/录入系统再进行操作!\n"); } //创建通讯录链表 Node_ptr case1() {//在堆区申请一个头结点的空间Node_ptr L = (Node_ptr)malloc(sizeof(Node));if(L == NULL){printf("创建通讯录失败\n");return NULL;}L->len = 0;L->next = NULL;printf("创建通讯录成功\n");printf("请键入回车返回主菜单\n");return L; } //链表判空 int list_empty(Node_ptr L) {//判空if(NULL == L){printf("通讯录为空\n");error2();return -1;}return L->next == NULL; } //申请结点封装数据 Node_ptr node_apply(datatype e) {Node_ptr p = (Node_ptr)malloc(sizeof(Node));if(NULL == p){printf("结点申请失败\n");return NULL;}//将数据封装进结点的数据域p->data = e;p->next = NULL;return p; //将封装好的结点地址返回 } //新增联系人 void case2(Node_ptr L) {//判断是否合法if(NULL == L){printf("新增联系人失败\n");error2();return;}//申请结点封装数据datatype e;Node_ptr p = node_apply(e);if(p == NULL){return;}//录入联系人信息p->data.num = L->len+1;printf("请输入第%d名联系人姓名:",L->len+1);scanf("%s",p->data.name);printf("请输入第%d名联系人性别:",L->len+1);scanf("%s",p->data.sex);printf("请输入第%d名联系人联系方式:",L->len+1);scanf("%s",p->data.TEL);//头插逻辑p->next = L->next;L->next = p;//表长变化L->len++;printf("新增联系人成功\n");case7(L); } //查找联系人 void case3(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("查找联系人信息失败\n");error2();return;}Contact e;int flag = 0;printf("请输入要查找的联系人姓名:");scanf("%s",e.name);Node_ptr key = L->next;printf("编号 | 姓名 | 性别 | 联系方式\n");for(int i=1;i<=L->len;i++){if(strcmp(e.name,key->data.name) == 0){printf(" %d、 %s %s %s\n",\key->data.num,key->data.name,key->data.sex,key->data.TEL);flag++;}key = key->next;}printf("共查找到%d项\n",flag); } //修改联系人信息 void case4(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("修改联系人信息失败\n");error2();return;}Contact e;printf("请输入要修改的联系人姓名:");scanf("%s",e.name);Node_ptr key = L->next;printf("编号 | 姓名 | 性别 | 联系方式\n");for(int i=1;i<=L->len;i++){if(strcmp(e.name,key->data.name) == 0){printf(" %d、 %s %s %s\n",\key->data.num,key->data.name,key->data.sex,key->data.TEL);printf("请键入回车以选择要修改的联系人信息");dengdai();break;}}int select3 = 0;menu3(&select3);switch(select3){case 1:{printf("请输入该联系人编号:");scanf("%d",&(key->data.num));}break;case 2:{printf("请输入该联系人姓名:");scanf("%s",key->data.name);}break;case 3:{printf("请输入该联系人性别:");scanf("%s",key->data.sex);}break;case 4:{printf("请输入该联系人联系方式:");scanf("%s",key->data.TEL);}break;case 5:{printf("请输入该联系人编号:");scanf("%d",&(key->data.num));printf("请输入该联系人姓名:");scanf("%s",key->data.name);printf("请输入该联系人性别:");scanf("%s",key->data.sex);printf("请输入该联系人联系方式:");scanf("%s",key->data.TEL);}break;case 0:printf("请键入回车返回主菜单\n");return;default:error1();}printf("修改联系人信息成功\n");case7(L); } //信息修改选择菜单 void menu3(int * select3) { printf("=====请选择要修改的联系人信息=====\n");printf("==========1.编号==================\n");printf("==========2.姓名==================\n");printf("==========3.性别==================\n");printf("==========4.联系方式==============\n");printf("==========5.以上全部==============\n");printf("==========0.返回==================\n");printf("请键入选项(0~5):");scanf("%d",select3); } //按位置查找结点并返回该节点的地址 Node_ptr list_find_node(Node_ptr L,int pos) { //判断是否合法if(NULL == L || pos<0 || pos>L->len){printf("单向链表查找失败\n");return NULL;}Node_ptr key = L;for(int i=0;i<pos;i++){key = key->next;}return key; } //删除联系人 void case5(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("删除联系人信息失败\n");error2();return;}Contact e;printf("请输入要删除的联系人姓名:");scanf("%s",e.name);Node_ptr key = L->next;printf("编号 | 姓名 | 性别 | 联系方式\n");for(int i=1;i<=L->len;i++){if(strcmp(e.name,key->data.name) == 0){printf(" %d、 %s %s %s\n",\key->data.num,key->data.name,key->data.sex,key->data.TEL);//找到前驱Node_ptr q = list_find_node(L,i-1);//标记Node_ptr p = q->next;//孤立q->next = p->next;//释放free(p);//防止野指针p = NULL;//表长变化L->len--;break;}}printf("该联系人删除成功\n");case7(L); } //插入联系人 void case6(Node_ptr L) {int pos = 0;printf("请输入要插入联系人的位置:");scanf("%d",&pos);//判断是否合法if(NULL == L || pos<1 || pos>L->len+1){printf("单向链表插入失败\n");error2();return;}//找到要插入位置的前一个结点Node_ptr key = list_find_node(L,pos-1);//插入//申请结点封装数据datatype e;Node_ptr p = node_apply(e);if(p == NULL){return;}//录入联系人信息p->data.num = key->len+1;printf("请输入第%d名联系人姓名:",key->len+1);scanf("%s",p->data.name);printf("请输入第%d名联系人性别:",key->len+1);scanf("%s",p->data.sex);printf("请输入第%d名联系人联系方式:",key->len+1);scanf("%s",p->data.TEL);//头插逻辑p->next = key->next;key->next = p;//表长变化L->len++;printf("通讯录第%d位联系人插入成功\n",pos);case7(L); } //显示联系人信息 void case7(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("显示联系人信息失败\n");error2();return;}printf("联系人信息:\n");Node_ptr key = L->next;printf("编号 | 姓名 | 性别 | 联系方式\n");while(key){printf(" %d、 %s %s %s\n",\key->data.num,key->data.name,key->data.sex,key->data.TEL);key = key->next;}printf("请键入回车返回主菜单\n"); } //导出联系人信息 void case8(Node_ptr L) {// 判断是否合法if (list_empty(L) || NULL == L){printf("导出联系人信息失败\n");error2();return;}// 打开文件用于写入FILE *fp;fp = fopen("contacts.txt", "w");if (fp == NULL){printf("无法打开文件进行写入\n");return;}// 写入表头fprintf(fp, "编号 | 姓名 | 性别 | 联系方式\n");Node_ptr key = L->next;while (key!= NULL){fprintf(fp, " %d、 %s %s %s\n",key->data.num, key->data.name, key->data.sex, key->data.TEL);key = key->next;}// 关闭文件fclose(fp);printf("联系人信息已成功导出到contacts.txt文件\n"); } //按序显示联系人 void case9(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("通讯录排序失败\n");error2();return;}for(int i=1;i<L->len;i++){for(int j=1;j<=L->len-i;j++){Node_ptr m = list_find_node(L,j);Node_ptr n = list_find_node(L,j+1);if(strcmp(m->data.name , n->data.name) > 0){Node temp;temp.data = m->data;m->data = n->data;n->data = temp.data;} }}printf("通讯录排序成功\n");case7(L); } //辅助功能 void case10(Node_ptr L) {//判断是否合法if(NULL == L){printf("进入辅助功能失败\n");error2();return;}while(1){int select4 = 0; //选项menu4(&select4); //通讯录菜单循环显示选择模块switch(select4){case 1: //通讯录初始化{list_init(L);}break;case 2: //创建通讯录{printf("该通讯录共有%d位联系人\n",L->len);printf("请键入回车返回上级菜单\n");}break;case 3: //创建通讯录{list_sex(L);}break;case 0: //fanhiuprintf("请键入回车返回上级菜单\n");return;default:error1();}dengdai();} } //辅助功能菜单 void menu4(int * select4) { system("clear");printf("===========请选择辅助功能=========\n");printf("==========1.通讯录初始化==========\n");printf("==========2.显示联系人数量========\n");printf("==========3.统计联系人性别========\n");printf("==========0.返回==================\n");printf("请键入选项(0~3):");scanf("%d",select4); } //通讯录初始化 void list_init(Node_ptr L) {if(NULL == L){printf("通讯录初始化失败\n");return;}//对所有普通结点头删while(!list_empty){ //头删Node_ptr p = L->next;L->next = p->next;free(p);p = NULL;L->len--;}L->next = NULL;L->len = 0;printf("通讯录初始化成功\n"); printf("请键入回车返回上级菜单\n"); } //统计联系人性别 void list_sex(Node_ptr L) {//判断是否合法if(list_empty(L) || NULL == L){printf("通讯录排序失败\n");error2();return;}//统计性别char nan[] = "男";char nv[] = "女";int m = 0,n = 0,k = 0;for(int i=1;i<=L->len;i++){ Node_ptr p = list_find_node(L,i);if(strcmp(p->data.sex,nan) == 0)m++;else if(strcmp(p->data.sex,nv) == 0)n++;elsek++;}printf("通讯录性别统计为:\n");printf("男性联系人%d名\n",m);printf("女性联系人%d名\n",n);printf("未知联系人%d名\n",k);printf("请键入回车返回上级菜单\n"); }
/*******************************************************/ //=> File Name: main.c //=> Author: Water //=> Mail: 1249496568@qq.com //=> Created Time: 2024年11月30日 星期六 09时10分04秒 /*******************************************************/#include"lianbiaotongxunluguanlixitong.h" int main(int argc, const char *argv[]) {zhucedenglu(); //调用注册登录模块return 0; }