数据结构实验一_通讯录

合集下载

数据结构课程设计报告---通讯录

数据结构课程设计报告---通讯录

数据结构课程设计报告---通讯录## 一、项目背景随着信息科技的发展,现代社会通讯录的应用越来越普遍,满足了人们信息的获取和管理的需求。

本项目的设计目的在于使用面向对象的程序思想,以面向对象的方式它来实现对通讯录信息的管理,进而提高信息的管理效率,提升信息的可靠性和安全性,最终达到为社会实施科学管理的目的。

## 二、系统需求1. 界面美观、格式明确,有良好的友好提示。

2. 系统稳定性强,能承受短时间的高并发量使用。

3. 提供友好的系统操作界面,对用户操作进行一定的约束,方便用户操作。

4.提供有效的联系人信息管理功能,能够实现增删改查等操作。

5.支持联系人信息备份和恢复,以及密码设置。

6.能够防止任何人未经授权而访问系统,或者磁盘信息的泄露。

此系统的设计主要分为三大部分,即界面层、业务逻辑层和数据存储层。

界面层通过展示信息给用户,实现数据的输入及输出;业务逻辑层主要处理用户请求,实现对数据的操作;数据存储层通过文件存储数据,实现对联系人信息的永久保存。

本项目采用C++语言,以链表数据结构为基础,将用户的联系人存储在链表中,充分利用其动态性,实现联系人的增删改查操作.同时,为了提供更进一步的使用,增加了密码功能,对未授权访问进行防止,以及数据备份和恢复功能。

## 四、功能实现1. 界面设计:首先,根据系统所需要的功能,采用控制台方式,以文字提示形式,配以整齐美观的各项参数和信息,实现各项功能。

2. 加密控制:本系统实现授权登陆加密功能,使系统对未经授权的用户隐藏信息,以确保系统的安全性。

3. 测试功能:功能的测试旨在确保程序的完整性和正确性。

4. 管理功能:本系统实现联系人信息的增删改查操作,在这几项功能的实现过程中,使用链表数据结构,更好的实现程序的功能。

5. 修改密码功能:此功能实现用户可以修改自己的密码,以确保用户自己可以比较安全的使用系统,不会受到他人的侵犯。

6. 加载和存储数据:通过使用文件存储,实现数据的存储和读取,以及备份功能,实现对数据永久保存。

数据结构课程设计(通讯录)

数据结构课程设计(通讯录)

数据结构课程设计(通讯录)
题目描述:
设计一个通讯录程序,实现以下功能:
1. 添加联系人信息
2. 删除联系人信息
3. 修改联系人信息
4. 查找联系人信息
5. 显示所有联系人信息
6. 退出程序
要求:
1. 使用链表作为数据结构存储联系人信息
2. 界面友好,操作简单方便
3. 能够防止重复添加联系人信息
设计思路:
1. 定义一个结构体Contact表示联系人信息,包括姓名、电话、邮箱等成员变量。

2. 定义一个链表结构体List表示联系人链表,包括头结点、
节点数量等成员变量。

3. 实现添加联系人信息函数,首先判断联系人是否存在,如果存在则提示用户,否则分配一个新的节点,并将联系人信息存储在节点中,将新节点插入链表中。

4. 实现删除联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则在链表中删除该节点。

5. 实现修改联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则修改节点中的信息。

6. 实现查找联系人信息函数,遍历链表查找是否有匹配姓名的联系人。

7. 实现显示所有联系人信息函数,遍历链表打印出所有联系人信息。

8. 在main函数中调用上述函数,根据用户输入的指令调用对应的函数,直到用户选择退出程序。

数据结构课程设计(通讯录制作)-参考模板

数据结构课程设计(通讯录制作)-参考模板

