目录
菜单功能
录入联系人信息功能
查看系统中全部信息功能
查看单个信息功能
删除全部信息功能
删除单个信息功能
修改信息功能
完整代码
在长达一个多月的学习过程中,终于将C语言学完,因此专门写一个C语言课程设计来检验这一个多月的学习成果,由于写的比较急,因此代码有些还可以优化的地方,还请谅解!下面会对每个函数块的作用以及实现方法做出简单的论述。
菜单功能
函数作用:通过menu()函数来调用其他要使用到的功能。并在执行完以后重新返回该函数。
实现方法:主要通过goto语句,switch语句以及函数的调用三种方法来实现该功能。
void menu(){system("cls");printf(" ---------------------------------\n");printf(" ----------通讯录管理系统----------\n");printf(" ----------1、录入信息 ---------\n");printf(" ----------2、查看全部信息---------\n");printf(" ----------3、查看单个信息---------\n");printf(" ----------4、删除全部信息---------\n");printf(" ----------5、删除单个信息---------\n");printf(" ----------6、修改单个信息---------\n");printf(" ----------7、退出系统 ---------\n");int choice;printf("选择任意一个功能:\n");loop:scanf("%d",&choice);switch (choice){case 1:add_people();menu();case 2:views_people();menu();case 3:view_people();menu();break;case 4:delall_people();menu();case 5:del_people();menu();case 6:revise_people();menu();case 7:exit(1);break;default:printf("输入错误!请重新输入:");goto loop;}}
录入联系人信息功能
函数作用:在使用其他功能之前,应当先将部分信息存储在管理系统中,从而才可以实现数据的增删改查。
实现方法:主要通过动态链表的创建而实现,首先创建结构体指针p1,p2,并通过malloc()函数获取空间,其中p1作为首指针,p2作为尾指针。在p1所指向的结构体获取数据之后,令p2所指向的结构体中的next指针,指向p1结构体的地址,这步操作完成之后,p1将其地址赋值给p2.随后p1再次通过malloc()函数获取一定的空间,在p1指向的结构体获取数据之后,重复之前的操作,直至不再开辟新的空间时停止,最后将NULL赋值给最后一个结构体中next指针,使其不再指向任何地址。
void add_people(){//添加信息 system("cls");int count;printf("选择要添加联系人个数:\n");scanf("%d",&count);struct People *p1,*p2;p1=p2=(struct People*)malloc(LEN);int i=0;printf("------------------------------------\n"); if(head==NULL){head = p1;}else{end->next = p1 ;}while(count>0){printf("请输第%d个联系人信息:\n",++i);printf("姓名:\n");scanf("%s",&p1->name);printf("性别:\n");scanf("%s",&p1->sex);printf("电话号码:\n");scanf("%d",&p1->num);printf("邮箱:\n");scanf("%s",&p1->email);printf("家庭地址:\n");scanf("%s",&p1->addr);count--;p2->next=p1;p2=p1;p1=(struct People*)malloc(LEN);system("cls");}p2->next=NULL;end=p2;printf("全部添加成功!\n");system("pause");}
查看系统中全部信息功能
函数作用:将通讯录系统中所有数据呈现出来。
实现方法:定义一个结构体指针变量(局部变量)pt,将头指针head赋值给pt,通过循环输出pt指针所指向的结构体,并将所指向结构体中的next所指向的地址赋值给pt,从而实现对下一个结构体的访问。
void views_people(){//查看全部信息 system("cls");struct People *pt;if(head!=NULL){for(pt=head;pt!=NULL;){printf("姓名:%s\n性别:%s\n电话号码:%d\n邮箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);pt=pt->next;printf("-------------------------------------------------------------\n");}}else{printf("该系统中无数据!");}system("pause");}
查看单个信息功能
函数作用:有目的性地寻找联系人的所有信息。
实现方法:将链表中的数据一一遍历,与所输入的数据进行对比,若匹配成功,则将该指针所指向结构体中的数据输出。
void view_people(){//单个查询,通过名字查询 system("cls");struct People *pt;printf("输入要查询的联系人名字:\n");char name[10];int flag=1;scanf("%s",&name);for(pt=head;pt!=NULL;){if(strcmp(pt->name,name)==0){printf("成功找到!\n");printf("姓名:%s\n性别:%s\n电话号码:%d\n邮箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);flag=0;break;}pt=pt->next;}if(flag){printf("不好意思,未找到!\n");}system("pause");}
删除全部信息功能
函数作用:将管理系统中的所有数据删除。
实现方法:仍然是对链表一一遍历,在遍历的过程中通过free()函数将其开辟的空间释放,从而达到数据删除的作用。
void delall_people(){//全部删除 system("cls");printf("正在删除中···\n");system("pause");struct People *pt;for(pt=head;pt!=NULL;){struct People *temp=pt;pt=pt->next;free(pt);}head=NULL;end=NULL;printf("删除成功!\n");system("pause");}
删除单个信息功能
函数作用:有目的性地删除一些失效信息
实现方法:依然是通过遍历找到想要删除的指针,不过在这之前应该定义一个结构体指针用来获取pt的地址。其目的是为了能够在删除该指针之前将该指针之前的数据与之后的数据能够连接起来。
void del_people(){//删除单个联系人信息 system("cls");struct People *pt,*temp;pt=head;printf("请输入要删除的联系人:");char name[10];scanf("%s",&name); int flag=1;while(pt!=NULL){if(strcmp(name,pt->name)==0){if(pt==head){ head = pt->next;flag = 0;printf("删除成功!\n");system("pause"); }else{ printf("删除成功···\n"); system("pause"); temp->next=pt->next; free(pt); flag=0; break; } }temp=pt;pt=pt->next;}if(flag){printf("不好意思,未找到!\n");system("pause");}}
修改信息功能
函数作用:修改通讯录管理系统中的一些错误信息
实现方法:其核心依然是通过遍历找到要修改的指针,从而实现对数据的修改。
void del_people(){//删除单个联系人信息 system("cls");struct People *pt,*temp;pt=head;printf("请输入要删除的联系人:");char name[10];scanf("%s",&name); int flag=1;while(pt!=NULL){if(strcmp(name,pt->name)==0){printf("删除成功···\n");system("pause");temp->next=pt->next;free(pt);flag=0;break;}temp=pt;pt=pt->next;}if(flag){printf("不好意思,未找到!\n");system("pause");}}
完整代码
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>#define LEN sizeof(struct People)struct People{char name[10];//姓名 char sex[4];//性别 int num;//电话号码 char email[20];//邮箱 char addr[30];//家庭地址struct People* next;};struct People* head =NULL;struct People* end =NULL;void add_people(){//添加信息 system("cls");int count;printf("选择要添加联系人个数:\n");scanf("%d",&count);struct People *p1,*p2;p1=p2=(struct People*)malloc(LEN);int i=0;printf("------------------------------------\n"); if(head==NULL){head = p1;}else{end->next = p1 ;}while(count>0){printf("请输第%d个联系人信息:\n",++i);printf("姓名:\n");scanf("%s",&p1->name);printf("性别:\n");scanf("%s",&p1->sex);printf("电话号码:\n");scanf("%d",&p1->num);printf("邮箱:\n");scanf("%s",&p1->email);printf("家庭地址:\n");scanf("%s",&p1->addr);count--;p2->next=p1;p2=p1;p1=(struct People*)malloc(LEN);system("cls");}p2->next=NULL;end=p2;printf("全部添加成功!\n");system("pause");}void views_people(){//查看全部信息 system("cls");struct People *pt;if(head!=NULL){for(pt=head;pt!=NULL;){printf("姓名:%s\n性别:%s\n电话号码:%d\n邮箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);pt=pt->next;printf("-------------------------------------------------------------\n");}}else{printf("该系统中无数据!");}system("pause");}void delall_people(){//全部删除 system("cls");printf("正在删除中···\n");system("pause");struct People *pt;for(pt=head;pt!=NULL;){struct People *temp=pt;pt=pt->next;free(pt);}head=NULL;end=NULL;printf("删除成功!\n");system("pause");}void view_people(){//单个查询,通过名字查询 system("cls");struct People *pt;printf("输入要查询的联系人名字:\n");char name[10];int flag=1;scanf("%s",&name);for(pt=head;pt!=NULL;){if(strcmp(pt->name,name)==0){printf("成功找到!\n");printf("姓名:%s\n性别:%s\n电话号码:%d\n邮箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);flag=0;break;}pt=pt->next;}if(flag){printf("不好意思,未找到!\n");}system("pause");}void revise_people(){//修改内容 system("cls");struct People *pt;printf("输入要修改的联系人名字:\n");char name[10];int flag=1;scanf("%s",&name);for(pt=head;pt!=NULL;){if(strcmp(name,pt->name)==0){printf("成功找到!\n");printf("姓名:%s\n性别:%s\n电话号码:%d\n邮箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);flag=0;printf("请分别进行修改:\n");printf("姓名:\n");scanf("%s",&pt->name);printf("性别:\n");scanf("%s",&pt->sex);printf("电话号码:\n");scanf("%d",&pt->num);printf("邮箱:\n");scanf("%s",&pt->email);printf("家庭地址:\n");scanf("%s",&pt->addr);break;}pt=pt->next;}if(flag){printf("不好意思,未找到!\n");}system("pause");}void del_people(){//删除单个联系人信息 system("cls");struct People *pt,*temp;pt=head;printf("请输入要删除的联系人:");char name[10];scanf("%s",&name); int flag=1;while(pt!=NULL){if(strcmp(name,pt->name)==0){if(pt==head){ head = pt->next;flag = 0;printf("删除成功!\n");system("pause"); }else{ printf("删除成功···\n"); system("pause"); temp->next=pt->next; free(pt); flag=0; break; } }temp=pt;pt=pt->next;}if(flag){printf("不好意思,未找到!\n");system("pause");}}void menu(){system("cls");printf(" ---------------------------------\n");printf(" ----------通讯录管理系统----------\n");printf(" ----------1、录入信息 ---------\n");printf(" ----------2、查看全部信息---------\n");printf(" ----------3、查看单个信息---------\n");printf(" ----------4、删除全部信息---------\n");printf(" ----------5、删除单个信息---------\n");printf(" ----------6、修改单个信息---------\n");printf(" ----------7、退出系统 ---------\n");int choice;printf("选择任意一个功能:\n");loop:scanf("%d",&choice);switch (choice){case 1:add_people();menu();case 2:views_people();menu();case 3:view_people();menu();break;case 4:delall_people();menu();case 5:del_people();menu();case 6:revise_people();menu();case 7:exit(1);break;default:printf("输入错误!请重新输入:");goto loop;}}int main(){void add_people();void views_people();void delall_people();void view_people();void revise_people();void del_people();void menu();menu();return 0;}
其中可能会有一些令人难以解读的地方,还请评论区告诉我,对其加以修改。