数据结构-通讯录管理系统的设计与实现
数据结构 通讯录管理系统
数据结构通讯录管理系统数据结构通讯录管理系统1、引言1.1 目的和范围本文档旨在详细描述一个通讯录管理系统的设计和实现,以便帮助开发人员了解系统的功能和特性。
本系统可以用于存储和管理个人联系信息,实现添加、删除、修改和查询等功能。
1.2 定义、缩略语和缩写词- 通讯录:存储个人联系信息的系统。
- 系统:通讯录管理系统。
2、总体概述2.1 系统背景通讯录管理系统是为了方便用户管理个人联系信息而开发的软件。
它提供了一系列功能,包括添加联系人、删除联系人、修改联系人信息以及搜索联系人等。
该系统旨在提供一个高效、方便和可靠的通讯录管理解决方案。
2.2 产品功能- 添加联系人:用户可以添加新的联系人,并输入其姓名、方式号码、电子邮箱等信息。
- 删除联系人:用户可以删除已经存在的联系人。
- 修改联系人信息:用户可以修改已经存在的联系人的姓名、方式号码、电子邮箱等信息。
- 搜索联系人:用户可以根据姓名、方式号码等信息搜索联系人。
- 显示所有联系人:系统可以显示所有已经存在的联系人。
2.3 用户特点通讯录管理系统的主要用户群体为个人用户,他们需要管理自己的联系人信息。
这些用户对于系统的易用性、稳定性和功能性要求较高,因此系统需要提供简单直观的用户界面,并保证操作的正确性和数据的安全性。
3、系统需求3.1 功能需求3.1.1 添加联系人- 用户可以输入联系人的姓名、方式号码、电子邮箱等信息进行添加。
- 系统应该对输入进行合法性检查,确保输入的信息符合格式要求。
- 添加联系人后,系统应该将联系人信息保存到数据库中。
3.1.2 删除联系人- 用户可以删除已经存在的联系人。
- 删除联系人后,系统应该将联系人信息从数据库中删除。
3.1.3 修改联系人信息- 用户可以修改已经存在的联系人的姓名、方式号码、电子邮箱等信息。
- 系统应该对输入进行合法性检查,确保输入的信息符合格式要求。
- 修改联系人信息后,系统应该将修改后的联系人信息保存到数据库中。
数据结构课程设计通讯录管理系统
一、设计题目(问题)描述和要求某一中学,现在需要建立学生通讯录管理系统,以管理学生信息。
要求:(1)可以录入新的通讯信息(包括姓名,通讯地址,邮编,联系电话等)(2)可以按照姓名进行查询相关信息(3)可以修改相关信息二、系统分析与概要设计根据问题描述和要求,系统要求能够按姓名查找、增加、删除和保存各学生的信息。
确定程序应该具备如下功能:“查询学生信息”、“增加学生信息”、“修改学生信息”“删除学生信息”、“数据存盘”基本模块。
系统可以将学生信息数据保存到磁盘文件student.txt,从而可以通过磁盘文件读出学生数据信息,为了便于统计在生成学生信息时同时生成学生编号,这样每输入一个学生信息编号顺序加1,这样也方便了管理员查询学生信息。
三、详细设计和编码1.数据类型定义根据系统要求,可以将姓名和邮编和联系电话通讯地址定义为字符型。
2.各模块算法描述查询学生信息: Que_name()输入要查询的学生姓名,比较名字与保存的信息是否相同,若相同则查找到,否则,没查找到。
增加学生信息: Add()输入要添加的学生信息并保存。
删除学生信息: Del()输入要删除的学生姓名,若与数据相同则删除,否则输出查找不到该信息。
修改学生信息: Mod()输入要修改的学生姓名,输入要修改的信息,并确认。
数据存盘: Sav()创建文件,将信息写入文件。
3.程序关键算法流程图(1)主函数流程(2) 某操作算法流程Student:: Add()(3) Student:: Del()4) Student:: Mod()(5) Student:: Que_name()(6) Student:: Sav()(7) Student:: Load()四、调试分析(内容包括:调试过程中遇到的问题并且是如何解决的以及对设计实现的回顾讨论和分析;算法的时空分析和改进设想;经验和体会等)五、测试结果六、小结通过本次设计,加强了对于编写管理系统程序的运用,能够更好的运用循环。
数据结构通讯录管理系统课程设计实验报告心得
数据结构通讯录管理系统课程设计实验报告背景随着信息化的快速发展,通讯录管理系统成为了每个人生活中必备的工具之一。
传统的纸质通讯录已经无法满足人们对于信息管理的需求,因此开发一个高效、便捷、用户友好的通讯录管理系统显得尤为重要。
本次课程设计实验的目标是设计一个基于数据结构的通讯录管理系统,实现通讯录的创建、查找、修改、删除等功能。
通过本次实验,我们可以学习和掌握数据结构中的链表、哈希表等基础概念和算法,并将其应用到实际项目中。
分析通讯录管理系统主要有以下几个功能:1.创建通讯录:通讯录是一个存储联系人信息的数据结构,可以存储联系人的姓名、电话号码、邮箱地址等信息。
2.添加联系人:可以向通讯录中添加新的联系人,包括姓名、电话号码、邮箱地址等信息。
3.查找联系人:可以根据姓名或电话号码查找通讯录中的联系人,并显示其详细信息。
4.修改联系人:可以根据姓名或电话号码修改通讯录中的联系人信息。
5.删除联系人:可以根据姓名或电话号码删除通讯录中的联系人。
为了实现上述功能,我们可以使用链表来实现通讯录的存储,每个节点表示一个联系人。
每个节点包含姓名、电话号码、邮箱地址等信息,并且有指向下一个节点的指针。
为了提高查找联系人的效率,我们还可以使用哈希表来实现联系人的快速查找。
哈希表采用键值对的方式存储数据,通讯录中的联系人可以以姓名为键,联系人节点为值存储在哈希表中。
结果实验的最终结果是一个完善的通讯录管理系统,能够实现创建通讯录、添加联系人、查找联系人、修改联系人和删除联系人等功能。
在实现过程中,我们遵循了以下步骤:1.首先,我们设计了联系人节点的数据结构,包括姓名、电话号码、邮箱地址等字段,并定义了节点的操作方法。
2.接着,我们设计了通讯录的数据结构,使用链表来存储联系人节点,并实现了通用的链表操作方法,如插入节点、删除节点等。
3.然后,我们设计了哈希表的数据结构,使用哈希函数将联系人节点存储在哈希表中,并实现了查找联系人的快速算法。
大数据结构课设-通讯录系统的设计与实现——哈希表
课程设计(论文)任务书软件学院学院软件工程专业班一、课程设计(论文)题目:通讯录管理系统的设计与实现——哈希表二、课程设计(论文)工作自2016 年 1 月 4 日起至 2016 年 1 月 10 日止三、课程设计(论文) 地点: 软件测试中心(北区测试二室)四、课程设计(论文)容要求:1.本课程设计的目的⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合课程的理论知识,编写程序求解指定问题;⑵初步掌握软件开发过程的问题分析、系统设计、编码、测试等基本方法和技能;⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。
2.课程设计的任务及要求1)基本要求:⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;⑶程序设计语言推荐使用C/C++,程序书写规,源程序需加必要的注释;⑷每位同学需提交可独立运行的程序和规的课程设计报告。
2)课程设计论文编写要求⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;⑵课程设计报告包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、辞、参考文献、附录等;⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。
3)课程设计评分标准:⑴学习态度:10分;⑵系统设计:20分;⑶编程调试:20分;⑷回答问题:20分;⑸论文撰写:30分。
4)参考文献:⑴严蔚敏冬梅吴伟民著.数据结构(C语言版)[M]. 人民邮电. 2015.2⑵春葆. 数据结构教程上机实验指导[M]. 清华大学. 2013.1⑶何钦铭,燕等. 数据结构课程设计[M]. 大学. 2007.85)课程设计进度安排⑴准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料;⑵程序模块设计分析阶段(4学时):程序概要设计、详细设计;⑶代码编写调试阶段(8学时):程序模块代码编写、调试、测试;⑷撰写论文阶段(4学时):总结课程设计任务和设计容,撰写课程设计论文。
数据结构课程设计通讯录管理系统报告
数据结构课程设计通讯录管理系统报告前言通讯录管理系统是一种常见的应用程序,用于帮助用户有效地组织和管理他们的联系人信息。
本报告旨在介绍和分析一个基于数据结构设计的通讯录管理系统,其中实现了基本的通讯录功能,并且通过合适的数据结构和算法进行优化。
功能需求通讯录管理系统需要实现以下基本功能: - 添加联系人信息 - 查找联系人信息 - 删除联系人信息 - 更新联系人信息 - 显示所有联系人信息数据结构选择为了实现通讯录管理系统的功能,我们选择使用链表作为数据结构。
链表是一种简单而灵活的数据结构,可以动态地添加或删除节点,非常适合存储联系人信息这种动态的数据。
在这里,我们采用双向链表,使得查找、插入和删除操作更加高效。
算法设计添加联系人信息添加联系人信息时,我们需要遍历链表找到合适的位置插入新节点,这里的算法复杂度为O(n),其中n表示链表的长度。
查找联系人信息查找联系人信息时,我们需要遍历链表查找目标节点,这里的算法复杂度为O(n)。
删除联系人信息删除联系人信息时,我们同样需要遍历链表找到目标节点并删除,其算法复杂度为O(n)。
更新联系人信息更新联系人信息时,我们首先需要查找到目标节点,然后进行更新操作,其算法复杂度也为O(n)。
系统优化为了提高系统的性能,我们可以通过以下几种方式进行优化: - 使用哈希表索引联系人信息,减少查找联系人的时间复杂度; - 引入缓存机制,减少频繁的IO 操作。
总结通过本报告的介绍和分析,我们了解了一个基于数据结构设计的通讯录管理系统的实现原理和优化方法。
在实际应用中,针对具体需求和场景,我们可以进一步优化系统性能,提升用户体验。
通讯录管理系统作为一种简单而实用的应用程序,将在日常生活中发挥重要作用。
数据结构课程设计-通讯录查询系统的设计与实现
通讯录查询系统的设计与实现一、需求分析1、问题描述为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的电话与地址。
设计散列表存储,设计并实现通讯录查找系统。
2、基本要求a.每个记录有下列数据项:电话号码、用户名、地址;b.从键盘输入各记录,分别以电话号码为关键字建立散列表;c.采用二次探测再散列法解决冲突;d.查找并显示给定电话号码的记录;e.通讯录信息文件保存。
二、概要设计1.数据结构本程序需要用到两个结构体,分别为通讯录message以及哈希表HxList2.程序模块本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块。
系统子程序及功能设计本系统共有三个子程序,分别是:int Hx(long long key,int data)//哈希函数void BulidHx(HxList &L)//建立通讯录int Search(HxList &L)//查找3.各模块之间的调用关系以及算法设计主函数调用BulidHx以及Search函数。
函数BulidHx调用函数Hx。
三、详细设计1.数据类型定义typedef struct{char *name;char *add;long long phonenumber;}message;typedef struct{message *list;int number;//记录数}HxList;2.系统主要子程序详细设计a. 建立通讯录void BulidHx(HxList &L)//建立通讯录{FILE *f = fopen("E:\\tongxunlu.txt", "w");char buf[20]={0},str[20]={0};long long key;cout<<"输入要建立的记录数:";cin>>L.number;L.number+=1;L.list=new message[L.number];//分配哈希表的存储空间for(int i=0;i<L.number;i++){L.list[i].phonenumber=-1;}L.list[L.number-1].name=NULL;L.list[L.number-1].add=NULL;cout<<"输入记录信息(电话号码用户名地址)"<<endl; for(int i=0;i<L.number-1;i++){cin>>key>>buf>>str;int pose=Hx(key,L.number);//获取理论上的存储位置if(L.list[pose].phonenumber==-1){}else{//用二次探测再散列法解决冲突//1^2 -1^2 2^2 -2^2int di,count=1;xunhuan: if(count%2==0)di=-(count/2)*(count/2);elsedi=((count/2)+1)*((count/2)+1);int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}}L.list[pose].phonenumber=key;fprintf(f,"%lld",key);fprintf(f," ");L.list[pose].name=new char[strlen(buf)+1];strcpy(L.list[pose].name,buf);fprintf(f,"%s",buf);fprintf(f," ");L.list[pose].add=new char[strlen(str)+1];strcpy(L.list[pose].add,str);fprintf(f,"%s",str);fprintf(f,"\n");}}b.查找int Search(HxList &L)//查找{long long key;cout<<"输入要查找记录的关键字(电话号码):";cin>>key;int pose=Hx(key,L.number);//计算理论上的位置if(L.list[pose].phonenumber==key){}else{int count=1,di;//二次探测再散列,查找xunhuan: if(count%2==0){di=-(count/2)*(count/2);}else{di=((count/2)+1)*((count/2)+1);}int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl;return -1;//没有找到}goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl;return -1;//没有找到}goto xunhuan;}}}if(L.list[pose].phonenumber==key){cout<<"电话号码\t"<<"用户名\t"<<"地址"<<endl;cout<<L.list[pose].phonenumber<<"\t"<<L.list[pose].name<<"\t"<<L.list[pose].add< <endl;return pose;}}四、测试与分析1.显示主菜单,运行程序可以显示出如下界面。
数据结构课程设计通讯录管理系统
数据结构课程设计通讯录管理系统
数据结构课程设计中的通讯录管理系统可以涉及到以下几个方面的知识点:
1. 数据结构:通讯录管理系统中需要使用到的数据结构包括数组、链表、哈希表等。
其中,数组用于存储通讯录中的人员信息,链表用于存储联系人信息,哈希表用于实现快速查找功能。
2. 算法:通讯录管理系统中需要使用到的算法包括查找算法、排序算法、动态规划算法等。
其中,查找算法用于实现快速查找联系人功能,排序算法用于实现通讯录的排序功能,动态规划算法用于实现最长公共子序列问题等。
3. 数据库:通讯录管理系统需要使用到数据库来存储通讯录中的数据。
需要掌握关系型数据库的设计和操作,包括数据表的设计、SQL 语句的编写等。
4. 界面设计:通讯录管理系统需要有友好的用户界面,需要进行界面设计和开发,包括前端技术的使用,如HTML、CSS和JavaScript等。
5. 系统测试:通讯录管理系统需要进行系统测试,包括功能测试、性
能测试等,确保系统能够正常运行并满足用户需求。
通过设计和实现通讯录管理系统,可以锻炼学生对数据结构和算法的理解和应用能力,同时还能提高学生的编程能力和团队合作能力。
学生通讯录管理系统数据结构课程设计
学生通讯录管理系统数据结构课程设计一、需求分析在学生通讯录管理系统中,我们需要实现以下功能:1.学生信息的录入与管理2.通讯录信息的增删查改3.数据的持久化存储二、系统设计1. 数据结构设计为了实现学生通讯录管理系统的功能,我们需要设计以下数据结构:•学生信息结构体包括学号、姓名、性别、年龄等字段•通讯录信息结构体包括联系人姓名、电话号码、邮箱等字段2. 算法设计2.1 添加学生信息当用户选择添加学生信息时,系统会要求用户输入学号、姓名、性别、年龄等信息,然后将这些信息存储在学生信息的数据结构中。
void addStudentInfo() {// 读取用户输入的学生信息// 将学生信息存储在学生信息结构体中}2.2 修改通讯录信息用户可以根据联系人姓名查找通讯录信息,并进行修改操作,比如修改电话号码、邮箱等内容。
void modifyContactInfo() {// 根据联系人姓名查找通讯录信息// 用户进行修改操作}2.3 删除通讯录信息用户可以根据联系人姓名删除通讯录信息。
void deleteContactInfo() {// 根据联系人姓名删除通讯录信息}3. 数据存储设计为了持久化存储数据,我们可以选择使用文件存储或数据库存储。
在本系统中,我们选择文件存储的方式,数据以文本的形式存储在文件中。
三、系统实现通过以上设计,我们可以开始实现学生通讯录管理系统。
在实现过程中,我们需要注意保证数据结构的正确性和数据操作的合法性,从而确保系统的稳定性和可靠性。
四、总结通过本次数据结构课程设计,我们深入了解了学生通讯录管理系统的实现原理和功能设计。
在接下来的学习中,我们将继续努力提升自己的编程能力,不断完善系统的功能和性能,为实现更多复杂系统打下坚实的基础。
数据结构课程设计通讯录管理系统
数据结构课程设计通讯录管理系统一、系统需求分析通讯录管理系统的主要目标是提供一个方便、高效的方式来管理联系人信息。
具体需求包括: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;}```六、系统测试在完成系统的开发后,需要进行全面的测试以确保系统的稳定性和可靠性。
通讯录管理系统毕业设计(两篇)2024
引言概述:通讯录管理系统是一种用于管理联系人信息的软件,它能够为用户提供便捷的联系人管理和信息查询功能。
本文将继续介绍通讯录管理系统的设计和实现,重点关注系统的用户界面设计、数据存储与管理、通讯录的分类与搜索功能、用户权限管理以及通讯录系统的扩展与升级。
正文内容:1.用户界面设计1.1设计原则:用户友好性、易用性和美观性原则1.2主界面设计:主界面布局、功能模块展示、导航设计1.3交互设计:交互方式、操作流程、反馈机制1.4响应式设计:适配多种设备和屏幕分辨率2.数据存储与管理2.1数据库设计:确定实体和属性、建立表结构、定义关系2.2数据库连接:连接数据库、读写操作、异常处理2.3数据备份与恢复:数据备份策略、备份文件管理、数据恢复机制2.4数据安全性:权限控制、数据加密、数据完整性3.通讯录的分类与搜索功能3.1通讯录分类:基本分类和用户自定义分类3.2联系人添加与编辑:输入验证、字段定义、数据关联3.3联系人查询:关键字查询、条件过滤、多条件组合查询3.4联系人导入导出:支持多种数据格式、数据匹配与转换、导入导出策略3.5通讯录分享与同步:用户权限设置、跨设备同步、冲突解决4.用户权限管理4.1用户注册与登录:用户信息获取、身份验证、登录状态管理4.2用户权限分配:管理员与普通用户权限区分、权限控制细化4.3用户信息管理:个人信息修改、密码重置、账号注销4.4安全性保护:登录失败锁定、密码加密、会话管理5.通讯录系统的扩展与升级5.1模块化设计:可插拔式功能模块、模块间接口定义5.2扩展性设计:支持插件开发、动态加载与卸载5.3性能优化:数据索引优化、查询优化、缓存机制5.4系统升级:版本管理、更新提示、升级策略总结:通过上述的详细阐述,我们可以看到,通讯录管理系统涵盖了用户界面设计、数据存储与管理、通讯录的分类与搜索功能、用户权限管理以及通讯录系统的扩展与升级等多个关键领域。
在该系统的设计过程中,我们需要重点关注用户友好性、数据安全性和系统的可扩展性。
学生通讯录管理系统的设计与实现 数据结构课程设计
LECTURE 11.线性表的存储顺序存储链式存储2.“学生通讯录管理系统的设计与实现”问题描述:纸质的通讯录已经不能满足实际需求,容易丢失、查找困难等问题是纸质通讯录所不能克服的缺点。
“学生通讯录管理系统”是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和应用的一种应用程序。
需求分析:(1)输入数据建立通讯录;(2)查询通讯录中满足要求的信息;(3)插入新的通讯录信息;(4)删除不需要的通讯录信息;(5)查看所有的通讯录信息主界面设计要求:*******************************************************************************1 通讯录的建立2.插入通讯记录3.查询通讯记录4.删除通讯记录5.显示通讯记录0.退出系统*******************************************************************************设计要求:a.建立通讯录时,每个学生的信息包括:学号,姓名,电话;b.查找时,学号,姓名,电话均可以作为查询字段;c.查看所有的通讯录信息时,所有记录需是有序的(按学号排序,按姓名排序(字典序),按电话号码排序);d.存储结构:要求使用顺序存储结构;e.数据使用:使用本班级的具体信息。
源程序:(已经在VC下调试完毕)# include <stdio.h># include <malloc.h> //包含了malloc函数# include <stdlib.h> //包含了exit函数# include <string.h>struct Add{ //建立通讯录每个记录所包含的信息i nt id;c har name[10];l ong tele;};//定义了一个数据类型,该数据类型的名字叫做struct Arr, 该数据类型含有三个成员,分别是pBase, len, cntstruct Arr{s truct Add * pBase; //存储的是数组第一个元素的地址i nt len; //数组所能容纳的最大元素的个数i nt cnt; //当前数组有效元素的个数};void init_arr(struct Arr * pArr, int length); //分号不能省bool append_arr(struct Arr * pArr,int id, char * name,long tele); //追加void show_arr(struct Arr * pArr);bool delete_arr(struct Arr * pArr, int id);bool is_empty(struct Arr * pArr);bool is_full(struct Arr * pArr);bool find_arr_id(struct Arr * pArr,int identity); //三种方式查找bool find_arr_name(struct Arr * pArr,char *name);bool find_arr_tele(struct Arr * pArr,long tele);void sort_arr_id(struct Arr * pArr); //三种方式排序void sort_arr_name(struct Arr pArr);void sort_arr_tele(struct Arr * pArr);void showmenu_1();int main(void){i nt n;i nt i;i nt j;c har temp;c har name[10];l ong tele;i nt tel;i nt identity;c har temp_2 ;i nt id;s howmenu_1();i nt choice_1;s canf("%d",&choice_1);s truct Arr arr;w hile( choice_1 != 0 ){switch(choice_1){case 1 : init_arr(&arr, 100); // 动态分配100个结构体数组 break;case 2 : printf("请输入你需要插入的记录的个数 ");scanf("%d",&n);for(i = 0;i<n;i++){printf("请输入学号: \n");scanf("%d",&j);printf("请输入姓名: \n");temp = getchar();gets(name);printf("请输入电话号码: \n");scanf("%ld",&tele);append_arr(&arr, j, name, tele);}printf("恭喜!全部数据插入完成~");break;case 3 : printf("请输入您想查找的学号");scanf("%d",&identity);find_arr_id(&arr, identity);printf("\n");printf("请输入您想查找的姓名");temp_2 = getchar();char xingming[10];gets(xingming);find_arr_name(&arr, xingming);printf("\n");printf("请输入您想查找的电话号码");scanf("%d",&tel);find_arr_tele(&arr, tel);printf("\n");break;case 4 : printf("请输入你要删除同学的学号: ");scanf("%d",&id);delete_arr(&arr, id);break;case 5 : printf("按学号降序排列: ");sort_arr_id(&arr);printf("\n");printf("按姓名字典序排列\n");sort_arr_name(arr);printf("\n");printf("按电话号码降序排列\n");sort_arr_tele(&arr);printf("\n");}printf("\n");printf("下面是菜单,请问还需要做些什么?");scanf("%d",&choice_1);}printf("退出菜单成功!");return 0;}void init_arr(struct Arr * pArr, int length){p Arr->pBase = (struct Add *)malloc(sizeof(struct Add) * length);i f (NULL == pArr->pBase){printf("动态内存分配失败!\n");exit(-1); //终止整个程序}e lsepArr->len = length;pArr->cnt = 0;}p rintf("初始化通讯录成功!\n"); r eturn;}bool is_empty(struct Arr * pArr) {i f (0 == pArr->cnt)return true;e lsereturn false;}bool is_full(struct Arr * pArr) {i f (pArr->cnt == pArr->len)return true;e lsereturn false;}void show_arr(struct Arr * pArr){i f ( is_empty(pArr) ){printf("结构体数组为空!\n");}e lse{for (int i=0; i<pArr->cnt; ++i){printf("%d ", pArr->pBase[i].id); //int *printf("%s ", pArr->pBase[i].name);printf("%ld ", pArr->pBase[i].tele);}printf("\n");}}bool append_arr(struct Arr * pArr, int id, char * name,long tele) {//满是返回falsei f ( is_full(pArr) )return false;//不满时追加p Arr->pBase[pArr->cnt].id = id;s trcpy(pArr->pBase[pArr->cnt].name,name);p Arr->pBase[pArr->cnt].tele = tele;(pArr->cnt)++;r eturn true;}bool find_arr_id(struct Arr * pArr, int id){i nt i = 0;while( i <= pArr->cnt ){if(pArr->pBase[i].id == id){printf("%d ", pArr->pBase[i].id); //int *printf("%s ", pArr->pBase[i].name);printf("%ld ", pArr->pBase[i].tele);i++;}elsei++;}r eturn true;}bool find_arr_name(struct Arr * pArr,char *name) {i nt i =0;while( i <= pArr->cnt ){if(strcmp(name,pArr->pBase[i].name) == 0) {printf("%d ", pArr->pBase[i].id); //int *printf("%s ", pArr->pBase[i].name);printf("%ld ", pArr->pBase[i].tele);i++;}elsei++;}r eturn true;}bool find_arr_tele(struct Arr * pArr,long tele){i nt i =0;while( i <= pArr->cnt ){if( pArr->pBase[i].tele == tele ){printf("%d ", pArr->pBase[i].id); //int *printf("%s ", pArr->pBase[i].name);printf("%ld ", pArr->pBase[i].tele);i++;}elsei++;}r eturn true;}bool delete_arr(struct Arr * pArr, int id){i nt i = 0,j;w hile( i < pArr->cnt){if( id == pArr->pBase[i].id ){for (j=i; j < pArr->cnt; ++j){pArr->pBase[j] = pArr->pBase[j+1];}pArr->cnt--;printf("删除成功!\n");}elsei++;}r eturn true;}void sort_arr_id(struct Arr * pArr){i nt a[100];i nt i =0;i nt t;f or( i = 0; i < pArr->cnt; i++){a[i] = pArr->pBase[i].id;}f or( i = 1; i < pArr->cnt; i++){for( int j = 0; j < pArr->cnt - i; j++ ) {if( a[j] > a[j+1] ){t = a[j];a[j] = a[j+1];a[j+1] = t;}}}printf("\n");f or( i = 0; i < pArr->cnt; i++)printf("%d\n",a[i]);}void sort_arr_name(struct Arr pArr){int i,j;c har temp_name[10];f or(i = 1;i < t; i++){for(j = 0;j < t -i; j++){if( strcmp( pArr.pBase[j].name , pArr.pBase[j+1].name ) > 0){strcpy(temp_name , pArr.pBase[j].name);strcpy(pArr.pBase[j].name , pArr.pBase[j+1].name);strcpy(pArr.pBase[j+1].name , temp_name);}}}f or(i = 0;i < t; i++)printf("%s\t",pArr.pBase[i].name);}void sort_arr_tele(struct Arr * pArr){int a[100];i nt i =0;i nt t;f or( i = 0; i < pArr->cnt; i++){a[i] = pArr->pBase[i].tele;}f or( i = 1; i < pArr->cnt; i++){for( int j = 0; j < pArr->cnt - i; j++ ) {if( a[j] > a[j+1] ){t = a[j];a[j] = a[j+1];a[j+1] = t;}}}f or( i = 0; i < pArr->cnt; i++)printf("%d\n",a[i]);}void showmenu_1(){p rintf("**********************************\n"); p rintf("请选择你要执行的命令~: \n");p rintf("1:建立通讯录\n");p rintf("2:插入通讯录\n");p rintf("3:查询通讯录\n");p rintf("4:按照学号删除通讯录\n");p rintf("5:显示通讯录\n");p rintf("**********************************\n"); }。
数据结构课程设计学生通讯录管理系统
数据结构课程设计学⽣通讯录管理系统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.添加信息。
c语言程序设计通讯录管理系统
c语言程序设计通讯录管理系统通讯录管理系统是一种常见的应用程序,用于管理个人或者组织的联系人信息。
本文将介绍一个基于C语言的通讯录管理系统的设计和实现。
一、需求分析通讯录管理系统需要满足以下功能需求:1. 添加联系人:可以添加新的联系人,包括姓名、电话号码、邮箱等信息。
2. 查找联系人:可以根据姓名或者电话号码查找已存在的联系人。
3. 删除联系人:可以根据姓名或者电话号码删除已存在的联系人。
4. 修改联系人:可以修改已存在联系人的信息,包括姓名、电话号码、邮箱等。
5. 显示所有联系人:可以显示当前通讯录中的所有联系人信息。
二、设计思路1. 数据结构:使用结构体来表示一个联系人的信息,包括姓名、电话号码、邮箱等字段。
使用数组来存储多个联系人的信息。
2. 添加联系人:通过用户输入的方式获取联系人信息,然后将联系人信息添加到联系人数组中。
3. 查找联系人:通过用户输入的姓名或者电话号码,在联系人数组中查找匹配的联系人,并显示其详细信息。
4. 删除联系人:通过用户输入的姓名或者电话号码,在联系人数组中查找匹配的联系人,并将其从数组中删除。
5. 修改联系人:通过用户输入的姓名或者电话号码,在联系人数组中查找匹配的联系人,并允许用户修改其信息。
6. 显示所有联系人:遍历联系人数组,逐个显示联系人的详细信息。
三、代码实现下面是一个简单的通讯录管理系统的C语言代码实现:```c#include <stdio.h>#include <string.h>#define MAX_CONTACTS 100typedef struct {char name[50];char phone[20];char email[50];} Contact;Contact contacts[MAX_CONTACTS];int numContacts = 0;void addContact() {printf("Enter name: ");scanf("%s", contacts[numContacts].name);printf("Enter phone number: ");scanf("%s", contacts[numContacts].phone);printf("Enter email: ");scanf("%s", contacts[numContacts].email);numContacts++;printf("Contact added successfully!\n");}void findContact() {char search[50];printf("Enter name or phone number to search: ");scanf("%s", search);int found = 0;for (int i = 0; i < numContacts; i++) {if (strcmp(contacts[i].name, search) == 0 || strcmp(contacts[i].phone, search) == 0) {printf("Name: %s\n", contacts[i].name);printf("Phone: %s\n", contacts[i].phone);printf("Email: %s\n", contacts[i].email);found = 1;break;}}if (!found) {printf("Contact not found!\n");}}void deleteContact() {char search[50];printf("Enter name or phone number to delete: ");scanf("%s", search);int found = 0;for (int i = 0; i < numContacts; i++) {if (strcmp(contacts[i].name, search) == 0 || strcmp(contacts[i].phone, search) == 0) {for (int j = i; j < numContacts - 1; j++) {strcpy(contacts[j].name, contacts[j + 1].name);strcpy(contacts[j].phone, contacts[j + 1].phone);strcpy(contacts[j].email, contacts[j + 1].email);}numContacts--;printf("Contact deleted successfully!\n");found = 1;break;}}if (!found) {printf("Contact not found!\n");}}void modifyContact() {char search[50];printf("Enter name or phone number to modify: ");scanf("%s", search);int found = 0;for (int i = 0; i < numContacts; i++) {if (strcmp(contacts[i].name, search) == 0 || strcmp(contacts[i].phone, search) == 0) {printf("Enter new name: ");scanf("%s", contacts[i].name);printf("Enter new phone number: ");scanf("%s", contacts[i].phone);printf("Enter new email: ");scanf("%s", contacts[i].email);printf("Contact modified successfully!\n");found = 1;break;}}if (!found) {printf("Contact not found!\n");}}void displayContacts() {printf("Contacts:\n");for (int i = 0; i < numContacts; i++) {printf("Name: %s\n", contacts[i].name); printf("Phone: %s\n", contacts[i].phone); printf("Email: %s\n", contacts[i].email); printf("\n");}}int main() {int choice;do {printf("1. Add contact\n");printf("2. Find contact\n");printf("3. Delete contact\n");printf("4. Modify contact\n");printf("5. Display all contacts\n"); printf("0. Exit\n");printf("Enter your choice: ");scanf("%d", &choice);switch (choice) {case 1:addContact();break;case 2:findContact();break;case 3:deleteContact();break;case 4:modifyContact();break;case 5:displayContacts();break;case 0:printf("Exiting...\n");break;default:printf("Invalid choice!\n");break;}} while (choice != 0);return 0;}```四、总结本文介绍了一个基于C语言的通讯录管理系统的设计和实现。
数据结构-通讯录管理系统的设计与实现汇总
数据结构-通讯录管理系统的设计与实现汇总简介本篇文档介绍了如何使用数据结构实现一个简单的通讯录管理系统。
包括系统的需求分析、数据结构选择、程序设计与实现等方面。
需求分析通讯录管理系统的核心功能是记录联系人信息,包括姓名、电话号码、电子邮件地址等。
该系统需要支持以下操作:1.添加联系人2.删除联系人3.查找联系人4.修改联系人信息5.显示所有联系人除了核心功能以外,通讯录管理系统还需要具有以下扩展功能:1.根据姓名或电话号码排序2.将联系人信息导入/导出文件3.显示某个分组的联系人数据结构选择为了支持以上功能,我们需要选择合适的数据结构来存储联系人信息。
常见的数据结构有数组、链表、栈、队列、哈希表等。
对于通讯录管理系统,我们可以使用链表来存储联系人信息。
每个节点包含一个指向下一节点的指针和联系人信息。
这种方式可以方便地插入、删除联系人信息,同时节省存储空间。
排序可以使用快速排序(QSort)、归并排序等算法实现。
导入/导出文件可以使用文件读写操作实现。
分组显示则可以使用多个链表来分别存储不同分组的联系人信息。
程序设计与实现以下是通讯录管理系统的程序设计与实现的主要流程:1.定义联系人结构体,包含姓名、手机号、邮箱等字段。
2.定义联系人节点结构体,包含指向下一节点的指针和联系人信息结构体。
3.实现通讯录管理系统功能函数,包括添加联系人、删除联系人、查找联系人、修改联系人信息、显示所有联系人等。
4.实现排序算法,如快速排序和归并排序。
5.实现文件读写操作,包括将联系人信息导入/导出文件。
6.实现分组显示功能,使用不同链表存储不同分组的联系人信息。
以上是通讯录管理系统的设计与实现汇总。
在数据结构的选择上,我们选择了链表作为存储通讯录联系人信息的数据结构,使用排序算法进行排序,使用文件读写操作进行导入/导出操作,使用多个链表实现分组显示功能。
在功能实现上,分别实现了添加联系人、删除联系人、查找联系人、修改联系人信息、显示所有联系人等核心功能以及排序、导入/导出、分组显示等扩展功能。
通讯录——数据结构课程设计
通讯录——数据结构课程设计通讯录是一个用于存储和管理联系人信息的工具。
在数据结构课程设计中,我们需要设计一个通讯录系统,使用户能够方便地添加、查找、修改和删除联系人信息。
下面是通讯录系统的标准格式文本,详细介绍了系统的功能和实现方法。
一、系统概述通讯录系统是一个基于数据结构的软件应用程序,用于存储和管理联系人信息。
它提供了一系列功能,包括添加联系人、查找联系人、修改联系人和删除联系人。
二、系统功能1. 添加联系人用户可以通过系统界面输入联系人的姓名、电话号码、电子邮件地址等信息,系统将这些信息存储在数据结构中。
每一个联系人的信息应包括惟一的标识符,以便于后续的查找、修改和删除操作。
2. 查找联系人用户可以通过姓名、电话号码或者电子邮件地址等关键字进行联系人的查找。
系统将根据用户提供的关键字,在数据结构中进行搜索,并返回与之匹配的联系人信息。
3. 修改联系人用户可以选择要修改的联系人,并提供新的姓名、电话号码、电子邮件地址等信息。
系统将根据用户提供的联系人标识符,在数据结构中找到对应的联系人,并更新其信息。
4. 删除联系人用户可以选择要删除的联系人,并确认删除操作。
系统将根据用户提供的联系人标识符,在数据结构中找到对应的联系人,并将其从通讯录中删除。
三、系统实现1. 数据结构选择为了高效地存储和管理联系人信息,我们选择使用链表作为数据结构。
每一个节点表示一个联系人,包含姓名、电话号码、电子邮件地址等信息,以及指向下一个节点的指针。
2. 添加联系人用户输入联系人信息后,系统将创建一个新的节点,并将其插入到链表的末尾。
为了保证联系人信息的惟一性,系统将检查新节点的标识符是否与已有节点的标识符重复。
如果重复,则提示用户重新输入。
3. 查找联系人用户输入关键字后,系统将从链表的头节点开始遍历,逐个比较节点中的姓名、电话号码和电子邮件地址与关键字是否匹配。
如果找到匹配的联系人,系统将返回其信息。
如果遍历完整个链表仍未找到匹配的联系人,则提示用户未找到。
数据结构通讯录管理系统课程设计实验报告心得
数据结构通讯录管理系统课程设计实验报告心得数据结构通讯录管理系统课程设计实验报告心得一、引言在本次数据结构课程设计实验中,我们小组选择了通讯录管理系统作为项目。
通讯录管理系统是一种常见的应用程序,用于方便地存储和管理联系人信息。
本报告将对我们小组在实验过程中的设计思路、实现方法和心得体会进行详细介绍。
二、需求分析通讯录管理系统的基本功能包括添加联系人、删除联系人、修改联系人信息和查询联系人等。
除此之外,我们还希望能够支持批量导入和导出联系人信息,以及按照姓名、电话号码等字段进行排序和筛选。
三、设计思路1. 数据结构选择为了高效地存储和操作联系人信息,我们选择使用链表作为主要的数据结构。
链表可以动态地分配内存空间,并且插入和删除操作的时间复杂度较低。
2. 模块划分根据需求分析,我们将通讯录管理系统划分为以下几个模块:- 主菜单模块:显示系统功能选项,并根据用户输入调用相应模块。
- 添加联系人模块:向通讯录中添加新的联系人信息。
- 删除联系人模块:根据用户输入的姓名或电话号码删除对应的联系人信息。
- 修改联系人模块:根据用户输入的姓名或电话号码修改对应的联系人信息。
- 查询联系人模块:根据用户输入的姓名或电话号码查询对应的联系人信息,并显示在屏幕上。
- 导入导出模块:支持将通讯录中的联系人信息导出到文件,以及从文件中导入联系人信息。
四、实现方法1. 数据结构设计我们使用了一个结构体来表示每个联系人的信息,包括姓名、电话号码和电子邮件地址等字段。
同时,我们为每个节点添加了指向下一个节点的指针。
2. 功能实现- 添加联系人:通过用户输入,创建一个新节点,并将其插入到链表中合适的位置。
- 删除联系人:根据用户输入的姓名或电话号码,在链表中找到对应节点并删除。
- 修改联系人:根据用户输入的姓名或电话号码,在链表中找到对应节点并修改其字段值。
- 查询联系人:根据用户输入的姓名或电话号码,在链表中找到对应节点并显示其字段值。
数据结构课程设计_通讯录查询系统的设计与实现
Word格式通讯录查询系统的设计与实现完美整理一、需求分析1、问题描述为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的电话与地址。
设计散列表存储,设计并实现通讯录查找系统。
2、基本要求a.每个记录有下列数据项:电话号码、用户名、地址;b.从键盘输入各记录,分别以电话号码为关键字建立散列表;c.采用二次探测再散列法解决冲突;d.查找并显示给定电话号码的记录;e.通讯录信息文件保存。
二、概要设计1.数据结构本程序需要用到两个结构体,分别为通讯录 message以及哈希表HxList2.程序模块本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块。
系统子程序及功能设计本系统共有三个子程序,分别是:int Hx(long long key,int data)//哈希函数void BulidHx(HxList &L)//建立通讯录int Search(HxList &L)//查找3.各模块之间的调用关系以及算法设计主函数调用BulidHx以及Search函数。
函数BulidHx调用函数Hx。
三、详细设计1.数据类型定义typedef struct{char *name;char *add;long long phonenumber;}message;typedef struct{message *list;int number;//记录数}HxList;2.系统主要子程序详细设计a. 建立通讯录void BulidHx(HxList &L)//建立通讯录{FILE *f = fopen("E:\\tongxunlu.txt", "w");char buf[20]={0},str[20]={0};long long key;cout<<"输入要建立的记录数:";cin>>L.number;L.number+=1;L.list=new message[L.number];//分配哈希表的存储空间for(int i=0;i<L.number;i++){L.list[i].phonenumber=-1;}L.list[L.number-1].name=NULL;L.list[L.number-1].add=NULL;cout<<"输入记录信息(电话号码用户名地址)"<<endl; for(int i=0;i<L.number-1;i++){cin>>key>>buf>>str;int pose=Hx(key,L.number);//获取理论上的存储位置if(L.list[pose].phonenumber==-1){}else{//用二次探测再散列法解决冲突//1^2 -1^2 2^2 -2^2int di,count=1;xunhuan: if(count%2==0)di=-(count/2)*(count/2);elsedi=((count/2)+1)*((count/2)+1);int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==-1){pose=site;}else{count++;goto xunhuan;}}}L.list[pose].phonenumber=key;fprintf(f,"%lld",key);fprintf(f," ");L.list[pose].name=new char[strlen(buf)+1];strcpy(L.list[pose].name,buf);fprintf(f,"%s",buf);fprintf(f," ");L.list[pose].add=new char[strlen(str)+1];strcpy(L.list[pose].add,str);fprintf(f,"%s",str);fprintf(f,"\n");}}b.查找int Search(HxList &L)//查找{long long key;cout<<"输入要查找记录的关键字(电话号码):";cin>>key;int pose=Hx(key,L.number);//计算理论上的位置if(L.list[pose].phonenumber==key){}else{int count=1,di;//二次探测再散列,查找xunhuan: if(count%2==0){di=-(count/2)*(count/2);}else{di=((count/2)+1)*((count/2)+1);}int site=Hx(key+di,L.number);if(site>=0){if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl;return -1;//没有找到}goto xunhuan;}}else{site=L.number-abs(site);if(L.list[site].phonenumber==key){pose=site;}else{count++;if(L.list[site].phonenumber==-1){cout<<"没有找到"<<endl;return -1;//没有找到}goto xunhuan;}}}if(L.list[pose].phonenumber==key){cout<<"电话号码\t"<<"用户名\t"<<"地址"<<endl;cout<<L.list[pose].phonenumber<<"\t"<<L.list[pose].name<<"\t"<<L.list [pose].add<<endl;return pose;}}四、测试与分析1.显示主菜单,运行程序可以显示出如下界面。
数据结构通讯录管理系统的设计与实现
数据结构通讯录管理系统的设计与实现IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】课程设计报告课程设计名称:数据结构课程设计系:三系学生姓名:班级:学号:成绩:指导教师:开课时间:2011-2012学年一学期宿迁学院课程设计任务书课程名称:数据结构指导教师:专业班级:学生姓名:起止日期:设计题目一:通讯录管理系统的设计与实现1 概述现状分析课程设计是实践教学中的重要环节,它以某一门课程为基础,涉及和课程相关的各方面知识,是一门独立于课程外的特殊课程。
课程设计就是让所有同学对课程更全面的应用。
本次实验项目“通讯录管理”就是针对数据结构的一门应用较为广泛的系统管理方法。
实现意义本次实验应用性能很好,结构清楚,能随时添加、删除、查找、修改、输出联系人;并且可以用姓名、编号两种方式;而且其中增加了排序功能,使得插入之后排序为接下来的操作提供便利,操作更精确,以人性化的方式展现出来,效果十分突出。
2 系统分析编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。
每个记录包含编号、姓名、性别、电话号码、住址个人基本信息。
用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。
本程序相对简单,使用方便,几乎不用特殊的命令,只需按提示输入即可。
对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,尤其在算法方面,链表及结点的联系,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
3 概要设计算法的设计本实验从整体上分为七大模块:(1)通讯录链表的建立;(2)通讯者结点的插入;(3)通讯者结点的查询;(4)通讯者结点的删除;(5)通讯者结点的修改;(6)通讯录链表的输出;(7)退出通讯录管理通讯者结点的删除系统。
通讯录系统图系统功能模块图如图所示:2.得到k的合理值系统功能模块图设计一个函数用来输出提示信息和处理信息输入,这个函数应该返回一个数值k,以便供给switch语句使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告课程设计名称:数据结构课程设计系:三系学生姓名:班级:学号:成绩:指导教师:开课时间:课程设计任务书课程名称:数据结构指导教师:专业班级:学生姓名:起止日期: 2012.12-2013.1设计题目一:通讯录管理系统的设计与实现1 概述1.1现状分析课程设计是实践教学中的重要环节,它以某一门课程为基础,涉及和课程相关的各方面知识,是一门独立于课程外的特殊课程。
课程设计就是让所有同学对课程更全面的应用。
本次实验项目“通讯录管理”就是针对数据结构的一门应用较为广泛的系统管理方法。
1.2 实现意义本次实验应用性能很好,结构清楚,能随时添加、删除、查找、修改、输出联系人;并且可以用姓名、编号两种方式;而且其中增加了排序功能,使得插入之后排序为接下来的操作提供便利,操作更精确,以人性化的方式展现出来,效果十分突出。
2 系统分析编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。
每个记录包含编号、姓名、性别、电话号码、住址个人基本信息。
用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。
本程序相对简单,使用方便,几乎不用特殊的命令,只需按提示输入即可。
对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,尤其在算法方面,链表及结点的联系,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
3 概要设计3.1算法的设计本实验从整体上分为七大模块:(1)通讯录链表的建立;(2)通讯者结点的插入;(3)通讯者结点的查询;(4)通讯者结点的删除;(5)通讯者结点的修改;(6)通讯录链表的输出;(7)退出通讯录管理通讯者结点的删除系统。
3.2 通讯录系统图系统功能模块图如图所示:系统功能模块图4 详细设计4.1 主菜单模块设计编写一个主控菜单驱动程序,输入0—6以进入相应选择项。
1. 实现循环和功能选择假设输入选择用变量k,它作为0-6之间的一个输入变量,由getchar读入,提供给switch语句。
使用while语句循环实现重复选择,并在主函数void main( )中实现。
2.得到k的合理值设计一个函数用来输出提示信息和处理信息输入,这个函数应该返回一个数值k,以便供给switch语句使用。
对于k输入值,在switch中case语句对应数字0—6,在swith 语句中再调用相应的函数,使得程序得以执行,对于不符合要求的输入,提示输入错误并要求重新输入。
4.2 通讯录建立模块设计1.系统用到的数据有:char number[5]; //编号char name[20]; //姓名char sex[10]; //性别char telephone[20]; //电话char address[20]; //地址函数:LinkList CreateList(void); //实现通讯录链表的建立功能void InsertNode(LinkList head,ListNode *p); //实现通讯录结点的插入void PaixuNode(linklist *&l); //信息按编号排序ListNode *ListFind(LinkList head); //实现通讯录结点的查找void DeleteNode(LinkList head); //实现通讯录结点的删除void ModifyNode(LinkList head); //实现通讯录结点的修改void PrintList(LinkList head); //实现通讯录结点的输出*/2.我们知道的建立链表有两种方法,一种为头插入法,一种为尾插入法。
头插入法是每次将新插入的结点插在链表的表头,而尾插入法是将新插入的结点插入在链表的尾部。
我们这里用尾插入法描述算法。
(1) 使链表的头尾指针head、rear指向新生成的头结点(也是尾结点);(2) 置结束标志为0(假);(3)while(结束标志不为真){P指向新生结点;读入一个通讯者数据至新结点的数据域;将新结点链接到尾结点之后;使为指针指向新结点;提示:是否结束建表,读入一个结束标志;}(4) 尾结点指针域置空值NULL。
具体算法如下:/-------------------------------------------------------//* 用尾插入法建立通讯录链表函数*//------------------------------------------------------/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("编号(1) 姓名(2) 性别电话(4) 地址(5)\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; //返回链表头指针}4.3 通讯录插入模块设计插入结点的基本思想是:使用两个指针变量p1和p2分别指向当前访问过的结点和下一个待访问的结点,循环顺序查找链表,寻找插入结点的位置,其中p1指向待插入结点的前一个结点。
(1)用p1指向原链表头结点,p2指向链表的第一个结点;(2)while(p2=NULL && p2->data.num<p->data.num){p1=p2; //p1指向刚访问过的结点;p2=p2->next; //p2指向表的下一个结点(3)插入新结点。
具体算法如下:/-------------------------------------------------------//*在通讯录链表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; //连接表中剩余部分}4.4 通讯录查询模块设计查询的基本思想是:首先输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。
如查找成功,则返回一个指向查找到的通讯者信息的结点;若查找失败,则返回一个空的指针值NULL。
当按编号好查找时,如需要查找的通讯者编号不在表中,则不一定需要循环才比较到表尾,因为表是按编号递增有序的;而当按姓名查找时,这要循环比较到表尾,才能确定查不到的情况。
具体算法如下:/-------------------------------------------------------//* 有序通讯录链表上的查找*//-------------------------------------------------------/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(" 请选择1/2:");p=head->next; //假定通讯录表带有结点scanf("%d",&t);if(t==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(t==2) {printf("请输入要查找者的姓名: ");scanf("%s",name);while(p && strcmp(p->,name)!=0)p=p->next;}return p;}4.5 通讯录删除模块设计删除的基本思想是:先调用查找函数,查询到要删除的结点,删除结点即可。
算法如下:/*****************************//* 通讯录链表上的结点的删除*//*****************************/void DelNode(LinkList head){char s;ListNode *p,*q;p=ListFind(head);//调用查找函数if(p==NULL){printf("没有查到要删除的通讯者!\n");return;}printf("%s%s%s%s%s\n",p->data.number ,p->,p->data.sex,p->data.telephone, p->data.address);printf("真的要删除该结点吗?(y/n) : ");scanf("%s",&s);if(s=='y'){ q=head;while(p!=NULL && q->next!=p)q=q->next;q->next=p->next;//删除结点free(p); //释放被删除的结点空间printf("通讯者已被删除!\n");return; }printf("通讯者没有被删除!\n");}4.6通讯录修改模块设计修改的基本思想是:先调用查找函数,查询到要修改的结点,修改从新输入结点即可。