一.设计内容(通讯录)本系统应完成一下几方面的功能:1) 输入信息——enter();2) 显示信息———display( );3) 查找以姓名作为关键字———search( );4) 删除信息———delete( );5) 存盘———save ( );6) 装入———load( ) ;设计要求:1) 每条信息至包含:姓名(NAME )街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项2) 作为一个完整的系统,应具有友好的界面和较强的容错能力二.设计思路通过visual c++6.0(用的是C语言)编写一个dos界面的控制台程序,该程序通过链表的操作,文件存储来实现通讯录的基本功能struct address{ /*定义结构*/char name[10]; /*姓名*/char street[50]; /*街道*/char city[10]; /*城市*/char state[15]; /*国家*/char eip[7]; /*邮编*/struct address *next; /*后继指针*/struct address *prior; /*前驱指针*/}链表的插入,删除来实现通讯录里的内容的插入删除当操作完成通过文件件来存储链表的信息,下次打开程序时,读取文件里的内容到内存中,放在链表,然后又可以对链表进行操作;在这里面,文件内容不可以在外部更改,只能通过读取到内存链表中,通过程序进行更改,然后再写入到文件,写入过程会覆盖上次的内容。

struct address *start; /*首结点*/struct address *last; /*尾结点*/struct address *find(char *); /*声明查找函数*/void enter(); /*函数声明*/void search(); /*查找,查找过程中调用find函数*/void save(); /*存盘,将链表信息保存到文件中*/void load(); /*导入,将文件内容导入到内存链表中*/void list(); /*显示当前链表中信息*/void ddelete(struct address **,struct address **);void insert(struct address *i,struct address **start,struct address **last);void inputs(char *,char *,int);void display(struct address *);int menu_select(void);三.详细设计1.主界面设计通过switch语句调用各种函数,实现各种操作。

数据结构实验报告2--通讯录

数据结构实验报告2--通讯录

一、实验目的1、能够利用单链表的基本运算进行单链表的相关操作。

2、加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。

3、熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的建立、查找、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。

二、实验环境具有Windows XP或2003的计算机、V istual C++ 6.0、网络环境。

三、实验内容设计一个班级同学的通讯录,要求如下:✓通讯录中每个同学的信息包含以下内容:学号(id)、姓名(name)、电话号码(tel)。

如果需要更多其他信息,请自行添加。

✓程序主菜单包含以下几个功能:(1)添加记录:通过键盘输入信息,添加一条通讯录记录。

(2)删除记录:通过键盘输入学号,删除该学号的记录。

(3)输出记录:输出通讯录全部记录。

(4)按姓名查找:通过键盘输入姓名,输出该同学的所有信息。

(5)按电话号排序:按电话号码从小到大排序并输出排序后的信息。

(6)清空记录:删除通讯录中的全部记录,并删除文件。

(7)退出。

