数据结构 链表的应用 通讯录管理

合集下载

链表通讯录课程设计

链表通讯录课程设计

链表通讯录课程设计一、教学目标本课程的目标是让学生掌握链表在通讯录管理中的应用。

具体来说,知识目标包括理解链表的基本概念、结构及其在通讯录中的作用;技能目标则是培养学生运用链表进行通讯录数据管理的能力,包括创建、删除、查找和修改通讯录信息;情感态度价值观目标则是培养学生对计算机科学的好奇心、探索精神和责任感。

二、教学内容本课程的教学内容主要包括链表的基本概念、结构及其在通讯录管理中的应用。

具体安排如下:1.第一课时:链表的基本概念和结构。

介绍链表的定义、特点及其与数组的区别。

2.第二课时:链表的创建与删除。

讲解如何创建一个链表、如何删除链表中的节点以及如何释放链表内存。

3.第三课时:链表的查找与修改。

教授如何查找链表中的节点、如何修改链表中的节点数据以及如何实现链表的排序。

4.第四课时:链表在通讯录中的应用。

结合实际案例,讲解如何使用链表管理通讯录信息,包括增加、删除、查找和修改通讯录条目。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。

主要包括:1.讲授法:用于讲解链表的基本概念、结构和通讯录管理的基本原理。

2.案例分析法:通过分析实际案例,让学生了解链表在通讯录中的应用。

3.实验法:让学生动手实践,实际操作链表的操作方法,提高其实际应用能力。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《数据结构与算法》。

提供链表的基本概念、结构和算法。

2.多媒体资料:包括链表的动画演示、实际案例的视频讲解等,帮助学生更直观地理解链表的操作。

3.实验设备:提供计算机和编程环境,让学生可以实际操作链表的操作方法。

五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面、客观、公正地评价学生的学习成果。

具体安排如下:1.平时表现:占比30%,通过课堂参与、提问、小组讨论等方式评估学生的学习态度和理解程度。

2.作业:占比30%,布置与课程内容相关的编程练习,评估学生的实际操作能力。

数据结构通讯录管理系统课程设计实验报告心得

数据结构通讯录管理系统课程设计实验报告心得

数据结构通讯录管理系统课程设计实验报告背景随着信息化的快速发展,通讯录管理系统成为了每个人生活中必备的工具之一。

传统的纸质通讯录已经无法满足人们对于信息管理的需求,因此开发一个高效、便捷、用户友好的通讯录管理系统显得尤为重要。

本次课程设计实验的目标是设计一个基于数据结构的通讯录管理系统,实现通讯录的创建、查找、修改、删除等功能。

通过本次实验,我们可以学习和掌握数据结构中的链表、哈希表等基础概念和算法,并将其应用到实际项目中。

分析通讯录管理系统主要有以下几个功能:1.创建通讯录:通讯录是一个存储联系人信息的数据结构,可以存储联系人的姓名、电话号码、邮箱地址等信息。

2.添加联系人:可以向通讯录中添加新的联系人,包括姓名、电话号码、邮箱地址等信息。

3.查找联系人:可以根据姓名或电话号码查找通讯录中的联系人,并显示其详细信息。

4.修改联系人:可以根据姓名或电话号码修改通讯录中的联系人信息。

5.删除联系人:可以根据姓名或电话号码删除通讯录中的联系人。

为了实现上述功能,我们可以使用链表来实现通讯录的存储,每个节点表示一个联系人。

每个节点包含姓名、电话号码、邮箱地址等信息,并且有指向下一个节点的指针。

为了提高查找联系人的效率,我们还可以使用哈希表来实现联系人的快速查找。

哈希表采用键值对的方式存储数据,通讯录中的联系人可以以姓名为键,联系人节点为值存储在哈希表中。

结果实验的最终结果是一个完善的通讯录管理系统,能够实现创建通讯录、添加联系人、查找联系人、修改联系人和删除联系人等功能。

在实现过程中,我们遵循了以下步骤:1.首先,我们设计了联系人节点的数据结构,包括姓名、电话号码、邮箱地址等字段,并定义了节点的操作方法。

2.接着,我们设计了通讯录的数据结构,使用链表来存储联系人节点,并实现了通用的链表操作方法,如插入节点、删除节点等。

3.然后,我们设计了哈希表的数据结构,使用哈希函数将联系人节点存储在哈希表中,并实现了查找联系人的快速算法。

数据结构课程设计-通讯录管理系统

数据结构课程设计-通讯录管理系统

《数据结构》课程设计报告书题目:通讯录管理系统系别:计算机科学与应用系学号:学生姓名:指导教师:完成日期:2012年5月28日1 问题描述(1)题目内容:通讯录管理。

(2)基本要求:利用单链表实现通讯录的建立、通讯者的插入、通讯者的删除、通讯者的查询以及通讯录的输出。

(3)设计目的:通过本次课程设计,了解通讯录的一些基本功能。

掌握利用单链表进行插入,查找,用关键字建立单链表。

2 需求分析经过本次的课程设计,我认为通讯录主要实现的功能如下:(1)添加信息:一个通讯录应该有其基本的添加功能。

在程序设计时,我通过一个具有添加功能的函数,实现了个人信息的添加,如:姓名,性别,电话号码,QQ号码,地址。

(2)删除信息:当你不需要某个联系人的信息时,可以直接将该人的信息删除。

(3)查找:一个通讯录应该具有令一基本功能就是查找,本设计时可以按联系人为关键字查找的,只要你输入要查找人的姓名或手机号码或QQ号码就可出来相应的个人信息。

(4)输出:一个通讯录应该具有输出所有联系人的功能,本设计按照次序可以从头到尾把通讯录中的所有联系人都输出,供自己查看。

(5)退出:当你做完你要做的事情之后,就可以退出该程序。

3 总体设计3.1 算法的定义LinkList Creat_LinkList()创建空单链表void Insert_LinkList(LinkList H)建立通讯录,录入联系人的信息,可以把联系人的姓名,性别,手机号,QQ号,地址录入系统。

void Locate_LinkList(LinkList H)按照联系人的姓名,手机号码,QQ号码查找通讯录中联系人的信息。

void Delete_LinkList(LinkList H)按照联系人的姓名,手机号码,QQ号码删除联系人的所有信息。

void print_LinkList(LinkList H)输出通讯录中的所有联系人的信息供使用者查看。

