通讯录管理系统 链表
c语言实现通讯录管理系统(用链表实现)

c语⾔实现通讯录管理系统(⽤链表实现)题⽬:通讯录(通过链表实现)设计并实现⼀个简易的通讯录软件,管理个⼈通讯记录。
⼀条通讯记录可包括:姓名、⼯作单位、⼿机、住宅电话、E-Mail、家庭住址等(可⾃⾏增删,但不可过少)。
该系统应实现以下基本功能:(1)增加新的通讯记录。
(2)删除已有的通讯记录。
(3)修改已有的通讯记录。
(4)浏览全部或指定(如指定姓名、⼯作单位等)的通讯记录。
(5)合理组织排列各项功能,界⾯可使⽤键盘操作。
(6)以⽂件的形式存储数据。
说明:⼤⼀时的c语⾔课设,⽤链表实现⼀个通讯录管理系统,为了美观好看,花了很多时间调整齐度,记录⼀下⼤⼀时的作业。
其主要功能是对通讯录可输⼊,显⽰,插⼊,删除,最难是可保存,这个学⽂件的时候不怎么会。
内容我⾃⼰弄了7个,名字,性别,⼯作单位,⼿机,住宅电话,E-Mail,家庭住址(其他太多其实都是⼀样的,就懒得加了)。
主要运⽤到对指针中的链表的功能和使⽤要⽐较扎实,分部列写就可以了。
实现图⽚:附上代码:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 typedef struct student5 {6char name[20];//名字7char wm[20];//性别8char work[100];//⼯作单位9char stel[20];//⼿机10char htel[20];//住宅号码11char mail[20];//E-Mail12char home[100];//家庭住址13struct student *next;14 }stu;15 stu *head;//头指针16void screen()//主菜单17 {18 printf("\n=======================================================\n");19 printf(" 欢迎来到通讯录管理系统\n\n");20 printf(" 1.输⼊数据 2.显⽰数据\n");21 printf(" 3.插⼊数据 4.删除数据\n");22 printf(" 5.查看数据 6.修改数据\n");23 printf(" 7.保存数据 8.返回主菜单\n");24 printf("\n~~~~~~输~~~~~~⼊~~~~~~9~~~~~~退~~~~~~出~~~~~~程~~~~~~序\n");25 }26void input()//输⼊数据27 {28int ans;//判断是否继续输⼊29 stu *p1,*p2;30 p1=(stu *)malloc(sizeof(stu));//申请内存来⽤31if(p1!=NULL)32 {33 printf("========输⼊数据========\n");34 head=p1;35while(1)36 {37 printf("名字:");38 scanf("%s",&p1->name);39 printf("性别:");40 scanf("%s",&p1->wm);41 printf("⼯作单位:");42 scanf("%s",&p1->work);43 printf("⼿机:");44 scanf("%s",&p1->stel);45 printf("住宅号码:");46 scanf("%s",&p1->htel);47 printf("E-Mail:");48 scanf("%s",&p1->mail);49 printf("家庭地址:");50 scanf("%s",&p1->home);51 printf("===================================\n");52 p2=p1;53 p1=(stu *)malloc(sizeof(stu));//申请下⼀个要⽤的空间54if(p1!=NULL)55 p2->next=p1;56 printf("请选择是否继续输⼊:1.继续 2.退出\n请选择:");//⽤户选择57 scanf("%d",&ans);58if(ans==1)//继续59continue;60else//退出61 {62 printf("========输⼊完毕========\n");63 p2->next=NULL;64free(p1);//将申请的的⽆⽤内存释放65break;66 }67 }68 }69 }70void look(stu *p1)//显⽰数据71 {72 printf("========显⽰数据========\n");73while(p1!=NULL)74 {75 printf("名字:%s\n",p1->name);76 printf("性别:%s\t",p1->wm);77 printf("⼯作单位:%s\t",p1->work);78 printf("⼿机:%s\t",p1->stel);79 printf("住宅号码:%s\t",p1->htel);80 printf("E-Mail:%s\t",p1->mail);81 printf("家庭住址:%s\n",p1->home);82 printf("=====================================\n");83 p1=p1->next;84 }85 printf("========显⽰完毕========\n");86 }87void insert()//插⼊数据88 {89int ans;//选择插⼊位置90char name[20];//插⼊者的名字91 printf("========插⼊数据========\n");92 stu *p1,*p2,*p3;93 p1=head;94 p3=(stu *)malloc(sizeof(stu));//申请内存95 p3->next=NULL;96 printf("请输⼊插⼊者的数据:\n");97 printf("名字:");98 scanf("%s",&p3->name);99 printf("性别:");100 scanf("%s",&p3->wm);101 printf("⼯作单位:");102 scanf("%s",&p3->work);103 printf("⼿机:");104 scanf("%s",&p3->stel);105 printf("住宅号码:");106 scanf("%s",&p3->htel);107 printf("E-Mail:");108 scanf("%s",&p3->mail);109 printf("家庭地址:");110 scanf("%s",&p3->home);111 printf("请选择插⼊位置:1.⾸位置插⼊ 2.尾部插⼊ 3.插到某⼈前⾯\n请选择:");112 scanf("%d",&ans);113switch(ans)114 {115case1://放到头指针116 p3->next=p1;117 head=p3;118break;119case2://放到尾部120while(p1->next!=NULL)121 p1=p1->next;122 p1->next=p3;123break;124case3://放到某⼈前⾯125 printf("请输⼊插到谁前⾯名字:");126 scanf("%s",name);127while(strcmp(name,p1->name)!=0)128 {129 p2=p1;130 p1=p1->next;131 }132 p2->next=p3;133 p3->next=p1;134break;135 }136 printf("========插⼊成功========\n");137 }138void deleted()//删除数据139 {140 stu *p1,*p2;141char name[20];//删除者名字142 printf("========删除数据========\n");143 printf("请输⼊要删除者的名字:");144 scanf("%s",name);145 p1=head;146if(head==NULL)//通讯录已经没数据了147 {148 printf("通讯录⾥什么也没有了。
链表通讯录课程设计

链表通讯录课程设计一、教学目标本课程的目标是让学生掌握链表在通讯录管理中的应用。
具体来说,知识目标包括理解链表的基本概念、结构及其在通讯录中的作用;技能目标则是培养学生运用链表进行通讯录数据管理的能力,包括创建、删除、查找和修改通讯录信息;情感态度价值观目标则是培养学生对计算机科学的好奇心、探索精神和责任感。
二、教学内容本课程的教学内容主要包括链表的基本概念、结构及其在通讯录管理中的应用。
具体安排如下:1.第一课时:链表的基本概念和结构。
介绍链表的定义、特点及其与数组的区别。
2.第二课时:链表的创建与删除。
讲解如何创建一个链表、如何删除链表中的节点以及如何释放链表内存。
3.第三课时:链表的查找与修改。
教授如何查找链表中的节点、如何修改链表中的节点数据以及如何实现链表的排序。
4.第四课时:链表在通讯录中的应用。
结合实际案例,讲解如何使用链表管理通讯录信息,包括增加、删除、查找和修改通讯录条目。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。
主要包括:1.讲授法:用于讲解链表的基本概念、结构和通讯录管理的基本原理。
2.案例分析法:通过分析实际案例,让学生了解链表在通讯录中的应用。
3.实验法:让学生动手实践,实际操作链表的操作方法,提高其实际应用能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《数据结构与算法》。
提供链表的基本概念、结构和算法。
2.多媒体资料:包括链表的动画演示、实际案例的视频讲解等,帮助学生更直观地理解链表的操作。
3.实验设备:提供计算机和编程环境,让学生可以实际操作链表的操作方法。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面、客观、公正地评价学生的学习成果。
具体安排如下:1.平时表现:占比30%,通过课堂参与、提问、小组讨论等方式评估学生的学习态度和理解程度。
2.作业:占比30%,布置与课程内容相关的编程练习,评估学生的实际操作能力。
c语言双链表通讯录

c语言双链表通讯录题目三:通讯录系统1.实验目的和意义:利用c语言编写通讯录系统,使我们更加熟练的掌握c语言及软件开发的基本步骤,进一步理解并掌握结构体和双链表的使用,初步掌握文件的调用。
该课题设计对学生来说是对这一学期有关c语言学习的一个评估,是将c语言应用于生活中,提高学生的动手能力。
该课题有利于让学生将课本上学习的零散的知识融会贯通、综合运用、强化知识体2.实验内容:1、当启动通讯录管理系统时读取通讯录文件2、进入主功能菜单3、创建联系人列表并保存修改后的通讯录4、删除创建的联系人并保存修改后的通讯录5、打印出保存后的通讯录当未创建通讯录时提示用户创建新的通讯录6、根据用户输入的联系人的首字母查找符合条件的联系人7、退出通讯录管理系统3.小组成员分工:小组讨论算法:全体成员编写程序:樊义,高杰林,曹仲生调试程序:陈伟杰漏洞修复及报告设计:陈伟杰4.设计要点:建立结构体并创建链表,添加删除节点,字符串的匹配。
设计功能选择函数,5.源程序:#include "stdio.h"#include "stdlib.h"#include "string.h"typedef struct message{char name[30];char number[20];char email[30];char adress[100];char qq[120];struct message *proir;struct message *next;} mess;mess *head=NULL;mess *p[100];int man=0;/////////////////////////////////////////////////////////////////// /////////// char menu();void add();void del();char del_menu();void del_name();void del_adress();void del_number();void del_email();void del_qq();void find();char find_menu();void find_name();void find_adress();void find_number();void find_email();void find_qq();void print();char print_menu();void print_time();void print_word();void file_save();/////////////////////////////////////////////////////////////////// ///////// //////////////////////////////////主函数int main(){FILE *fp=fopen("1.txt","r+");if(fp==NULL)printf("通讯录为空!!\n");else{fseek(fp,0,2);if(ftell(fp)==0)printf("通讯录为空!\n");else{mess *p2,*tmp;rewind(fp);head=(mess *)malloc(sizeof(mess));head->next=NULL;p[0]=head;while(feof(fp)==0){p2=(mess *)malloc(sizeof(mess));fscanf(fp,"%s%s%s%s%s",p2->name,p2->adress,p2->numb er,p2->email,p2->qq);tmp=head;while(tmp->next!=NULL)tmp=tmp->next;tmp->next=p2;p2->next=NULL;p2->proir=tmp;man++;p[man]=p2;p[man+1]=NULL;}man--;p2->proir->next=NULL;printf("数据读取完毕!\n");int flag=fclose(fp);if(flag!=0){printf("关闭文件失败!");return 0;} }}start:char i;i=menu();switch(i){case '1':add();break;case '2':del();break;case '3':find();break;case '4':print();break;case '5':file_save();return 0;case '6':return 0;}goto start;}/////////////////////////////////////////////////////////////////// /////////////////////////////////////// //////主菜单char menu(){char i;printf("---------------功能菜单---------------\n");printf(" | 1.录入信息\t 2.删除信息|\n");printf(" | 3.查找信息\t 4.显示信息|\n");printf(" | 5.保存并退出 6.退出\t |\n");printf("--------------------------------------\n");while(1){printf("请输入功能编号:");scanf("%s",&i);if('0'<i&&i<'7')< p="">return i;elseprintf("无效指令!");}}/////////////////////////////////////////////////////////////////// /////////////////////////////////////// //////录入函数void add(){mess *p1;p1=(mess *)malloc(sizeof(mess));printf("请输入姓名:\n");scanf("%s",&p1->name);printf("请输入地址:\n");scanf("%s",&p1->adress);printf("请输入手机号码:\n"); scanf("%s",&p1->number);printf("请输入邮箱:\n");scanf("%s",&p1->email);printf("请输入qq号码:\n");scanf("%s",&p1->qq);if(head==NULL){head=(mess *)malloc(sizeof(mess)); head->next=p1;p1->next=NULL;p1->proir=head;p[0]=head;man++;p[man]=p1;p[man+1]=NULL;}else{mess *p2=head->next;while(p2->next!=NULL)p2=p2->next;p2->next=p1;p1->next=NULL;p1->proir=p2;man++;p[man]=p1;p[man+1]=NULL;}printf("添加成功!通讯录内现有%d个联系人\n是否继续录入信息........",man);char ch;done:scanf("%s",&ch);if(ch=='n');else if(ch=='y') add();else {printf("无效指令!请重新输入:");goto done;}}/////////////////////////////////////////////////////////////////// /////////////////////////////////////// ///删除函数void del(){char i=del_menu();switch(i){case '1':del_name();break;case '2':del_adress();break;case '3':del_number();break;case '4':del_email();break;case '5':del_qq();break;case '6':break;}}////////////////////char del_menu(){char i;printf("---------------删除菜单---------------\n"); printf(" | 1.按姓名删除\n | 2.按地址删除\n"); printf(" | 3.按手机号码删除\n | 4.按邮箱删除\n"); printf(" | 5.按qq号删除\n | 6.返回主菜单\n"); printf("--------------------------------------\n"); while(1){printf("请输入功能编号:");scanf("%s",&i);if('0'<i&&i<'7')< p="">return i;elseprintf("无效指令!");}}///////////////////void del_name(){if(man==0)printf("通讯录为空!\n\n");else{char ch[30];int i=1;mess *p1=head->next;printf("请输入被删用户的姓名:\n");scanf("%s",ch);while(p1!=NULL){if(strcmp(p1->name,ch)==0){while(p[i]!=p1)i++;while(p[i]!=NULL){p[i]=p[i+1];i++;}p1->proir->next=p1->next;if(p1->next!=NULL)p1->next->proir=p1->proir;printf("此用户信息已删除!");printf("是否继续删除........");man--;char tmp;done: scanf("%s",&tmp);if(tmp=='n')break;else if(tmp=='y') {del();break;}else {printf("无效指令!请重新输入:");goto done;} } p1=p1->next;}if(p1==NULL){printf("查无此人!\n");printf("是否继续删除........");char tmp;a: scanf("%s",&tmp);if(tmp=='n');else if(tmp=='y') del();else {printf("无效指令!请重新输入:");goto a;}}}}/////////////////////void del_adress(){if(man==0)printf("通讯录为空!\n\n");else{char ch[30];int i=1;mess *p1=head->next;printf("请输入被删用户的地址:\n"); scanf("%s",ch);while(p1!=NULL){if(strcmp(p1->adress,ch)==0) {while(p[i]!=p1)i++;while(p[i]!=NULL){p[i]=p[i+1];i++;}p1->proir->next=p1->next;if(p1->next!=NULL)p1->next->proir=p1->proir; printf("此用户信息已删除!");printf("是否继续删除........");man--;char tmp;done: scanf("%s",&tmp);if(tmp=='n')break;else if(tmp=='y') {del();break;}else {printf("无效指令!请重新输入:");goto done;} } p1=p1->next;}if(p1==NULL){printf("查无此人!\n");printf("是否继续删除........");char tmp;a: scanf("%s",&tmp);if(tmp=='n');else if(tmp=='y') del();else {printf("无效指令!请重新输入:");goto a;}}}}/////////////////////////////void del_number(){if(man==0)printf("通讯录为空!\n\n");else{char ch[30];int i=1;mess *p1=head->next;printf("请输入被删用户的电话号码:\n");scanf("%s",ch);while(p1!=NULL){if(strcmp(p1->number,ch)==0){while(p[i]!=p1)i++;while(p[i]!=NULL){p[i]=p[i+1];i++;}p1->proir->next=p1->next;if(p1->next!=NULL)p1->next->proir=p1->proir;printf("此用户信息已删除!");printf("是否继续删除........");man--;char tmp;done: scanf("%s",&tmp);if(tmp=='n')break;else if(tmp=='y') {del();break;}else {printf("无效指令!请重新输入:");goto done;} } p1=p1->next;}if(p1==NULL){printf("查无此人!\n");printf("是否继续删除........");char tmp;a: scanf("%s",&tmp);if(tmp=='n');else if(tmp=='y') del();else {printf("无效指令!请重新输入:");goto a;}}}}/////////////////////void del_email(){if(man==0)printf("通讯录为空!\n\n");else{char ch[30];int i=1;mess *p1=head->next;printf("请输入被删用户的邮箱:\n"); scanf("%s",ch);while(p1!=NULL){if(strcmp(p1->email,ch)==0) {while(p[i]!=p1)i++;while(p[i]!=NULL){p[i]=p[i+1];i++;}p1->proir->next=p1->next;if(p1->next!=NULL)p1->next->proir=p1->proir; printf("此用户信息已删除!");printf("是否继续删除........");</i&&i<'7')<></i&&i<'7')<>。
南航 C语言课程设计 通讯录管理系统 链表实现

4、编程时尽量采用效率最高的链表算法。提交的源程序中(非报告中的程序)部 分函数代码后增添了多种效果等同的代码(注释掉了),报告中最终保留的所有涉及链表 操作的算法大多已实现遍历一次即可达成目的(时间复杂度 O(n))。
0
031220732 HQ C 语言课程设计报告
1、摘要
报告将详细描述“电话簿管理系统”的 C 语言实现方案,程序代码将以 C 语言形式 给出。报告将包括程序总体设计的介绍以及各子函数功能的说明,同时也包括在做课程设 计过程中的心得体会,最终将给出典型数据与测试流程。
2、题目描述与解决方案
2-1.题目描述
2、对于错误的数据,设计了相应的修改程序,主动提示可能需要修改的成员与当 前内容,并允许用户对某一字段进行修改(而不需要重新输入整条记录)。设计了 _Modify()函数实现上述功能。
3、设计了二级菜单用于实现上述功能的调用,同时设计了一些琐碎的小功能,如 改变软件背景与文字颜色的功能和“关 于”程序和彩蛋小游戏。设计了 ExtraFunction()实现上述功能(恢复数 据功能也在该函数内完成)。
图 1-二级菜Biblioteka 效果图3-4.已知的不足1、代码冗长,维护起来不如最精简版本容易。(可削减所有附加功能以解决) 2、输入输出细节处理过多,影响程序可读性。(可适当减少处理) 3、某些代码效率不高,如查错功能在数据规模极大时会极大拖累运行效率。 4、采用了批处理命令,只适合 WINDOWS 平台、DOS 平台,可移植性一般。 5、采用了在 C++中被认为是不安全的标准库函数,如 scanf 等。
链表实现通讯录

#i n c l u d e<s t d i o.h>#include <malloc.h>#include <stdlib.h>#include <string.h>struct txl{char n[10];char name[10];char sex [10];char tele[12];char address[100];struct txl *next;};typedef struct txl TXL;typedef struct txl * link;enum result {exit_ok};void menu_select()//主菜单{printf(" 欢迎进入通讯录管理系统\n");printf("********************************\n");printf(" 1.联系人添加\n");printf(" 2.联系人删除\n");printf(" 3.联系人修改\n");printf(" 4.联系人查找\n");printf(" 5.联系人总览\n");printf(" 0.退出通讯录管理系统\n");printf("********************************\n");}void is_malloc_ok(link *new_node){if((*new_node) == NULL){printf("Malloc error!");exit(-1);}}void create_link(link *head){(*head) = (link)malloc(sizeof(TXL));is_malloc_ok(head);(*head)->next = NULL;}void create_new_node(link *new_node){int i;*new_node = (link)malloc(sizeof(TXL));is_malloc_ok(new_node);printf("请输入编号:\n");scanf("%s",&(*new_node)->n);printf("请输入姓名:\n");scanf("%s",&(*new_node)->name);printf("请输入性别:\n");scanf("%s",&(*new_node)->sex);printf("请输入联系电话:\n");scanf("%s",&(*new_node)->tele);printf("请输入家庭地址:\n");scanf("%s",&(*new_node)->address);printf("联系人添加成功!\n");}insert_new_node(link *new_node,link *head){(*new_node)->next = (*head)->next;(*head)->next = (*new_node);}void add_new_node(link *head){link new_node;create_new_node(&new_node);insert_new_node(&new_node,head);}void display(link *head){int i = 1;link p = NULL;if((*head)->next == NULL){printf("通讯录为空!\n");return;}else{p = (*head)->next;while(p != NULL){printf("第%d个联系人的信息如下:\n",i);printf("序号:%s\n",p->n);printf("姓名:%s\n",p->name);printf("性别:%s\n",p->sex);printf("联系电话:%s\n",p->tele);printf("家庭地址:%s\n\n\n",p->address);p = p->next;i++;}}}void find(link *head){char n1[10],name1[10],tele1[12],address1[100];int i;link xz = (*head)->next;printf("1.按编号查询\n");printf("2.按姓名查询\n");printf("3.按联系电话查询\n");printf("请输入您想选择的查询方式:\n");scanf("%d",&i);if(i == 1){printf("请输入您想查询的编号:\n");scanf("%s",n1);if(xz == NULL){printf("通讯录为空!\n");return;}while(xz !=NULL){if(strcmp(xz->n,n1) == 0){printf("您想查询的联系人的信息如下:\n");printf("编号:%s\n",xz->n);printf("姓名:%s\n",xz->name);printf("性别:%s\n",xz->sex);printf("联系电话:%s\n",xz->tele);printf("家庭地址:%s\n",xz->address);return;}elsexz = xz->next;}printf("通讯录中无此人!\n");}if(i == 2){printf("请输入您想查询的姓名:\n");scanf("%s",name1);if(xz == NULL){printf("通讯录为空!\n");return;}while(xz != NULL){if(strcmp(xz->name,name1) == 0){printf("您想查询的联系人的信息如下:\n");printf("编号:%s\n",xz->n);printf("姓名:%s\n",xz->name);printf("性别:%s\n",xz->sex);printf("联系电话:%s\n",xz->tele);printf("家庭地址:%s\n",xz->address);return;}elsexz = xz->next;}printf("通讯录中无此人!\n");return;}if(i == 3){printf("请输入您想查询的联系电话:\n");scanf("%s",tele1);if(xz == NULL){printf("通讯录为空!\n");return;}while(xz != NULL){if(strcmp(xz->tele,tele1) == 0){printf("您想查询的联系人的信息如下:\n");printf("编号:%s\n",xz->n);printf("姓名:%s\n",xz->name);printf("性别:%s\n",xz->sex);printf("联系电话:%s\n",xz->tele);printf("家庭地址:%s\n",xz->address);return;}elsexz = xz->next;}printf("通讯录中无此人!\n");return;}}void change(link *head){int a;link p = (*head)->next;char name1[10];char tele1[12];char address1[100];printf("请输入您想修改的联系人信息:\n");printf("1.姓名\n");printf("2.联系电话:\n");printf("3.家庭地址:\n");scanf("%d",&a);if(a == 1){printf("请输入原姓名:\n");scanf("%s",name1);while( p != NULL){if((strcmp(p->name,name1)) == 0){printf("请输入新的姓名:\n");scanf("%s",&p->name);printf("联系人修改成功!\n");return;}elsep = p->next;}printf("通讯录中没有此人!\n");return;}if(a == 2){printf("请输入原联系电话:\n");scanf("%s",tele1);while(p != NULL){if((strcmp(p->tele,tele1)) == 0){printf("请输入新的联系电话:\n");scanf("%s",&p->tele);printf("联系人修改成功!\n");return;}elsep = p->next;}printf("通讯录中没有此人!\n");}if(a == 3){printf("请输入原家庭地址:\n");scanf("%s",address1);while(p != NULL){if((strcmp(p->address,address1)) == 0){printf("请输入新的家庭地址:\n");scanf("%s",&p->address);printf("联系人修改成功!\n");return;}elsep = p->next;}printf("通讯录中没有此人!\n");}}void delete(link *head){link p1 = (*head);link p2 = (*head)->next;char name1[10];printf("请输入您要删除的联系人姓名:\n");scanf("%s",name1);if((*head)->next = NULL){printf("通讯录为空!\n");return;}while((strcmp(p2->name,name1) != 0)&&p2->next !=NULL) {p1 = p2;p2 = p2->next;}if(p2->next == NULL ){if(strcmp(p2->name,name1) == 0){p1->next = NULL;printf("该联系人已删除!\n");free(p2);}else{printf("通讯录中无此人!\n");}}else{p1->next = p2->next;free(p2);}}void exit_link(){printf("************************\n");printf(" 再见!\n");exit(exit_ok);}void switch_function(link *head){int num;scanf("%d",&num);switch(num){case 1:add_new_node(head); break;case 2:delete(head);break;case 3:change(head);break;case 4:find(head);break;case 5:display(head);break;case 0:exit_link();break;default:printf("该功能不存在,请重新输入!");break;}}int main(){link head = NULL;link new_node = NULL;create_link(&head);menu_select();while(1){printf("请输入您想要的功能:\n");switch_function(&head);}return 0;}。
数据结构课程设计通讯录管理系统报告

数据结构课程设计通讯录管理系统报告前言通讯录管理系统是一种常见的应用程序,用于帮助用户有效地组织和管理他们的联系人信息。
本报告旨在介绍和分析一个基于数据结构设计的通讯录管理系统,其中实现了基本的通讯录功能,并且通过合适的数据结构和算法进行优化。
功能需求通讯录管理系统需要实现以下基本功能: - 添加联系人信息 - 查找联系人信息 - 删除联系人信息 - 更新联系人信息 - 显示所有联系人信息数据结构选择为了实现通讯录管理系统的功能,我们选择使用链表作为数据结构。
链表是一种简单而灵活的数据结构,可以动态地添加或删除节点,非常适合存储联系人信息这种动态的数据。
在这里,我们采用双向链表,使得查找、插入和删除操作更加高效。
算法设计添加联系人信息添加联系人信息时,我们需要遍历链表找到合适的位置插入新节点,这里的算法复杂度为O(n),其中n表示链表的长度。
查找联系人信息查找联系人信息时,我们需要遍历链表查找目标节点,这里的算法复杂度为O(n)。
删除联系人信息删除联系人信息时,我们同样需要遍历链表找到目标节点并删除,其算法复杂度为O(n)。
更新联系人信息更新联系人信息时,我们首先需要查找到目标节点,然后进行更新操作,其算法复杂度也为O(n)。
系统优化为了提高系统的性能,我们可以通过以下几种方式进行优化: - 使用哈希表索引联系人信息,减少查找联系人的时间复杂度; - 引入缓存机制,减少频繁的IO 操作。
总结通过本报告的介绍和分析,我们了解了一个基于数据结构设计的通讯录管理系统的实现原理和优化方法。
在实际应用中,针对具体需求和场景,我们可以进一步优化系统性能,提升用户体验。
通讯录管理系统作为一种简单而实用的应用程序,将在日常生活中发挥重要作用。
数据结构课程设计通讯录管理系统

数据结构课程设计通讯录管理系统
数据结构课程设计中的通讯录管理系统可以涉及到以下几个方面的知识点:
1. 数据结构:通讯录管理系统中需要使用到的数据结构包括数组、链表、哈希表等。
其中,数组用于存储通讯录中的人员信息,链表用于存储联系人信息,哈希表用于实现快速查找功能。
2. 算法:通讯录管理系统中需要使用到的算法包括查找算法、排序算法、动态规划算法等。
其中,查找算法用于实现快速查找联系人功能,排序算法用于实现通讯录的排序功能,动态规划算法用于实现最长公共子序列问题等。
3. 数据库:通讯录管理系统需要使用到数据库来存储通讯录中的数据。
需要掌握关系型数据库的设计和操作,包括数据表的设计、SQL 语句的编写等。
4. 界面设计:通讯录管理系统需要有友好的用户界面,需要进行界面设计和开发,包括前端技术的使用,如HTML、CSS和JavaScript等。
5. 系统测试:通讯录管理系统需要进行系统测试,包括功能测试、性
能测试等,确保系统能够正常运行并满足用户需求。
通过设计和实现通讯录管理系统,可以锻炼学生对数据结构和算法的理解和应用能力,同时还能提高学生的编程能力和团队合作能力。
数据结构课程设计学生通讯录管理系统[2][1]1
![数据结构课程设计学生通讯录管理系统[2][1]1](https://img.taocdn.com/s3/m/0c4ef7ddb14e852458fb57a3.png)
1绪论 (2)1.1任务目的 (2)1.2需求分析 (2)1.3详细功能 (2)2概要设计 (3)2.1通讯录各模块调用关系 (3)2.2结构体函数 (3)2.3主函数与各函数的调用 (3)3详细设计 (5)3.1各个算法的实现 (5)4调试结果 (13)5运行结果 (14)6总结 (15)7参考文献 (16)1.1任务目的用《数据结构》中的链表做数据结构,结合c语言基本知识,编写一个通讯录管理系统,以把所学知识应用到实际软件开发中去。
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力,初步掌握软件开发过程的问题分析,系统设计,程序编码,测试等基本方法和技能:提高综合运用所学的理论知识和方法独立分析和解决问题的能力,训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
1.2需求分析设计一个实用的学生通讯录管理系统,用双向链表做数据结构,编写一个通讯录管理系统实现通讯录信息的输入,添加,显示,并以姓名做关键字进行查找,删除信息等功能,输入的信息需要包含学生的姓名,地址,电话。
1.3详细功能1.显示菜单showmenu();2.添加信息Appenditem();3.输出信息print();4.按姓名查找信息Finditem1();5.删除信息Removeitem();6.保存信息到文件Saveandfree();7.打开文件Open();2概要设计2.1通讯录各模块调用关系2.2结构体函数struct Telephone{char name[20];char addrass[20];char telephone[20];struct Telephone *next;};typedef struct Telephone TEL;TEL *head=NULL;2.3主函数与各函数的调用void main(){char ch;Open(); //打开文件while(1){showmenu(); //显示菜单scanf(" %c",&ch);switch(ch){case '1':Appenditem(); //添加信息break;case '2':print(); //输出信息break;case '3':Finditem1(); //查找信息1.按姓名break;case '4': Removeitem(); //删除信息print(); //输出删除后的结果break;case '0':Saveandfree(); //保存并释放内存exit(0); //退出break;default:printf("选择错误!");break;}}}3详细设计3.1各个算法的实现1.显示菜单(图1):void showmenu(){printf("\n★☆★☆请选择以下功能★☆★☆\n");printf("\t1.添加信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、通讯录管理系统1.题目要求通讯录一般包括通讯者的编号、姓名、性别、电话及地址等信息,设计一个通讯录要求实现通讯者的插入、查询、删除、更新、排序操作。
struct node{char num[5]; //编号char name[8]; //姓名char sex; //性别char tel[8]; //电话char address[100]; //地址};2.应用程序功能开始运行时界面如下:通讯录链表建立界面如下:通讯录链表插入界面如下:通讯录链表查询界面如下:按编号查询界面如下:按姓名查询编号如下:通讯录链表删除界面如下:通讯录链表输出界面如下:3.输入数据类型、格式和内容限制输入数据类型为字符型,但在输入过程中不可包含空格,如输入地址过程中不可出现空格!4.主要算法模块描述流程图:5.源程序代码#include<stdio.h>#include "iostream"int flag1=0;#include "string.h"#include "stdlib.h"#include "windows.h"using namespace std;typedef struct { //通讯录结点类型char num[5]; //编号char name[9]; //姓名char sex[3]; //性别char phone[13]; //电话char addr[31]; //地址} DataType;typedef struct node { //结点类型定义DataType data; //结点数据域struct node *next; //结点指针域} ListNode;typedef ListNode *LinkList;LinkList head;ListNode *p;LinkList CreateList(void);void InsertNode(LinkList head,ListNode *p);ListNode *ListFind(LinkList head);void DelNode(LinkList head);void PrintList(LinkList head);/*******尾插法建立带头结点的通讯录链表算法*******/LinkList CreateList(void){LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点ListNode *p,*rear;char flag='y'; //int flag=0; //结束标志置0rear=head; //尾指针初始指向头结点while (flag=='y'){p=(ListNode *)malloc(sizeof(ListNode)); //申新结点printf("编号(4) 姓名(8) 性别电话(11) 地址(31)\n");printf("-----------------------------------------------\n");printf("\n添加的编号:\n");cin>>p->data.num;printf("\n添加的姓名:\n");cin>>p->;printf("\n性别:\n");cin>>p->data.sex;printf("\n电话:\n");cin>>p->data.phone;printf("\n地址:\n");cin>>p->data.addr;rear->next=p; //新结点连接到尾结点之后rear=p; //尾指针指向新结点printf("继续建表?(y/n):");cin>>flag;rear->next=NULL; //终端结点指针置空return head; //返回链表头指针}/*********在通讯录链表head中插入结点************/void InsertNode(LinkList head,ListNode *p){ListNode *p1,*p2;p1=head;p2=p1->next;while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0){p1=p2; //p1指向刚访问过的结点p2=p2->next; //p2指向表的下一个结点}p1->next=p; //插入p所指向的结点p->next=p2; //连接表中剩余的结点}/**********有序通讯录链表的查找****************/ListNode *ListFind(LinkList head){ListNode *p;char num[5];char name[9];char pp;printf("==================\n");printf(" a. 按编号查询\n");printf(" b. 按姓名查询\n");printf("==================\n");printf(" 请选择:");p=head->next;cin>>pp;if (pp=='a'||pp=='A'){printf("请输入要查找者的编号:");cin>>num;while (p&&strcmp(p->data.num,num)<0) p=p->next;if ((p==NULL)||strcmp(p->data.num,num)>0) p=NULL; //没有查到要查找的通讯信息}if (pp=='b'||pp=='B'){printf(" 请输入要查找者的姓名:");cin>>name;while(p&&strcmp(p->,name)!=0) p=p->next;}return p;}/********通讯录链表上的结点删除*****************/void DelNode(LinkList head){char cho;ListNode *p,*q;p=ListFind(head); //调用查找函数if (p==NULL){printf("没有查到要删除的通讯者!\n");return;}else if(p!=NULL){printf("真的要删除该结点吗?(y/n)");cin>>cho;if (cho=='y'||cho=='Y'){q=head;while ((q!=NULL)&&(q->next!=p)) q=q->next;q->next=p->next; //删除结点free(p); //释放被删结点空间printf("删除成功!\n");}}}/********通讯录链表的输出函数**********/void PrintList(LinkList head){ListNode *p;p=head->next;printf("编号姓名性别联系电话地址\n");printf("--------------------------------------------------------------------------------\n");while (p!=NULL){printf("%s,%s,%s,%s,%s\n",p->data.num,p->,p->data.sex,p->data.phone,p->data.a ddr);printf("---------------------------------------------------------------------------------\n");p=p->next; //后移一个结点}}void main(){int choice,j=1;while(j){printf("\n\n\n\n\n");printf("\t\t\t\t通信录链表\n");printf("\n\t\t\t******************************");printf("\n\t\t\t* 1--- 通信录链表建立*");printf("\n\t\t\t* 2--- 通信录链表插入*");printf("\n\t\t\t* 3--- 通信录链表查询*");printf("\n\t\t\t* 4--- 通信录链表删除*");printf("\n\t\t\t* 5--- 通信录链表输出*");printf("\n\t\t\t* 0--- 退出管理系统*");printf("\n\t\t\t******************************");printf("\n\t\t\t请选择菜单号(0--5):");cin>>choice;getchar();switch(choice){case 1:{printf("**********************************\n");printf("* 通讯录链表的建立*\n");printf("**********************************\n");head=CreateList( );flag1=1;system("cls");break;}case 2:{if(flag1!=1) {printf("请先建立表!");Sleep(1500); system("cls");}printf("**********************************\n");printf("* 通讯者信息的添加*\n");printf("**********************************\n");printf("编号(4) 姓名(8) 性别(3) 电话(11) 地址(31)\n");printf("************************************* \n");p=(ListNode *)malloc(sizeof(ListNode)); //申请新结点printf("\n添加的编号:\n");cin>>p->data.num;printf("\n添加的姓名:\n");cin>>p->;printf("\n性别:\n");cin>>p->data.sex;printf("\n电话:\n");cin>>p->data.phone;printf("\n地址:\n");cin>>p->data.addr;InsertNode(head,p);system("cls");break;}case 3:{if(flag1!=1) {printf("请先建立表!");Sleep(1500);system("cls");}else{printf("***********************************\n");printf("* 通讯录信息的查询*\n");printf("***********************************\n");p=ListFind(head);if (p!=NULL){printf("编号姓名性别联系电话地址\n");printf("--------------------------------------------------\n");printf("%s,%s,%s,%s,%s\n",p->data.num,p->,p->data.sex,p->data.phone,p->data.a ddr);printf("---------------------------------------------------\n");}else printf("没有查到要查询的通讯者!\n");}break;}case 4:{if(flag1!=1) {printf("请先建立表!"); Sleep(1500);}else{printf("***********************************\n");printf("* 通讯录信息的删除*\n");printf("***********************************\n");DelNode(head); //删除结点}break;}case 5:{if(flag1!=1) {printf("请先建立表!"); Sleep(1500);}else{printf("************************************\n");printf("* 通讯录链表的输出*\n");printf("************************************\n");PrintList(head);}break;}case 0:j=0;system("cls");break;default:printf("\t\t\n 输入有错,请重新输入!\n");Sleep(1500);system("cls");break;}}}。