程序清单#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 20typedef struct student{char tel[N];char name[N];char id[N];struct student *next;}linklist;//创建信息void createlist(linklist *&l){int ch;linklist *s,*p;printf("***********创建通讯录***********\n");printf("----请输入通讯者信息-----:\n请输入非零整数,输入0则退出:\n");scanf("%d",&ch);l=(linklist *)malloc(sizeof(linklist));s=l;while(ch!=0){p=(linklist *)malloc(sizeof(linklist));printf("请输入通讯者姓名:");scanf("%s",p->name);printf("请输入通讯者电话号:");scanf("%s",p->tel);printf("请输入通讯者身份证号:");scanf("%s",p->id);s->next=p;s=p;printf("请输入通讯者信息:\n请输入非零整数,输入0则退出:\n");scanf("%d",&ch);}s->next=NULL;}//删除信息void listdelete(linklist *&l,int t ){int j=0;linklist *p,*q;p=l;while(p!=NULL&&j<t-1){j++;p=p->next;}if(p==NULL)exit(0);else{q=p->next;if(q==NULL)exit(0);p->next=q->next;printf("***************删除系统**************\n");printf("-------你将删除的联系人的信息为-------:\n");printf("通讯者姓名:%s\n",q->name);printf("通讯者电话号:%s\n",q->tel);printf("通讯者身份证号:%s\n",q->id);printf("******-------******删除成功******------*******\n");free(q);}}//输出信息void output(linklist *l){linklist *p;p=l->next;printf("----***----输出所有联系者信息----***----:\n");while(p!=NULL){printf("通讯者姓名:%s\n",p->name);printf("通讯者电话号:%s\n",p->tel);printf("通讯者身份证号:%s\n",p->id);printf("*****************************\n");p=p->next;}}//按姓名查找void findname(linklist *l){char n[N];linklist *p=l->next;printf("***************查找系统*************\n");printf("----------请输入要查找的姓名---------:\n");scanf("%s",n);while(p!=NULL){if(strcmp(p->name,n)){printf("-----***--你要查找的资料为--***----:\n");printf("通讯者姓名:%s\n",p->name);printf("通讯者电话号:%s\n",p->tel);printf("通讯者身份证号:%s\n",p->id);printf("*****************************");break;}elsep=p->next;}}//按电话号排序void sorttel(linklist *&l){linklist *p,*q,*s;q=l;p=q->next->next;q->next->next=NULL;while(p){while(q->next&&(strcmp(p->tel,q->next->tel)>0))q=q->next;s=p->next;p->next=q->next;q->next=p;p=s;q=l;}}//清空void release(linklist *&l){linklist *p,*q;p=l;q=p->next;while(q!=NULL){free(p);p=q;q=p->next;}free(p);printf("--------数据已全部被清空----------\n,*****内存回收*****\n"); }//主函数void main(){int i,t;linklist *l;while(1){printf("通讯录功能如下:\n1.建立通讯录信息\n2.删除信息\n3.输出信息\n4.按姓名查找信息\n5.按电话号排序信息\n6.清空信息\n7.退出");scanf("%d",&i);if(i<=0||i>7)break;switch(i){case 1:createlist(l);break;case 2:printf("---------请输入第t个要删除的信息---------:\n");scanf("%d",&t);listdelete(l,t);break;case 3:output(l);break;case 4:findname(l);break;case 5:sorttel(l);printf("-----***---&&&--这是按电话号排序后的信息列表--&&&---***-----\n");output(l);break;case 6:release(l);break;case 7:break;}}}运行结果:建立通讯录信息运行结果截图:输入零后通讯录信息输出结果截面图:查询通讯录信息运行结果截图:通讯录信息排序运行结果截图:删除通讯录信息运行结果截图:删除通讯录信息后的输出结果截面图:清空通讯录信息的运行结果截面图:四、实验心得与小结通过这次的上机实验,使我学到了一些回顾了以前学过的知识,使我对数据结构程序设计有了更深层次的认识和理解,懂得了灵活运用。

数据结构课程设计报告---通讯录

数据结构课程设计报告---通讯录

数据结构课程设计报告专业:计算机科学与技术年级:课题名称:通讯录小组成员1:小组成员2:小组成员3:一、问题描述设计目的:用〈〈数据结构〉〉中的双向链表作数据结构,结合C语言基本知识。

编写一个通讯录管理系统。

以把所学数据结构知识应用到实际软件开发中去。