3.2 系统流程图图3-1通讯录管理功能图3.3 详细程序设计1)定义数据结构typedef struct Node //定义数据结构{char name[20];//姓名char sex[4]; //性别char tel[11];//电话号码char qq[13]; //qq号码char ad[100];//地址Node *next;//存放后继元素的地址}LNode,*LinkList;2)创建一个空的单链表LinkList Creat_LinkList(){//创建空单链表,入口参数无LinkList H;H=new LNode;if(H)//确认创建头结点创建是否成功,若成功,修改单链表头结点的指针域为0表空表{H->next=NULL;}return H;}3)向通讯录中插入联系人void Insert_LinkList(LinkList H){LinkList p;p=new LNode;if(!p){cout<<"不能插入!"<<endl;}cout<<"请输入你要插入的联系人信息:"<<endl;cout<<"姓名:"<<endl;cin>>p->name;cout<<"性别:"<<endl;cin>>p->sex;cout<<"手机号码:"<<endl;cin>>p->tel;cout<<"QQ号码:"<<endl;cin>>p->qq;cout<<"地址:"<<endl;cin>>p->ad;p->next=H->next;H->next=p;cout<<"插入成功"<<endl;}4)查询通讯录中某个联系人的信息void Locate_LinkList(LinkList H){int x;LinkList p=H->next;cout<<"你要通过哪种方式查询?"<<endl;cout<<"1.通过联系人姓名查询"<<endl;cout<<"2.通过联系人手机号码查询"<<endl;cout<<"3.通过联系人QQ号码查询"<<endl;cin>>x;char str[30];if(x==1){cout<<"请输入你要查询的联系人的姓名:";cin>>str;while(p && strcmp(p->name,str)!=0){p=p->next;}}if(x==2){cout<<"请输入你要查询的联系人的手机号码:";cin>>str;while(p&&strcmp(p->tel,str)!=0){p=p->next;}}if(x==3){cout<<"请输入你要查询的联系人的QQ号码:";cin>>str;while(p&&strcmp(p->qq,str)!=0){p=p->next;}}if(p==NULL){cout<<"没有找到你要查找的联系人的信息!"<<endl;}else{cout<<"你要找的联系人的信息为:"<<endl;cout<<"姓名:"<<p->name<<endl;cout<<"性别:"<<p->sex<<endl;cout<<"手机号:"<<p->tel<<endl;cout<<"QQ号码"<<p->qq<<endl;cout<<"地址"<<p->ad<<endl;}}5)删除通讯录中某个联系人的信息void Delete_LinkList(LinkList H){if(H->next==NULL){cout<<"通讯录为空,不能删除"<<endl;}else{int x;char str[30];LinkList p,q;p=H->next;cout<<"请输入你要删除的方式:"<<endl;cout<<"1.按照联系人的姓名删除"<<endl;cout<<"2.按照联系人的手机号码删除"<<endl;cout<<"3.按照联系人的QQ号码删除"<<endl;cin>>x;q=H;if(x==1){cout<<"请输入你要删除的联系人的姓名:"<<endl;cin>>str;while(strcmp(p->name,str)!=0){q=p;p=p->next;}}if(x==2){cout<<"请输入你要删除的联系人的手机号码:"<<endl;cin>>str;while(strcmp(p->tel,str)!=0){q=p;p=p->next;}}if(x==3){cout<<"请输入你要删除的联系人的QQ号码:"<<endl;cin>>str;while(strcmp(p->qq,str)!=0){q=p;p=p->next;}}if(p==NULL){cout<<"没有你要删除的联系人的记录"<<endl;}else{q->next=p->next;p->next=NULL;free(p);cout<<"该联系人已删除"<<endl;}}}6)输出所有联系人void print_LinkList(LinkList H){if(H->next==NULL){cout<<"通讯录为空"<<endl;}else{LinkList p;p=H->next;while(p!=NULL){cout<<"性别:"<<p->sex<<endl;cout<<"手机号:"<<p->tel<<endl;cout<<"QQ号码:"<<p->qq<<endl;cout<<"地址:"<<p->ad<<endl;p=p->next;}}}7)主函数void main(){int a;LinkList List;List=Creat_LinkList();do{cout<<"*****欢迎进入通讯录管理*****"<<endl;cout<<"*****添加联系人请按1*****"<<endl;cout<<"*****查找联系人请按2*****"<<endl;cout<<"*****删除联系人请按3*****"<<endl;cout<<"*****输出所有联系人请按4*****"<<endl;cout<<"*****退出请按0*****"<<endl;cout<<"请输入你的选择:"<<endl;cin>>a;switch(a){case 0:break;case 1:Insert_LinkList(List);break;case 2:Locate_LinkList(List);break;case 3:Delete_LinkList(List);break;case 4:print_LinkList(List);break;}cout<<"操作完毕,请再次选择!"<<endl;}while(a!=0);}3.4 测试运行程序,看到主界面。

掌握数据结构中的链表和数组的应用场景

掌握数据结构中的链表和数组的应用场景

掌握数据结构中的链表和数组的应用场景链表和数组都是常用的数据结构,它们在不同的场景下有不同的应用。

一、链表的应用场景:1.链表适合动态插入和删除操作:链表的插入和删除操作非常高效,只需修改指针的指向,时间复杂度为O(1)。

因此,当需要频繁进行插入和删除操作时,链表是一个很好的选择。

-操作系统中的进程控制块(PCB):操作系统需要频繁地创建、停止、销毁进程,使用链表存储这些PCB,可以方便地插入、删除和管理进程。

-聊天记录:在聊天应用中,新的消息会动态插入到聊天记录中,使用链表存储聊天记录可以方便地插入新消息。

2.链表节省内存空间:每个节点只需存储当前元素和指向下一个节点的指针,不需要像数组一样预分配一块连续的内存空间,因此链表对内存空间的利用更加灵活。

-操作系统中的内存管理:操作系统使用链表来管理空闲内存块和已分配的内存块,可有效节省内存空间。

3.链表支持动态扩展:链表的长度可以随时变化,可以动态地扩容和缩容。

-缓存淘汰算法:在缓存中,如果链表已满,当有新数据需要加入缓存时,可以通过删除链表头部的节点来腾出空间。

4.链表可以快速合并和拆分:将两个链表合并成一个链表只要调整指针的指向即可,时间复杂度为O(1)。

-链表排序:在排序算法中,链表归并排序利用链表快速合并的特性,使得归并排序在链表上更高效。

二、数组的应用场景:1.随机访问:数组可以根据索引快速访问元素,时间复杂度为O(1)。

-图像处理:图像通常以像素点的形式存储在数组中,可以通过索引快速访问某个特定像素点的颜色信息。

2.内存连续存储:数组的元素在内存中是连续存储的,可以利用硬件缓存机制提高访问效率。

-矩阵运算:矩阵可以通过二维数组来表示,利用矩阵的连续存储特性,可以高效地进行矩阵运算。

3.大数据存储:数组可以预先分配一块连续的内存空间,非常适合存储大量的数据。

-数据库中的数据表:数据库中的数据表通常使用数组来实现,可以快速存取和处理大量的数据。

数据结构——通讯录实验报告

数据结构——通讯录实验报告

数据结构——通讯录实验报告
《数据结构课程设计》实验报告
编号实验一实验项目名称通讯录管理
班学姓08计科(1)班学时数 6 指导教师冯韵 5 黄媛级号名
成实验日期 2010年9月7日绩
一、实验目的:使用有关单链表的操作来实现通讯录信息系统的管理二、内容与设计思想:(设计思想、主要数据结构、主要代码结构、主要代码段分析) 设计思想:利用单链表的建立、查询、插入、删除、输出实现通讯录管理。

主要数据结构:单链表的建立、查询、插入、删除。

主要代码结构和分析:
void main( )主函数
for循环实现菜单循环。

int menu_select( ) 菜单选择函数
首先输出菜单选项,将输入的选项赋给sn,用sn判断输入值是否合理。