设计内容:本系统应完成一下几方面的功能:1) 输入信息——enter();2) 显示信息———display( );3) 查找以姓名作为关键字———search( );4) 删除信息———delete( );5) 存盘———save ( );6) 装入———load( ) ;设计要求:1) 每条信息至包含:姓名(NAME )街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项2) 作为一个完整的系统,应具有友好的界面和较强的容错能力3) 上机能正常运行,并写出课程设计报告二、需求分析A,添加:系统将提示用户输入新添加人员信息,输入到文件中,人员信息数据包括姓名(name),街道(street),城市(city),邮编(eip),国家(state).B,删除:首先由用户输入要删除的人员的姓名,然后调用删除函数,删除该人员的所有相关资料.C,显示所有人员信息:该功能将显示已经保存的所有人员的姓名,街道,城市,邮编及国家.D,查询:可由用户输入要查找的人员姓名,然后系统用查找函数查找,接着系统使用相关文件命令输出所查找的人员的全部信息.E,退出系统关闭通讯录管理系统.三、概要设计六个函数的实现:void enter(); 新添纪录void search(); 按姓名查询void display(); 显示void load(); 读取文件void save(); 写入文件void delete(); 删除四、详细设计通讯录管理系统功能说明图:通讯录管理系统数据结构及各模块分析:1.设计类、对象及基本数据类型:创建一个record类,它有五个数据成员:char name[20]; 姓名char street[20]; 街道char city[20]; 城市char eip[20]; 邮编char state[20]; 国家2.包含函数及功能如下:void mainmenu(); 主菜单void searchmenu(); 查找菜单void enter(); 新添纪录void search(); 按姓名查询void display(); 显示所有void load(); 读取文件void save(); 写入文件void delete(); 按姓名删除3.结构体:struct record{char street[20];char name[20];char city[20];char state[20];char eip[20];}student[500];struct slnode{record date;struct slnode *next;struct slnode *prior;};五、调试分析void load()//从文件导入{if((fp=fopen("student","rb"))==NULL) //打开文件进行读的操作{printf("\n\t\t通讯录文件不存在");if ((fp=fopen("student","wb"))==NULL)//打开文件进行读的操作{printf("\n\t\t建立失败");exit(0);}else{printf("\n\t\t通讯录文件已建立");printf("\n\t\t按任意键进入主菜单");getch(); //从键盘接收一个字符}return; //返回主函数的主菜单}exit(0);}fseek(fp,0,2); /*文件位置指针移动到文件末尾*/if (ftell(fp)>0) /*文件不为空*/{rewind(fp); /*文件位置指针移动到文件开始位置*/for (num=0;!feof(fp) && fread(&student[num],sizeof(struct record),1,fp);num++);.......getch();return;}●void mainmenu()//主菜单{char choic;system("cls");printf("\n\t\t***************欢迎进入通讯录系统***************");printf("\n\t\t******************1-新添纪录******************");printf("\n\t\t******************2-查找联系人****************");printf("\n\t\t******************3-删除联系人***************");printf("\n\t\t******************4-保存退出*****************");printf("\n\t\t******************5-不保存退出***************");printf("\n\t\t************************************************"); printf("\n\t\t请选择:");choic=getch();switch (choic){case '1':enter();break;case '2':searchmenu();break;case '3':delet();break;case '4':save();break;case '5':exit(0);default:mainmenu();}}●void searchmenu()//查询菜单{char choic;system("cls");printf("\n\t\t******************* 查询菜单*******************");printf("\n\t\t**************** 1-显示所有********************");printf("\n\t\t**************** 2-按姓名查询******************");printf("\n\t\t**************** 3-返回主菜单******************"); printf("\n\t\t************************************************"); printf("\n\t\t请选择:");choic=getch();switch (choic){case '1':display();break;case '2':search();break;case '3':mainmenu();break;}}void enter()//添加纪录{printf("\n\t\t**************** 请输入学生信息****************\n"); printf("\n\t\t姓名:");scanf("%s",&student[num].name);printf("\n\t\t街道:");scanf("%s",&student[num].street);printf("\n\t\t城市:");scanf("%s",&student[num].city);printf("\n\t\t输入邮编:");scanf("%s",&student[num].eip);printf("\n\t\t国家:");scanf("%s",&student[num].state);num++;listinsert();printf("\n\t\t是否继续添加?(Y/N):");if (getch()=='y')enter();return;}void display()//显示所有{int i;system("cls");if(num!=0){printf("\n\t\t*************** 以下为通讯录所有信息************");for (i=0;i<num;i++){printf("\n\t\t姓名:%s",student[i].name);printf("\n\t\t街道:%s",student[i].street);printf("\n\t\t城市:%s",student[i].city);printf("\n\t\t邮编:%s",student[i].eip);printf("\n\t\t国家:%s",student[i].state);printf("\t\t");if (i+1<num){printf("\n\t\t__________________________");// system("pause");}}printf("\n\t\t************************************************"); }elseprintf("\n\t\t通讯录中无任何纪录");printf("\n\t\t按任意键返回主菜单:");getch();return;}void search()//查找联系人{int j=0,a=0;//j用来记录查找.......scanf("%s",name);for(int i=a;i<num;i++,p=p->next)//num用来表示联系人的个数{if(strcmp(name,p->next->)==0)//查找是否有该人,有则输出该点所有信息,并往下查找。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在实现过程中,我们遵循了以下步骤: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、设计体会和收获
五、评阅意见:。