利用for循环实现重复选择,利用switch调用建立、查询、插入、删除和输出函数。

LinkList CreateList(void)建立带头结点链表
首先利用malloc申请头结点,置结束标志为0.通过0、1选择来结束建表。

三、调试过程(测试数据设计与测试结果分析) 四、总结
1、设计中遇到的问题及解决过程
2、设计中产生的错误及原因分析
3、设计体会和收获
五、评阅意见:。

数据结构课程设计通讯录管理系统报告

数据结构课程设计通讯录管理系统报告

数据结构课程设计通讯录管理系统报告前言通讯录管理系统是一种常见的应用程序,用于帮助用户有效地组织和管理他们的联系人信息。

本报告旨在介绍和分析一个基于数据结构设计的通讯录管理系统,其中实现了基本的通讯录功能,并且通过合适的数据结构和算法进行优化。

功能需求通讯录管理系统需要实现以下基本功能: - 添加联系人信息 - 查找联系人信息 - 删除联系人信息 - 更新联系人信息 - 显示所有联系人信息数据结构选择为了实现通讯录管理系统的功能,我们选择使用链表作为数据结构。

链表是一种简单而灵活的数据结构,可以动态地添加或删除节点,非常适合存储联系人信息这种动态的数据。

在这里,我们采用双向链表,使得查找、插入和删除操作更加高效。

算法设计添加联系人信息添加联系人信息时,我们需要遍历链表找到合适的位置插入新节点,这里的算法复杂度为O(n),其中n表示链表的长度。

查找联系人信息查找联系人信息时,我们需要遍历链表查找目标节点,这里的算法复杂度为O(n)。

删除联系人信息删除联系人信息时,我们同样需要遍历链表找到目标节点并删除,其算法复杂度为O(n)。

更新联系人信息更新联系人信息时,我们首先需要查找到目标节点,然后进行更新操作,其算法复杂度也为O(n)。

系统优化为了提高系统的性能,我们可以通过以下几种方式进行优化: - 使用哈希表索引联系人信息,减少查找联系人的时间复杂度; - 引入缓存机制,减少频繁的IO 操作。

总结通过本报告的介绍和分析,我们了解了一个基于数据结构设计的通讯录管理系统的实现原理和优化方法。

在实际应用中,针对具体需求和场景,我们可以进一步优化系统性能,提升用户体验。

通讯录管理系统作为一种简单而实用的应用程序,将在日常生活中发挥重要作用。

数据结构单链表通讯录

数据结构单链表通讯录

实验报告实验名称单链表通讯录一、实验目的1.熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。

二、实验内容1.用带头结点的单链表作存储结构,实现通讯录单链表的建立、查询、修改、排序、合并、统计、结点的查找、移动以及通讯录链表的输出功能。

三、实验要求设计要求:为了实现通讯录管理的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。

主控菜单设计要求:菜单内容程序运行后,给出9个菜单项的内容和输入提示:1.创建通讯录链表;2.将姓名为Name的好友的手机号改为MTel;3.输出通讯录;4.插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名>Name的结点放到该结点后面5.将通讯录按照好友姓名进行非递减排序;6.将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个;7.统计籍贯是“大连”的好友人数;8.将通讯录中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序);9.将通讯录的正中间位置结点之后的全部结点倒置;0.退出管理系统请选择0—9:菜单设计要求:使用数字0—9来选择菜单项,其它输入则不起作用。