数据结构实验报告之通讯录的实现

数据结构实验报告之通讯录的实现一、实验题目利用线性表实现一个通讯录管理,通信录的数据格式如下:struct DataType{int ID; //编号char name[10]; //姓名char ch; //性别char phone[13]; //电话char addr[31]; //地址};要求:∙实现通讯录的建立、增加、删除、修改、查询等功能∙能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作。

∙能够保存每次更新的数据(选作)∙能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作)∙编写测试main()函数测试线性表的正确性二、实验目的1、熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法。

2、掌握线性表的操作的实现方法。

3、运用线性表解决实际问题。

三、实验内容通过编写一个C++程序完成一个简易的通讯录管理系统,能够实现建立,增加,删除,修改,查找,浏览,输出,菜单等基本功能。

管理系统中每个元素含有成员的ID、姓名、性别、电话、地址等信息。

程序是使用链表的功能,通过一些算法简单的实现。

四、算法思路与主要代码1. 通信录管理结构:建立,增加,删除,修改,查找,浏览,菜单。

2.建立通讯录构造函数,建立头节点PHONEBOOK::PHONEBOOK(){first = new DataType;first->next = first->prior = first;first->ID = 0;}头插法,添加联系人1:在堆中建立新结点2:将 a[i]写入到新结点的数据域3:修改新结点的指针域4:修改头结点的指针域,将新结点加入链表中即 1:Node <T> * s=new Node <T> 2:s->data=a[i] 3:s->next=front->next; 4:front->next=s代码实现void PHONEBOOK::Insert(){DataType *data = new DataType;data->next = first->next;data->prior = first;first->next = data;data->next->prior = data;m++;data->ID = m;3.查找联系人按姓名查找查找是指用户输入要查找的联系人的姓名,系统该函数内找到该联系人,返回该联系人数据域的指针,在主函数中输出该联系人的全部信息。

手机通讯录实验报告及使用说明(附源代码)

计算机专业教研室实验报告(数据结构)课程设计手机通讯录小组成员系别班级学号实验日期指导教师实验成绩一、实验内容功能要求:(1)将联系人的信息可以存放在文件中,从文件中也可以读出联系人的信息。

(2)可以添加一个新联系人的信息。

(3)可以删除一个联系人的信息,删除条件为电话号码或姓名。

(4)可以查询一个联系人的信息,查询条件为电话号码或姓名。

(5)可以对联系人的信息进行排序,排序条件为联系人的姓名。

二、实验过程1、整个程序包含三个文件。

手机通讯录.cpp、delong.h 、menu.h(点击产看代码)手机通讯录.cpp [主程序]delong.h [各种函数]menu.h [菜单目录]2、联系人信息包括编号、姓名、手机号码、家庭住址、E-mail、QQ、类别信息。

其中编号分配4位、姓名10位、手机号码13位、地址14位、E-mail 14位、QQ和类别都为12位。

但实际上存储的时候所占位数都要少一位。

因为存储的时候是以字符形式存储,读取的时候以字符串形式读取,需要用最后一位填写字符串结束标志’\0’。

3、函数列表:void AddSpace(int n); /*添加空格*/void Save(FILE *fp,int n,int j); /*将person[MAXSIZE]中的内容放到通讯录.txt*/j==0; 追加方式写入,适用于增加联系人的情况。

j==1; 重新方式写入,适用于修改、删除情况。

三、总结:1、还是有小BUG。

Eg:删除最后一个联系人的时候再输出全部信息时还是能输出一个联系人。

2、代码冗长:Eg:增加操作及存储,得到联系人信息增添空格的时候没有写AddSpace()函数。

在修改操作中得到修改后的联系人信息那里才用AddSpace()函数。

某些地方重复代码较多。

3、函数归编混乱,不利于读看。

四、实验具体实验程序代码(要有注释)、测试结果(最好截图)和实验总结1、开始界面2、创建通讯录,若存在则无须再次创建。

数据结构课程设计-通讯录查询系统的设计与实现

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

数据结构实验报告实验名称:实验一——线性表学生:大学霸班级: xxxxxxxxxx班序号: xx学号: xxxxxxxxxx日期: 2012年11月1日1.实验要求实验目的:1.学习指针,模板类,异常处理的使用;2.掌握线性表的操作实现方法;3.培养使用线性表解决实际问题的能力。

实验容:利用线性表实现一个通讯录管理,通信录的数据格式如下:struct DataType{int ID; //编号char name[10]; //char ch; //性别char phone[13]; //char addr[31]; //地址};具体要求:1.实现通信录的建立、增加、删除、修改、查询等功能2.能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作3.能够保存每次更新的数据4.编写main()函数测试操作的正确性2. 程序分析编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。

每个记录包含、、住址等个人基本信息。

用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。

本程序为使用方便,几乎不用特殊的命令,只需按提示输入即可,适合更多的用户使用。

对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。

2.1 存储结构节点结构:2.2 关键算法分析本实验从整体上分为七大模块:(1)输入联系人信息;(2)添加联系人信息;(3)查找联系人信息;(4)查看联系人信息;(5)删除联系人信息;(6)修改联系人信息;(7)退出通讯录管理。

通讯录系统图2.2.1通讯录的建立伪代码:1.在堆中申请新的结点;2.新节点的数据域为a[i];3.将新节点加入到链表中;4.修改尾指针;5.全部结点插入后需要将终结结点的指针域设为空。

C++实现:ContactBook::ContactBook(DataType a[],int n)//尾插法{front=new Node;rear=new Node;rear=front; //构造空单链表for(int i=0;i<n;i++){Node * s=new Node; //建立新节点s->data=a[i]; //写入数据域rear->next=s; //将新节点加入到链表中rear=s; //修改尾指针}rear->next=NULL; //终端节点的指针域设为空}时间复杂度:o(n)2.2.2通讯录的插入伪代码:插入为建立的一种特殊形式,即插入一个单独的结点,方法与上述类似C++实现:void ContactBook::Add(DataType a)//尾插法{Node * s=new Node;s->data=a;rear->next=s;rear=s;rear->next=NULL;}时间复杂度:o(1)2.2.3按ID查找查找操作是指用户输入要查找的用户的ID,系统该函数找到该用户,返回用户数据域的指针,在主函数中输出该用户的全部信息。

伪代码:1.初始化工作指针p;2.循环以下操作直到p为空或找到用户1.如果p的数据等于i,则返回P的数据域指针;2.P指针指向下一个节点;3.若找不到返回空指针。

C++实现://通讯簿按ID查找DataType * ContactBook::Get(int i){Node * p=front->next;while(p){if(p->data.ID==i)return &(p->data); //根据ID找到被查元素,返回位置p=p->next;}return NULL; //若找不到,返回空指针}时间复杂度:o(n)2.2.4通讯录的删除删除操作是指根据用户输入要删除用户的ID,找到该用户结点,返回该用户的数据域,删除此节点伪代码:1.从第一个节点开始,查找到要删用户的的前一个用户节点,设P指向该节点;2.设q指向要删除的用户:q=p->next;3.摘链:p->next=q->next;4.保存q节点的数据域:x=q->data;5.释放q节点:deleteq;要指出的是若在整个通讯录找不到该ID,直接跳过删除步骤,输出查无此人C++实现:DataType ContactBook::Delete(int i){Node * p=front;while(p->next){if(p->next->data.ID==i)break; //找到要删除的用户,跳出循环p=p->next;}Node * q=p->next; //找到该用户if(q){p->next=q->next;DataType x=q->data; //记录用户信息 delete q; //删除用户cout<<" 删除成功!"<<endl;return x;}else{cout<<" 该用户不存在!"<<endl;}}时间复杂度:o(n)2.2.5通讯录的修改当用户要进行修改用户操作时,会在主函数输入要修改用户的ID,调用查询模块,若用户存在,系统会显示找到的用户信息,然后要求依次输入该用户新的的编号,,性别,手机号,地址,输入这些后,用户信息被修改C++实现://通讯簿修改void ContactBook::Modify(DataType a,int i){DataType * p=Get(i); //按ID找到要修改的用户* p=a; //修改用户的个人数据}时间复杂度:o(n)2.2.6通讯录的遍历显示用户选择输出通讯录,系统会依次输出所有用户的信息输出的基本思想是:只要将表头的指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空值。

C++实现://通讯簿遍历void ContactBook::PrintList(){Node * p=front->next;cout<<"您的通讯簿信息如下:"<<endl;cout<<"-------------------------------"<<endl;while(p){cout<<p->data.ID<<" "<<p-><<" "<<p->data.ch<<" "<<p->data.phone<<" "<<p->data.addr;cout<<endl;cout<<"-------------------------------"<<endl;p=p->next;}}时间复杂度:o(n)2.2.7通讯录的析构通讯录的析构即为单链表的析构,比较简单C++实现://析构函数ContactBook::~ContactBook() {Node *p=front;while(p){front=p;p=p->next;delete front;}}时间复杂度:(n)2.3 其他3. 程序运行结果主函数流程图:测试截图:1.建立通讯簿2.添加新用户3.查找用户4.删除用户5.查看所有用户6.修改已有用户7.退出通讯簿管理系统4. 总结通过这次的数据结构上机试验,让我回顾了有关线性表这一章的知识,学会使用线性表解决实际问题,让我有了更深的认识和了解,能灵活的使用,同时也发现了自己的不足,有些地方理解还不够深刻,出现了不少问题调试时问题主要出在存错误上,有时指针悬挂,有时尾指针指向错误,这些都需要一步步耐心的调试才能发现,以后编程我会注意改正这些依照实验要求,在不同操作时加入了异常处理,比如要查找,删除,修改用户时,如果输入的ID不存在,系统会报错并终止操作,提高了系统的操作性这次设计的通讯簿管理系统还有些可以改进的地方,比如加入文件流后可以将每次输入的信息保存在后台的一个文件里,每次使用时读取这个文件的信息,实现了保存每次更新的数据。

我对于文件流的使用还不是很熟悉,所以没来及加入这项功能;还有在查询这一块,只实现了按编号查询,还未加入按查找。

附:所有源程序#include<iostream>using namespace std;//个人数据结构体struct DataType{int ID; //用户ID;char name[10]; //char ch; //性别char phone[13]; //手机char addr[31]; //地址};//用户结点struct Node{DataType data;struct Node * next;};//通讯簿类声明class ContactBook{public:ContactBook(){front=new Node;rear=new Node;front->next=NULL;rear=front;} ContactBook(DataType a[],int n); //建立~ContactBook(); //析构void Add(DataType a); //添加DataType * Get(int i); //查找DataType Delete(int i); //删除void Modify(DataType a,int i); //修改void PrintList(); //遍历private:Node * front; //头结点Node * rear; //尾结点};//通讯簿的建立ContactBook::ContactBook(DataType a[],int n)//尾插法{front=new Node;rear=new Node;rear=front;for(int i=0;i<n;i++){Node * s=new Node;s->data=a[i];rear->next=s;rear=s;}rear->next=NULL;}//通讯簿的添加void ContactBook::Add(DataType a)//尾插法{Node * s=new Node;s->data=a;rear->next=s;rear=s;rear->next=NULL;}//通讯簿按ID查找DataType * ContactBook::Get(int i){Node * p=front->next;while(p){if(p->data.ID==i)return &(p->data); //根据ID找到被查元素,返回位置p=p->next;}return NULL; //若找不到,返回空指针}//通讯簿修改void ContactBook::Modify(DataType a,int i){DataType * p=Get(i); //按ID找到要修改的用户* p=a; //修改用户的个人数据}//通讯簿删除DataType ContactBook::Delete(int i){Node * p=front;while(p->next){if(p->next->data.ID==i)break; //找到要删除的用户,跳出循环p=p->next;}Node * q=p->next; //找到该用户if(q){p->next=q->next;DataType x=q->data; //记录用户信息 delete q; //删除用户cout<<" 删除成功!"<<endl;return x;}else{cout<<" 该用户不存在!"<<endl;}}//通讯簿遍历void ContactBook::PrintList(){Node * p=front->next;cout<<"您的通讯簿信息如下:"<<endl;cout<<"-------------------------------"<<endl;while(p){cout<<p->data.ID<<" "<<p-><<" "<<p->data.ch<<" "<<p->data.phone<<" "<<p->data.addr;cout<<endl;cout<<"-------------------------------"<<endl;p=p->next;}}//析构函数ContactBook::~ContactBook(){Node *p=front;while(p){front=p;p=p->next;delete front;}}void main(){DataType a[5]={{1001,"一",'m',"",""},{1002,"王二",'m',"",""},{1003,"周三",'m',"",""},{1004,"四",'f',"",""},{1005,"五",'f',"",""}};ContactBook My(a,5);int choose;do{cout<<" 通讯簿管理系统"<<endl;cout<<"-------------------------------"<<endl;cout<<" 1.建立我的通讯簿 "<<endl;cout<<" 2.添加通讯簿的成员 "<<endl;cout<<" 3.查找通讯簿的成员 "<<endl;cout<<" 4.删除通讯簿的成员 "<<endl;cout<<" 5.查看我的通讯簿 "<<endl;cout<<" 6.修改通讯簿的成员 "<<endl;cout<<" 0.退出通讯簿管理系统 "<<endl;cout<<"-------------------------------"<<endl;cout<<" 请选择:";cin>>choose;switch(choose){case 1:cout<<endl<<" 通讯簿建立成功"<<endl<<endl;break;case 2:DataType x;cout<<"请输入新用户的ID、、性别(m/f)、手机号、住址"<<endl;cin>>x.ID>>>>x.ch>>x.phone>>x.addr;My.Add(x);cout<<" 新用户添加成功!"<<endl<<endl;break;case 3:int search;cout<<" 请输入要查找用户的ID:";cin>>search;if(My.Get(search)){cout<<" 查找到的信息如下:"<<endl;cout<<"-------------------------------"<<endl;cout<<My.Get(search)->ID<<" "<<My.Get(search)->name<<" "<<My.Get(search)->ch<<" "<<My.Get(search)->phone<<""<<My.Get(search)->addr;cout<<endl;cout<<"-------------------------------"<<endl;}elsecout<<" 该用户不存在!"<<endl;cout<<endl;break;case 4:int del;cout<<" 请输入要删除用户的ID: ";cin>>del;if(My.Get(del)){cout<<"-------------------------------"<<endl;cout<<My.Get(del)->ID<<" "<<My.Get(del)->name<<" "<<My.Get(del)->ch<<" "<<My.Get(del)->phone<<" "<<My.Get(del)->addr;cout<<endl;cout<<"-------------------------------"<<endl;cout<<" 确定删除该用户?(y/n): ";char IsDel;cin>>IsDel;if(IsDel=='y')My.Delete(del);elsecout<<" 取消删除!"<<endl;;cout<<endl;}elsecout<<" 用户不存在!"<<endl<<endl;break;case 5:My.PrintList();break;case 6:int mod;cout<<" 请输入要修改用户的ID: ";cin>>mod;if(My.Get(mod)){DataType x;cout<<"请输入修改后的ID、、性别(m/f)、手机号、住址"<<endl;cin>>x.ID>>>>x.ch>>x.phone>>x.addr;My.Modify(x,mod);cout<<" 修改成功!"<<endl<<endl;;}elsecout<<" 该用户不存在!"<<endl<<endl;break;case 0:cout<<" 退出成功!"<<endl;break;default:cout<<" 输入有误!"<<endl<<endl;};}while(choose!=0);}实验报告总字数要求不少于1000字。

相关文档
最新文档