四、实验概要设计1)功能框图五. 使用说明1.运行环境:VC6.02.首先选择主控菜单中的操作1,即建表,然后进行其它操作.六.实验截图(见下页)七实验体会附源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define Newsp (TxlList *)malloc(sizeof(struct TxlList))typedef struct TxlList{char Name[16]; //姓名char MTel[11]; //手机号char Tel[9]; //固定电话char EMail[16]; //邮箱地址char BornAddr[20]; //籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称)char BroadN[50]; //博客名struct TxlList *next; //指针域}TxlList, *TxlLink;void Lbuild1(TxlLink &T){//创建文件FILE *fp;TxlLink q;q=Newsp;q=T;int NUM;char filename[20];printf("\n*请输入要创建的通讯录名:\n");gets(filename);if ((fp=fopen(filename, "wb"))==NULL) { /*以写方式在当前目录打开(新建)文件*/printf("can't open file!!!\n");exit(0); //如果文件无法打开,关闭已经打开的其它文件,结束程序。

数据结构通讯录管理系统报告

数据结构通讯录管理系统报告

数据结构通讯录管理系统报告数据结构通讯录管理系统报告⒈系统介绍⑴目的和背景本通讯录管理系统旨在提供一个便捷的方式来管理个人联系人信息。

用户可以使用该系统添加、编辑和删除联系人信息,并实现相关功能,如搜索、排序等。

⑵功能概述本系统主要包含以下功能:●添加联系人:用户可以输入联系人的姓名、方式号码、电子邮件等信息来添加新的联系人。

●编辑联系人:用户可以对已存在的联系人进行信息的修改或更新。

●删除联系人:用户可以选择删除指定联系人以删除其相关信息。

●搜索联系人:用户可以根据姓名或方式号码进行联系人的快速搜索。

●排序联系人:用户可以对联系人按照姓名或方式号码等属性进行升序或降序排列。

●显示联系人:用户可以查看已存储的所有联系人信息。

⑶系统架构本系统基于数据结构的链表实现,通过使用链表结构来存储所有的联系人信息。

每个联系人都是链表的一个节点,包含姓名、方式号码等属性,以及指向下一个联系人的指针。

⒉系统设计⑴数据结构设计本系统使用链表来存储联系人信息。

链表的每个节点包含以下数据项:●姓名:联系人的姓名,类型为字符串。

●方式号码:联系人的方式号码,类型为字符串。

●电子联系人的电子邮件地质,类型为字符串。

●下一个节点的指针:指向下一个联系人节点的指针,类型为链表节点指针。

⑵系统模块设计本系统包含以下模块:●菜单模块:显示主菜单和相应的选项,接受用户输入并调用其他模块执行相应的操作。

●添加模块:添加新的联系人信息,包括姓名、方式号码、电子邮件等。

●编辑模块:修改已存在联系人的信息,如姓名、方式号码、电子邮件等。

●删除模块:删除指定联系人的信息。

●搜索模块:根据指定的姓名或方式号码搜索联系人信息。

●排序模块:按照姓名或方式号码等属性对联系人信息进行排序。

●显示模块:显示当前存储的所有联系人信息。

⒊系统实现⑴编程语言和工具本系统使用C++编程语言实现,使用了链表和相关的指针操作来实现联系人管理功能。

⑵算法设计●添加联系人:通过创建新的链表节点并将其插入到链表末尾来实现联系人的添加功能。

数据结构课程设计通讯录管理系统

数据结构课程设计通讯录管理系统

数据结构课程设计通讯录管理系统
数据结构课程设计中的通讯录管理系统可以涉及到以下几个方面的知识点:
1. 数据结构:通讯录管理系统中需要使用到的数据结构包括数组、链表、哈希表等。

其中,数组用于存储通讯录中的人员信息,链表用于存储联系人信息,哈希表用于实现快速查找功能。

2. 算法:通讯录管理系统中需要使用到的算法包括查找算法、排序算法、动态规划算法等。

其中,查找算法用于实现快速查找联系人功能,排序算法用于实现通讯录的排序功能,动态规划算法用于实现最长公共子序列问题等。

3. 数据库:通讯录管理系统需要使用到数据库来存储通讯录中的数据。

需要掌握关系型数据库的设计和操作,包括数据表的设计、SQL 语句的编写等。

4. 界面设计:通讯录管理系统需要有友好的用户界面,需要进行界面设计和开发,包括前端技术的使用,如HTML、CSS和JavaScript等。

5. 系统测试:通讯录管理系统需要进行系统测试,包括功能测试、性
能测试等,确保系统能够正常运行并满足用户需求。

通过设计和实现通讯录管理系统,可以锻炼学生对数据结构和算法的理解和应用能力,同时还能提高学生的编程能力和团队合作能力。

数据结构课程设计通讯录管理系统

数据结构课程设计通讯录管理系统

数据结构课程设计通讯录管理系统一、系统需求分析通讯录管理系统的主要目标是提供一个方便、高效的方式来管理联系人信息。

具体需求包括:1、能够添加联系人,包括姓名、电话号码、电子邮件、地址等基本信息。

2、可以对联系人信息进行修改和删除操作。

3、支持按照姓名、电话号码等关键字进行快速查找。

4、能够以列表形式展示所有联系人的信息。

二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储联系人信息。

考虑到联系人信息的多样性和动态性,链表是一个不错的选择。

链表可以方便地进行插入、删除和修改操作,并且能够灵活地调整存储空间。

另外,为了提高查找效率,我们可以结合使用哈希表。

通过将联系人的关键信息(如姓名或电话号码)进行哈希运算,快速定位到对应的联系人节点。

三、系统功能实现1、添加联系人功能当用户选择添加联系人时,系统会提示用户输入联系人的各项信息。

这些信息被封装成一个结构体,并通过链表的插入操作添加到链表中。

同时,将关键信息映射到哈希表中,以便后续快速查找。

2、修改联系人功能用户输入要修改的联系人的关键字,系统通过哈希表快速找到对应的联系人节点。

然后,提示用户输入修改后的信息,并更新链表和哈希表中的数据。

3、删除联系人功能与修改功能类似,通过关键字找到联系人节点,从链表和哈希表中删除相应的节点和信息。

4、查找联系人功能用户输入查找关键字,系统通过哈希表进行快速定位,如果找到匹配的联系人,则显示其详细信息。

5、展示所有联系人功能遍历链表,将所有联系人的信息以列表形式输出到屏幕上。

四、系统界面设计为了提高用户体验,系统设计了简洁直观的界面。

主界面提供了添加、修改、删除、查找和展示所有联系人等功能选项。

用户通过选择相应的选项,进入对应的操作流程。

五、代码实现示例以下是部分关键代码的示例:```c//联系人结构体typedef struct Contact {char name50;char phoneNumber20;char email50;char address100;struct Contact next;} Contact;//哈希表节点结构体typedef struct HashNode {char key50;Contact contact;struct HashNode next;} HashNode;//链表插入联系人void insertContact(Contact head, Contact newContact) {newContact>next = head;head = newContact;}//哈希函数unsigned int hashFunction(const char key) {unsigned int hash = 0;while (key) {hash =(hash << 5) + key++;}return hash % HASH_TABLE_SIZE;}//查找联系人Contact findContact(Contact head, const char key, HashNode hashTable) {unsigned int hashValue = hashFunction(key);HashNode node = hashTablehashValue;while (node) {if (strcmp(node>key, key) == 0) {return node>contact;}node = node>next;}Contact current = head;while (current) {if (strcmp(current>name, key) == 0 ||strcmp(current>phoneNumber, key) == 0) {//更新哈希表HashNode newNode =(HashNode )malloc(sizeof(HashNode));strcpy(newNode>key, key);newNode>contact = current;newNode>next = hashTablehashValue;hashTablehashValue = newNode;return current;}current = current>next;}return NULL;}```六、系统测试在完成系统的开发后,需要进行全面的测试以确保系统的稳定性和可靠性。

数据结构课程设计学生通讯录管理系统[2][1]1

数据结构课程设计学生通讯录管理系统[2][1]1

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.添加信息。

数据结构在网络通信中的应用

数据结构在网络通信中的应用

数据结构在网络通信中的应用在现代社会中,网络通信已经成为人们和组织间交流和信息传递的重要手段。

无论是在家庭、企业还是公共机构,网络通信已经贯穿在我们生活的方方面面。

而在网络通信中,数据结构起到了重要的作用。

本文将探讨数据结构在网络通信中的应用。

一、链表在网络通信中的应用链表是一种常见的数据结构,它由若干个节点通过指针按照一定的顺序连接而成。

在网络通信中,链表可以用于存储和管理连接设备或者用户的信息。

例如,在服务器端,链表可以用于存储已连接的用户信息。

每个节点可以包含一个用户的IP地址、用户名等信息,通过链表的连接,服务器可以轻松地遍历所有已连接的用户,并进行相应的数据交互。

二、栈在网络通信中的应用栈是一种具有后进先出特性的数据结构,它可以用于实现网络通信中的数据包的传输和处理。

在网络通信中,数据包的处理通常是按照先进先出的原则进行的。

当一个数据包抵达服务器时,服务器首先将其放入栈中,然后按照栈的后进先出特性对数据包进行处理。

这种方式可以确保数据包按照抵达顺序进行处理,避免了数据包的丢失或者处理混乱的情况。

三、队列在网络通信中的应用队列是一种具有先进先出特性的数据结构,它可以用于实现网络通信中的消息队列。

在网络通信中,消息队列常用于实现生产者-消费者模式。

生产者将消息放入队列中,而消费者从队列中取出消息并进行处理。

这种方式可以实现异步通信,提高系统的并发性能。

同时,队列还可以用于负载均衡,当系统压力过大时,可以将请求放入队列中,以控制系统的负载。

四、图在网络通信中的应用图是一种复杂的数据结构,它由节点和边组成,可以用于表示和处理网络通信中的复杂关系。

例如,在路由器和交换机中,图可以用于表示不同网络设备之间的连接关系。

通过图的算法和遍历,网络设备可以选择最短路径来实现数据包的路由和转发。

另外,图还可以用于表示用户间的关系,例如社交网络中的好友关系,通过图的算法可以实现好友推荐等功能。

综上所述,数据结构在网络通信中担当着重要的角色。

链表实现c语言通讯录管理系统,C++链表实现通讯录管理系统

链表实现c语言通讯录管理系统,C++链表实现通讯录管理系统

链表实现c语⾔通讯录管理系统,C++链表实现通讯录管理系统⽤数据结构⾥⾯线性结构的链表实现,供⼤家参考,具体内容如下⽂件操作未写有登录操作,复制源码需要更改登录模块的密码⽂件存放位置使⽤VS2017编译器需要保留开头:#define _CRT_SECURE_NO_WARNINGS#define _CRT_SECURE_NO_WARNINGS#include "iostream"#include "cstdio"#include "fstream"#include "stdlib.h"#include "String"#include "iomanip"#include "windows.h"#define LEN 100using namespace std;using std::cin;using std::cout;using std::endl;using std::ifstream;using std::ofstream;using std::ios;using std::cerr;using std::string;using std::setw;typedef struct LNode {char num[10];char name[20];char telNum[12];char qq[10];struct LNode *next;}LNode,*LinkList;int n = 0;LinkList SearchName(LinkList L);//按姓名查找LinkList SearchNum(LinkList L);//按学号查找void DelLNode(LinkList &L,LinkList p);//删除p结点void PrintLNode(LinkList p);//打印结点void PrintList(LinkList L);//打印表/*----------------系统函数----------------*/void CreateLinkList(LinkList &L);//创建链表void DelName(LinkList &L);//按姓名删除通讯录成员void DelNum(LinkList &L);//按学号删除通讯录成员void saveRecord(LinkList L);//存储信息void loadRecord(LinkList &L);//加载信息/*--------------------------------------*/void Secret();void fun();void ver();void yanshi(char *p);void clear();void header();void menu() {LinkList L=NULL;int select;do {system("cls");printf("\t\t\t Welcome to the address book information management system!\n\n\n"); printf("\t\t\t\t***************************************************\n");printf("\t\t\t\t * │1.InitList 2.Add Message │ *\n");printf("\t\t\t\t * │ │ *\n");printf("\t\t\t\t * │3.Search Message 4.Save File │ *\n");printf("\t\t\t\t * │ │ *\n");printf("\t\t\t\t * │5.Sort Static 6.Load Message │ *\n");printf("\t\t\t\t * │ │ *\n");printf("\t\t\t\t * │7.Display Message 8.Delete Message│ *\n");printf("\t\t\t\t***************************************************\n");cout << endl;yanshi((char *)"\t\tPlease choose the mode of operation(1~8):\n");/* cout << "\t\tPlease choose the mode of operation(1~8):" << endl;*/cin >> select;switch (select) {case 8:cout << "Please select the deletion method:\n1.Delete by student number 2.Delete by name\n" << endl; int x;cin >> x;switch (x) {case 1:DelNum(L);break;case 2:DelName(L);break;}case 6:loadRecord(L);break;case 5:break;case 4:saveRecord(L);break;case 3:clear();cout << "Please select a search method:\n1.Find by student number 2.Find by name\n" << endl;int a;cin >> a;switch (a) {{LinkList aa = SearchNum(L); header();PrintLNode(aa);cout << "\n\n\n成功!" << endl; system("pause");menu();}break;case 2:clear();{LinkList b = SearchName(L); header();PrintLNode(b);cout << "\n\n\n成功!" << endl; system("pause");menu();break;}}break;case 1:InitList(L);break;case 9:break;case 7:PrintList(L);break;case 2:CreateLinkList(L);cout << endl << endl << endl;cout << "The programe is over!" << endl << endl << endl; Sleep(2000);exit(0);break;}} while (select != 8);}int main() {fun();ver();//版本信息Secret();//密码登录menu();return 0;}//初始化表void InitList(LinkList & L){L = new LNode;//申请头结点L->next= NULL;}//插⼊⼀条信息void InsertLNode(LinkList & L, LNode *s){s->next = L->next;L->next = s;}//按姓名查找LinkList SearchName(LinkList L){char name[20];cout << "请输⼊要查找的姓名:" << endl;while (p) {//如果找到,退出循环,返回pif (strcmp(p->name, name) == 0) break;elsep = p->next;}return p;}//按学号查找LinkList SearchNum(LinkList L){char num[10];cout << "请输⼊要查找的学号:" << endl; cin >> num;LinkList p = L->next;while (p) {//如果找到,退出循环,返回pif (strcmp(p->num, num) == 0) break;elsep = p->next;}return p;}//删除节点void DelLNode(LinkList &L,LinkList p) {LinkList s=NULL, q;q = L->next;//将s指向p前⾯的⼀个结点while (q&&q!=p) {}s->next = q->next;delete q;}//打印⼀条信息void PrintLNode(LinkList p){printf("%15s", p->num);printf("%15s", p->name);printf("%15s", p->telNum);printf("%15s\n",p->qq);}//打印通讯录void PrintList(LinkList L){clear();header();LinkList p = L->next;while (p) {PrintLNode(p);p = p->next;}system("pause");}//添加信息void CreateLinkList(LinkList & L) {char ans = 'y';n = 0;while (ans=='y'||ans=='Y') { system("cls");LNode *p = new LNode;cout << "请输⼊姓名:" << endl;cin >> p->name;cout << "请输⼊电话号码:" << endl;cin >> p->telNum;cout << "请输⼊QQ号:" << endl;cin >> p->qq;InsertLNode(L,p);n++;cout<getchar();ans=getchar();}system("pause");}//按姓名删除void DelName(LinkList &L){char name[20];LinkList p;cout << "请输⼊要删除的学⽣姓名:" << endl; cin >> name;p = SearchName(L);if (p) {DelLNode(L,p);}system("pause");}//按学号删除void DelNum(LinkList & L){char num[20];LinkList p;p = SearchName(L);if (p) {DelLNode(L, p);}system("pause");}//存储信息void saveRecord(LinkList L){FILE *fp=NULL;int count = 0;if ((fp=(fopen("student.dat","wb")))==NULL) { cout << "Can't open this file!" << endl;Sleep(3000);}LinkList q = L->next;while (q) {fwrite(q, sizeof(LNode), 1, fp);count ++;q = q->next;}fclose(fp);cout << "Save the file successfully!" << endl; getchar();}//加载信息void loadRecord(LinkList & L){FILE *fp=NULL;int count = 0;if ((fp=(fopen("student.dat", "rb"))) == NULL) { cout << "Can't open this file!" << endl;LinkList p=NULL;while(1){p = new LNode;if (fread(p, sizeof(LNode), 1, fp) > 0) {InsertLNode(L,p);count++;}else {break;}}fclose(fp);cout << endl << endl << "Load "<Sleep(2200);}//控制台样式void fun() {system("color 2a");system("title 学⽣通讯录信息管理系统");}//版本信息void ver(){yanshi((char*)"\t \3\3\3\3\3\3\3欢迎使⽤通讯录信息管理系统\3\3\3\3\3\3\3\n\n\n\n"); cout << "\t 学⽣通讯录信息管理系统\n\n\n\n\n";cout << "\t\t version 1.0\n\n\n\n\n";cout << "\t\t xxxxxxxxx 某某某\n\n\n\n\n";cout << "\t\t Loading......\n\n" << endl;Sleep(3000);system("cls");}//延时输出while (1) {if (*p != 0)cout << *p++;elsebreak;Sleep(50);}}//清屏void clear(){system("cls");}//表头void header(){printf("%15s%15s%15s%15s\n","学号","姓名","电话","QQ");}/*--------------------------------登录模块----------------------------------*//*--------------------------------登录模块----------------------------------*//*--------------------------------登录模块----------------------------------*/struct UsrInfo//⽤户名的账户和密码信息{char UsrName[20];char Psword[20];};/*注意我的⽂件中⽤户名是⼀⾏,密码是⼀样。

数据结构-链表(二)-通讯录-C++实现

数据结构-链表(二)-通讯录-C++实现

数据结构-链表(⼆)-通讯录-C++实现通讯录的元素是⼈,所以需要新建⼀个Person类作为链表每个Node的元素。

并且为了正常输出,Person还需要⾍重载⼀些运算符,包括输出<<,判等==main函数⾥也要写⼀些辅助函数来获取信息。

链表本⾝实现部分不需要修改太多,把原来的的int型元素改为Person类型即可代码如下//Person.h#pragma once#include<iostream>#include<string>using namespace std;class Person{friend ostream& operator<<(ostream& out,Person &p){out << "Name: "<<<<"---" <<"Pnone number: "<< p.phone << endl;return out;}public:Person(string na, int num);Person();~Person();bool operator ==(Person &p){if ((this->name == ) && (this->phone == p.phone)){return true;}else{return false;}}string name="张三";int phone=0;private:};//Person.cpp#include"Person.h"Person::Person(string na, int num):name(na),phone(num){}Person::Person(){}Person::~Person(){}//Node.h#pragma onceusing namespace std;#include<iostream>#include"Person.h"class Node{public:Node(Person a);Node();~Node();Person person;Node* next;private:};//Node.cpp#include"Node.h"Node::Node(Person a):person(a){}Node::Node(){}Node::~Node(){}//List.h#pragma once#include<iostream>using namespace std;#include"Node.h"#define __debug__#ifdef __debug__#endifclass List{public:List();//~List();//bool get_add_head(Node* e);//在头节点后⾯插⼊bool get_add_tail(Node* e);//在尾节点后⾯插⼊void get_traverse();//遍历int get_length();//获取长度bool get_empty();//判空void get_clear();//清空线性表int get_ele_num(Node* p);//获取与传⼊参数值相同的链表中元素的序号 bool get_i_ele(int e, Node* value);//获指定位序的元素void get_delete(int location);//删除某位置元素bool get_add(int location, Node* e);//添加在某位置元素bool get_pre(Node* e, Node* pre);//获取前驱bool get_post(Node* e, Node* pos);//获取后继private:Node* node;//头节点int length;};//List.cpp#include"List.h"List::List(){length = 0;node = new Node;node->="zhangsan";node->person.phone = 0;node->next = NULL;}List::~List(){get_clear();delete node;node = NULL;}bool List::get_add_head(Node* e){Node* c_node = new Node;c_node=node->next;Node* new_node = new Node;if (new_node == NULL){return false;}new_node->person = e->person;new_node->next = c_node;node->next = new_node;length++;#ifdef __debug__cout << node->next->person << endl;#endifreturn true;}bool List::get_add_tail(Node* e){Node* c_node = new Node;c_node = node;while (c_node->next!=NULL){c_node = c_node->next;}Node* new_node = new Node;if (new_node == NULL){return false;}new_node->person = e->person;new_node->next = NULL;c_node->next = new_node;length++;#ifdef __debug__cout << c_node->next->person << endl;#endifreturn true;}void List::get_traverse(){Node* c_node = new Node;c_node = node->next;while (c_node != NULL){cout << c_node->person << endl;c_node = c_node->next;}}//遍历int List::get_length(){return length;}//获取长度bool List::get_empty(){return length == 0 ? true : false;}void List::get_clear(){Node* c_node = new Node;c_node = node;while(c_node->next != NULL){Node* new_node = new Node;new_node=c_node->next;delete c_node;//清除指向的内容c_node = new_node;}length = 0;node->next = NULL;//易错,勿忘!}//清空线性表int List::get_ele_num(Node* p)//获取元素的位序{Node* c_node = new Node;c_node=node;int count = 1;while (c_node->next != NULL){c_node = c_node->next;if (c_node->person == p->person){return count;}else{count++;}}return -1;}bool List::get_i_ele(int e, Node* value){if (e <1 || e > length){cout << "Invalid num!" << endl;return false;}Node* c_node = new Node;c_node = node;for (int i = 0; i <e; i++){c_node = c_node->next;}value->person = c_node->person;#ifdef __debug__cout << c_node->person << endl;#endifreturn true;}//获指定位序元素的值//void List::get_delete(int location){if (location<1 || location>length ){cout << "invalid num!!" << endl;}else{Node* c_node = new Node;c_node = node;Node* c_node_before = new Node;for (int i = 0; i < location; i++)//遍历到了location对应的位置,与增加元素有所不同,需要注意! {c_node_before = c_node;c_node = c_node->next;}c_node_before->next = c_node->next;length--;}}//某位置删除元素//bool List::get_add(int location, Node* e){if (location<1 || location>length){cout << "Invalid num!" << endl;return false;}else{Node* c_node = new Node;c_node=node;for (int i = 0; i < (location-1); i++){c_node = c_node->next;}//此时是遍历到了(location-1)那个元素的位置,然后在其后⾯插⼊新元素则是第location个元素。

程序设计基础综合实验 综合实验四:学生电子通讯录管理系统—链表的应用实验报告

程序设计基础综合实验   综合实验四:学生电子通讯录管理系统—链表的应用实验报告
实验名称: 班 级: 实验地点:
**大学**学院
程序设计基础综合实验 实验报告
综合实验四:学生电子通讯录管理系统—
一、实验内容:
问题描述:基于结构体链表,重新设计“综合实验二:学生电子通讯录管理系统——数组的 应用”里涉及的学生电子通讯录管理系统,要求重新设计后的系统应用以下功能。
二、实验源代码:
三、实验结果与分析(含测试数据、运行结果截图、分析和实验总结等):
四、教师评语: 实验成绩:
教师:谢胜利
1.链表应用:输入功能。基于用户键盘输入,创建学生个人通讯信息链表,要求对用户输入 的个人信息进行有效性检查。
2.链表应用:输出功能。在上面设计的基础上,设计链表输出函数。 3.链表应用:查找功能。在上面设计的基础上,设计链表查找函数。要求可以根据 1)学号 查找、2)姓名查找、3)手机查找、4)性别查找、以及 5)生日范围查找等。然后,在显示器上 输出查找到的学生信息。 4.链表应用:插入功能。在上面设计的基础上,设计节点插入函数; 5.链表应用:删除功能。在上面设计的基础上,基于查找函数,设计节点删除函数,要求能 够根据查找的结果删除相应的节点。然后,在显示器上显示删除后的链表内容。 6.链表应用:排序功能。在上面设计的基础上,设计链表排序函数。要求可以根据 1)学号 排序、2)姓名排序、3)性别排序、4)手机排序、以及 5)生日排序等。然后,在显示器上,输 出排序后的通讯录。 7.链表应用:保存功能。在上面设计的基础上,设计链表保存到外部文件的函数; 8.链表应用:创建功能。在上面设计的基础上,设计基于外部文件创建链表的函数。

数据结构课程设计学生通讯录管理系统设计与实现

数据结构课程设计学生通讯录管理系统设计与实现
}4.2.2通讯者结点的删除:
void DelNode(LinkList head)
{
char jx;int u;
ListNode *p,*q;
do{
p=ListFind(head); //调用查找函数
if (p==NULL) {
getchar();
getchar();
u=1;
}
if (jx=='y'||jx=='Y')
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所指向的结点
n++;
p->next=p2; //连接表中剩余部分
ListNode *p;
int n=0;
int person[10];
//函数说明
int menu_select( );
LinkList CreateList(void);
void InsertNode(LinkList head,ListNode *p);
ListNode *ListFind(LinkList head);
printf("------------------------------------------------------------\n");
}
else
printf("没查到要查询的通讯者!\n");

数据结构在通讯录管理系统设计中的应用

数据结构在通讯录管理系统设计中的应用

数据结构在通讯录管理系统设计中的应用作者:赵梦龙来源:《数字技术与应用》2015年第03期摘要:现阶段随着人们在生活中信息交流日益增多,信息通讯的重要性已逐渐凸现出来,人们在日常工作中对通讯工具的功能需求也越来越高,但无论何种通讯工具,其最主要的功能就是记录通讯者的信息,方便于日后通讯时使用。

本文利用数据结构以及C语言的相关知识,进行设计通讯录管理系统,以达到快速了解联系人信息,方便管理通讯录的目的。

关键词:数据结构通讯录管理程序设计软件调试中图分类号:tP309 文献标识码:A 文章编号:1007-9416(2015)03-0168-011 系统设计1.1 功能方案设计本设计主要利用单链表做存储结构,主要实现以下功能。

(1)通讯录链表的建立;(2)通讯者结点的插入;(3)通讯者结点的查询;(4)通讯者联系人的删除。

(5)通讯录链表的输出在本模板中能过显示系统中已有所有联系人的相关信息;(6)退出通讯录管理系统本模板功能是实现退出本系统的功能。

1.2 程序详细设计1.2.1 结构体及链表数据类型定义(1)/*定义用户登陆信息数据结构*/typedef struct Z1{char name[20];char pw[10];struct LOGIN*next;}LOGIN;用该结构体建立一个链表用来记录用户注册时输入的数据,该数据用来在用户登陆时进行验证。

(2)/*定义用户数据结构*/typedef struct Z2{char name[20];char tel[20];char qq[20];char addr[50];struct PEOPLE*next;}PEOPLE;用该结构体建立一个链表用来记录通讯录中的联系人和相关信息。

1.2.2 详细设计(1)createlist:此函数的功能是实现通信录的初始建立。

If(head){int c;printf("通讯录已经存在!是否要重新建立!\n 1 or 0:");scanf("%d",&c);if(c==0)return head;}//如果通信录存在,则由用户作出决定是否重新建立。

数据结构 链表的应用 通讯录管理

数据结构 链表的应用 通讯录管理

数据结构链表的应用通讯录管理实验要求:一、设计一个含有多个菜单项的程序,菜单项内容如下:1通讯录链表的建立2通讯录链表的插入3通讯录链表的查询4通讯录链表的删除5通讯录链表的输出0退出管理系统要求只能用0-5来选择菜单项,其他的输入无效二、分别实现多个菜单项的功能,要求每个功能在操作时都有确认提示三、编写一个程序实现整个通讯录管理系统,把主菜单的生成和各菜单项功能的实现作为子程序或者函数或者过程来实现。

四、要求关键语句必须要写注释。

#include "stdio.h"#include "string.h"#include "stdlib.h"typedef struct abc{ //通讯录结点类型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;//函数说明int menu_select();LinkList CreateList(void);void InsertNode(LinkList head,ListNode *p);ListNode *ListFind(LinkList head);void DelNode(LinkList head);void PrintList(LinkList head);//主函数void main(){for( ; ; ){switch(menu_select( ) ){case 1:printf("**********************************\n");printf("* 通讯录链表的建立*\n");printf("**********************************\n");head=CreateList( );break;case 2:printf("**********************************\n");printf("* 通讯者信息的添加*\n");printf("**********************************\n");printf("编号(4) 姓名(8) 性别(3) 电话(11) 地址(31)\n"); printf("************************************* \n");p=(ListNode *)malloc(sizeof(ListNode)); //申请新结点scanf("%s%s%s%s%s",p->data.num,p->,p->data.sex, p->data.phone,p->data.addr);InsertNode(head,p);break;case 3: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.addr);printf("---------------------------------------------------\n");}elseprintf("没有查到要查询的通讯者!\n");break;case 4:printf("***********************************\n");printf("* 通讯录信息的删除*\n");printf("***********************************\n");DelNode(head); //删除结点break;case 5:printf("************************************\n"); printf("* 通讯录链表的输出*\n");printf("************************************\n"); PrintList(head);break;case 0:printf("\t 再见!\n");return;}}}int menu_select( ){int sn;printf(" 通讯录管理系统\n");printf("===================\n");printf(" 1.通讯链表的建立\n");printf(" 2.通讯者结点的插入\n");printf(" 3.通讯者结点的查询\n");printf(" 4.通讯者结点的删除\n");printf(" 5.通讯录链表的输出\n");printf(" 0.退出管理系统\n");printf("==========================\n");printf(" 请选择0-5:");for( ;; ){scanf("%d",&sn);if (sn<0||sn>5)printf("\n\t输入错误,重选0-5:");elsebreak;}return sn;}LinkList CreateList(void){ //尾插法建立带头结点的通讯录链表算法LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点ListNode *p,*rear;int flag=0; //结束标志置0rear=head; //尾指针初始指向头结点while (flag==0){p=(ListNode *)malloc(sizeof(ListNode)); //申新结点printf("编号(4) 姓名(8) 性别电话(11) 地址(31)\n");printf("--------------------------------------------------------------------------------------\n"); scanf("%s%s%s%s%s",p->data.num,p->,p->data.sex,p->data.phone,p->data.addr);rear->next=p; //新结点连接到尾结点之后rear=p; //尾指针指向新结点printf("结束建表吗?(1/0):");scanf("%d",&flag);}rear->next=NULL; //终端结点指针置空return 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];int xz;printf("==================\n");printf(" 1. 按编号查询\n");printf(" 2. 按姓名查询\n");printf("==================\n");printf(" 请选择:");p=head->next; //假定通讯录表带头结点scanf("%d",&xz);if (xz==1) {printf("请输入要查找者的编号:");scanf("%s",num);while (p&&strcmp(p->data.num,num)<0)p=p->next;if ((p==NULL)||strcmp(p->data.num,num)>0) p=NULL; //没有查到要查找的通讯}elseif (xz==2) {printf(" 请输入要查找者的姓名:"); scanf("%s",name);while(p&&strcmp(p->,name)!=0) p=p->next;}return p;}void DelNode(LinkList head){char jx;ListNode *p,*q;p=ListFind(head); //调用查找函数if (p==NULL) {printf("没有查到要删除的通讯者!\n"); return;}printf("真的要删除该结点吗?(y/n):"); scanf("%c",&jx);if (jx=='y'||jx=='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.addr);printf("---------------------------------------------------------------------------------\n"); p=p->next; //后移一个结点}}。

通讯录算法描述

通讯录算法描述

通讯录算法描述通讯录算法描述一、概述通讯录是人们在日常生活中经常使用的工具,其主要功能是存储和管理联系人信息。

通讯录算法是指实现通讯录功能的计算机程序,其核心是数据结构和算法。

本文将从数据结构和算法两个方面对通讯录算法进行详细描述。

二、数据结构1. 链表链表是一种常见的数据结构,在通讯录中可以用来存储联系人信息。

每个节点包含联系人的姓名、电话号码等信息,以及指向下一个节点的指针。

通过遍历链表可以查找、添加、删除联系人信息。

2. 哈希表哈希表是一种高效的数据结构,在通讯录中可以用来快速查找联系人信息。

哈希表将每个联系人的姓名映射到一个唯一的索引值,然后将该索引值作为数组下标存储联系人信息。

通过哈希函数可以快速计算出联系人在数组中的位置,从而实现快速查找。

3. 树形结构树形结构是一种层次化的数据结构,在通讯录中可以用来组织联系人信息。

树形结构由根节点、子节点和叶子节点组成,每个节点包含一个或多个属性。

在通讯录中可以将联系人按照姓名的首字母分组,每个分组作为一个节点,子节点包含具体的联系人信息。

三、算法1. 查找算法查找算法是通讯录算法中最基本的功能之一。

可以通过遍历链表、哈希表或树形结构实现查找。

其中,哈希表是最快的查找方法,时间复杂度为O(1),而链表和树形结构的时间复杂度分别为O(n)和O(logn)。

2. 添加算法添加算法是通讯录算法中另一个重要的功能。

在链表中添加联系人只需要将新节点插入到链表尾部即可,时间复杂度为O(1);在哈希表中添加联系人需要先计算出索引值,然后将联系人信息插入到对应位置,时间复杂度也为O(1);在树形结构中添加联系人需要先查找对应的节点,然后将新联系人作为子节点插入到该节点下面,时间复杂度为O(logn)。

3. 删除算法删除算法是通讯录算法中比较常用的功能之一。

在链表中删除联系人只需要将该节点从链表中移除即可,时间复杂度为O(1);在哈希表中删除联系人需要先计算出索引值,然后将对应位置上的元素删除即可,时间复杂度为O(1);在树形结构中删除联系人需要先查找对应的节点,然后将该节点从树中移除即可,时间复杂度为O(logn)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构链表的应用通讯录管理实验要求:一、设计一个含有多个菜单项的程序,菜单项内容如下:1通讯录链表的建立2通讯录链表的插入3通讯录链表的查询4通讯录链表的删除5通讯录链表的输出0退出管理系统要求只能用0-5来选择菜单项,其他的输入无效二、分别实现多个菜单项的功能,要求每个功能在操作时都有确认提示三、编写一个程序实现整个通讯录管理系统,把主菜单的生成和各菜单项功能的实现作为子程序或者函数或者过程来实现。

四、要求关键语句必须要写注释。

#include"stdio.h"#include"string.h"#include"stdlib.h"typedefstructabc{//通讯录结点类型charnum[5];//编号charname[9];//姓名charsex[3];//性别charphone[13];//电话charaddr[31];//地址}DataType;typedefstructnode{//结点类型定义DataTypedata;//结点数据域structnode*next;//结点指针域}ListNode;typedefListNode*LinkList; LinkListhead;ListNode*p;//函数说明intmenu_select();LinkListCreateList(void); voidInsertNode(LinkListhead,ListNode*p); ListNode*ListFind(LinkListhead); voidDelNode(LinkListhead); voidPrintList(LinkListhead);//主函数voidmain(){for(;;){switch(menu_select()){case1:printf("**********************************\n"); printf("*通讯录链表的建立*\n");printf("**********************************\n"); head=CreateList();break;case2:printf("*通讯者信息的添加*\n");printf("**********************************\n");printf("编号(4)姓名(8)性别(3)电话(11)地址(31)\n");printf("*************************************\n");p=(ListNode*)malloc(sizeof(ListNode));//申请新结点scanf("%s%s%s%s%s",p->data.num,p->,p->data.sex, p->data.phone,p->data.addr);InsertNode(head,p);break;case3: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.addr);printf("---------------------------------------------------\n");}elseprintf("没有查到要查询的通讯者!\n");break;case4:printf("*通讯录信息的删除*\n");printf("***********************************\n"); DelNode(head);//删除结点break;case5:printf("************************************\n"); printf("*通讯录链表的输出*\n");printf("************************************\n"); PrintList(head);break;case0:printf("\t再见!\n");return;}}}intmenu_select(){intsn;printf("通讯录管理系统\n");printf("===================\n"); printf("1.通讯链表的建立\n");printf("2.通讯者结点的插入\n");printf("3.通讯者结点的查询\n");printf("4.通讯者结点的删除\n");printf("5.通讯录链表的输出\n");printf("0.退出管理系统\n");printf("==========================\n");printf("请选择0-5:");for(;;){scanf("%d",&sn);if(sn<0||sn>5)printf("\n\t输入错误,重选0-5:");elsebreak;}returnsn;}LinkListCreateList(void){//尾插法建立带头结点的通讯录链表算法LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申请头结点ListNode*p,*rear;intflag=0;//结束标志置0rear=head;//尾指针初始指向头结点while(flag==0){p=(ListNode*)malloc(sizeof(ListNode));//申新结点printf("编号(4)姓名(8)性别电话(11)地址(31)\n");printf("--------------------------------------------------------------------------------------\n");scanf("%s%s%s%s%s",p->data.num,p->,p->data.sex,p->data.phone, p->data.addr);rear->next=p;//新结点连接到尾结点之后rear=p;//尾指针指向新结点printf("结束建表吗?(1/0):");scanf("%d",&flag);}rear->next=NULL;//终端结点指针置空returnhead;//返回链表头指针}voidInsertNode(LinkListhead,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(LinkListhead){//有序通讯录链表上的查找ListNode*p;charnum[5];charname[9];intxz;printf("==================\n"); printf("1.按编号查询\n");printf("2.按姓名查询\n");printf("==================\n"); printf("请选择:");p=head->next;//假定通讯录表带头结点scanf("%d",&xz);if(xz==1){printf("请输入要查找者的编号:");scanf("%s",num);while(p&&strcmp(p->data.num,num)<0)p=p->next;if((p==NULL)||strcmp(p->data.num,num)>0) p=NULL;//没有查到要查找的通讯}elseif(xz==2){printf("请输入要查找者的姓名:");scanf("%s",name);while(p&&strcmp(p->,name)!=0) p=p->next;}returnp;}voidDelNode(LinkListhead){charjx;ListNode*p,*q;p=ListFind(head);//调用查找函数if(p==NULL){printf("没有查到要删除的通讯者!\n");return;}printf("真的要删除该结点吗?(y/n):");scanf("%c",&jx);if(jx=='y'||jx=='Y'){q=head;while((q!=NULL)&&(q->next!=p))q=q->next;q->next=p->next;//删除结点free(p);//释放被删结点空间printf("通讯者已被删除!\n");}}voidPrintList(LinkListhead){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.addr);printf("---------------------------------------------------------------------------------\n ");p=p->next;//后移一个结点}}。

相关文档
最新文档