北邮数据结构实验一通讯录实验报告
北邮数据结构实验报告实验一线性表

数据结构实验报告实验名称:实验一——线性表学生姓名:班级:班内序号:学号:日期:2014年11月20日1.实验要求[正文格式要求]字体:汉字宋体、英文Times New Roman字号:五号颜色:黑色行距:单倍行距[内容要求]描述要求的实验目的和具体的实验内容2. 程序分析2.1 存储结构带头结点单链表2.2 关键算法分析一:关键算法1:头插法自然语言描述:a:在堆中建立新结点b:将a[i]写入到新结点的数据域c:修改新结点的指针域d:修改头结点的指针域。
将新结点加入链表中伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:s->next=front->next;d:front->next=s2:尾插法自然语言描述:a:在堆中建立新结点:b:将a[i]写入到新结点的数据域:c:将新结点加入到链表中d:修改修改尾指针伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:r->next=s;d:r=s3:析构/删除函数自然语言描述:a:新建立一个指针,指向头结点b:判断要释放的结点是否存在,c:暂时保存要释放的结点d:移动a中建立的指针e:释放要释放的指针伪代码描述a:Node <T> * p=frontb:while(p)c:front=pd:p=p->nexte:delete front4:按位查找函数自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1 b:循环以下操作,直到p为空或者j等于1b1:p指向下一个结点b2:j加1c:若p为空,说明第i个元素不存在,抛出异常d:否则,说明p指向的元素就是所查找的元素,返回元素地址伪代码描述a:Node <T> * p=front->next;j=1;b:while(p&&j!=1)b1:p=p->nextb2:j++c:if(!p) throw ”error”d:return p5:按位查找函数自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,找到这个元素或者p指向最后一个结点b1:判断p指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j的值加一c:如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息伪代码描述a:Node <T> * p=front->next;j=1;b:while(p)b1:if(p->next==x) return jp=p->nextj++c:return “error”6:插入函数自然语言描述:a:在堆中建立新结点b:将要插入的结点的数据写入到新结点的数据域c:修改新结点的指针域d:修改前一个指针的指针域,使其指向新插入的结点的位置伪代码描述a:Node <T> * s=new Node <T>;b:s-data=p->datac:s->next=p->nextd:p->next=se:p->data=x7:删除函数自然语言描述:a:从第一个结点开始,查找要删除的位数i前一个位置i-1的结点b:设q指向第i个元素c:将q元素从链表中删除d:保存q元素的数据e:释放q元素伪代码描述a:q=p->nextb:p->next=q->nextc:x=q->datad:delete q8:遍历打印函数自然语言描述:a:判断该链表是否为空链表,如果是,报错b:如果不是空链表,新建立一个temp指针c:将temp指针指向头结点d:打印temp指针的data域e:逐个往后移动temp指针,直到temp指针的指向的指针的next域为空伪代码描述If front->next==NULLThrow ”an empty list ”Node<T>* temp=front->next;while(temp->next){cout<<temp->data<<" ";temp=temp->next;}8:获取链表长度函数自然语言描述:a:判断该链表是否为空链表,如果是,输出长度0b:如果不是空链表,新建立一个temp指针,初始化整形数n为0c:将temp指针指向头结点d:判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则return n e: 使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n伪代码描述int n=0if front->next==NULLn=0else{Node<T>* temp=front->next; while(temp->next)n++;temp=temp->next; }return n;4. 总结1、调试时出现的问题及解决的方法编程序时总是不考虑异常抛出,后经老师指点改正。
北邮数据结构实验报告

北邮数据结构实验报告摘要:本报告基于北邮数据结构实验,通过实际操作和实验结果的分析,总结和讨论了各实验的目的、实验过程、实验结果以及相关的问题和解决方法。
本报告旨在帮助读者了解数据结构实验的基本原理和应用,并为今后的学习和研究提供参考。
1. 实验一:线性表的操作1.1 实验目的本实验旨在掌握线性表的基本操作以及对应的算法实现,包括插入、删除、查找、修改等。
1.2 实验过程我们使用C++语言编写了线性表的相关算法,并在实际编程环境下进行了测试。
通过插入元素、删除元素、查找元素和修改元素的操作,验证了算法的正确性和效率。
1.3 实验结果经过测试,我们发现线性表的插入和删除操作的时间复杂度为O(n),查找操作的时间复杂度为O(n),修改操作的时间复杂度为O(1)。
这些结果与预期相符,并反映了线性表的基本特性。
1.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如插入操作的边界条件判断、删除操作时的内存释放等。
通过仔细分析问题,我们优化了算法的实现,并解决了这些问题。
2. 实验二:栈和队列的应用2.1 实验目的本实验旨在掌握栈和队列的基本原理、操作和应用,并进行实际编程实现。
2.2 实验过程我们使用C++语言编写了栈和队列的相关算法,并在实际编程环境下进行了测试。
通过栈的应用实现表达式求值和逆波兰表达式的计算,以及队列的应用实现图的广度优先遍历,验证了算法的正确性和效率。
2.3 实验结果经过测试,我们发现栈的应用可以实现表达式的求值和逆波兰表达式的计算,队列的应用可以实现图的广度优先遍历。
这些结果证明了栈和队列在实际应用中的重要性和有效性。
2.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如中缀表达式转后缀表达式的算法设计、表达式求值的优化等。
通过查阅资料和与同学的讨论,我们解决了这些问题,并完善了算法的实现。
3. 实验三:串的模式匹配3.1 实验目的本实验旨在掌握串的基本操作和模式匹配算法,并进行实际编程实现。
数据结构通讯录管理系统课程设计实验报告心得

数据结构通讯录管理系统课程设计实验报告背景随着信息化的快速发展,通讯录管理系统成为了每个人生活中必备的工具之一。
传统的纸质通讯录已经无法满足人们对于信息管理的需求,因此开发一个高效、便捷、用户友好的通讯录管理系统显得尤为重要。
本次课程设计实验的目标是设计一个基于数据结构的通讯录管理系统,实现通讯录的创建、查找、修改、删除等功能。
通过本次实验,我们可以学习和掌握数据结构中的链表、哈希表等基础概念和算法,并将其应用到实际项目中。
分析通讯录管理系统主要有以下几个功能:1.创建通讯录:通讯录是一个存储联系人信息的数据结构,可以存储联系人的姓名、电话号码、邮箱地址等信息。
2.添加联系人:可以向通讯录中添加新的联系人,包括姓名、电话号码、邮箱地址等信息。
3.查找联系人:可以根据姓名或电话号码查找通讯录中的联系人,并显示其详细信息。
4.修改联系人:可以根据姓名或电话号码修改通讯录中的联系人信息。
5.删除联系人:可以根据姓名或电话号码删除通讯录中的联系人。
为了实现上述功能,我们可以使用链表来实现通讯录的存储,每个节点表示一个联系人。
每个节点包含姓名、电话号码、邮箱地址等信息,并且有指向下一个节点的指针。
为了提高查找联系人的效率,我们还可以使用哈希表来实现联系人的快速查找。
哈希表采用键值对的方式存储数据,通讯录中的联系人可以以姓名为键,联系人节点为值存储在哈希表中。
结果实验的最终结果是一个完善的通讯录管理系统,能够实现创建通讯录、添加联系人、查找联系人、修改联系人和删除联系人等功能。
在实现过程中,我们遵循了以下步骤:1.首先,我们设计了联系人节点的数据结构,包括姓名、电话号码、邮箱地址等字段,并定义了节点的操作方法。
2.接着,我们设计了通讯录的数据结构,使用链表来存储联系人节点,并实现了通用的链表操作方法,如插入节点、删除节点等。
3.然后,我们设计了哈希表的数据结构,使用哈希函数将联系人节点存储在哈希表中,并实现了查找联系人的快速算法。
通讯录实验报告

实验课程名称通讯录管理系统专业班级 10级计科1班学生姓名学号指导教师2012至2013学年第一学期第1 至18 周目录第1章概述 (3)1.1现状分析 (3)1.2实现意义 (3)第2章系统分析 (4)2.1用户需求分析 (4)2.2管理者需求分析 (4)第3章概要设计 (5)3.1主控菜单设计 (5)3.2 总结构设计流程图 (6)第4章详细设计 (6)4.1通讯录建立模块设计 (6)4.2通讯录查询模块设计 (7)4.3通讯录删除模块设计 (7)4.4通讯录链表的输出模块设计 (8)第5章运行与测试 (9)第6章总结和心得 (9)参考文献 (10)附件(源代码) (10)第1章概述1.1现状分析日益繁多的人际交往使得我们很难记住与每个人之间的联系方式,通讯录能够便捷的给我们带来所需要的相关信息。
为了实现通讯录管理的几种操作功能,首先设计一个含有多少个菜单项的主控菜单程序,然后再为这些菜单配上相应的功能。
1.2实现意义随着计算机的普及,人们的生活摆脱了传统式的记事本、电话簿,越来越多的靠计算机或者手机中的电话簿程序来帮助人们记住这些事情,极其简便。
这就需要有一个使用的通讯录管理系统,用户可以方便的通过自己电脑的通讯录管理系统,来随时查阅自己所需要的信息,而不必再大费周折去翻开那繁琐的记事本。
通讯录管理系统是一个专门针对储存用户联系方式以及一些简单个人信息的实用管理系统,它方便了用户对众多客户、朋友、同事等个人信息的储存和快速查阅的功能,大大减少了查找过程的时间。
然而要靠计算机来记住这些信息,首先就得要求用单链表做数据结构,设计一个实现通讯者信息的输入、查询、删除、输出、等功能的通讯录管理系统。
每条通讯者信息包含:编号、姓名、性别、电话号码、地址等信息。
第2章系统分析2.1用户需求分析为实现系统功能,本程序主要分为五个模块。
它们分别为:输入一个信息、删除一个信息、查询一个信息、插入一个信息、输出所有的信息、退出该程序。
作通讯录的实训报告

随着信息技术的飞速发展,通讯录在人们的工作、生活中扮演着越来越重要的角色。
为了提高同学们对通讯录管理的认识,培养实际操作能力,我校组织了通讯录实训活动。
本次实训旨在使同学们掌握通讯录的基本操作,提高信息处理能力,为今后的工作打下坚实基础。
二、实训目标1. 熟悉通讯录的基本概念和作用;2. 掌握通讯录的创建、编辑、查询、导出等功能;3. 学会使用通讯录进行日常信息管理;4. 培养同学们团队协作和沟通能力。
三、实训内容1. 通讯录基础知识实训老师首先向同学们介绍了通讯录的基本概念、作用以及常见的通讯录类型。
通讯录是一种用于存储和查询联系人信息的工具,可以方便地记录和查找电话、邮箱、地址等个人信息。
常见的通讯录类型有纸质通讯录、电子通讯录等。
2. 通讯录创建与编辑同学们在实训老师的指导下,学习了如何创建一个新的通讯录。
首先,选择合适的通讯录类型,如电子通讯录;然后,输入联系人的姓名、电话、邮箱、地址等基本信息。
在编辑通讯录时,同学们掌握了如何修改、删除、添加联系人信息。
3. 通讯录查询与导出实训老师讲解了如何通过姓名、电话、邮箱等条件在通讯录中查询联系人信息。
此外,同学们还学会了如何将通讯录导出为Excel、Word等格式,方便后续的整理和使用。
4. 实际操作演练为了巩固所学知识,同学们进行了实际操作演练。
在实训老师的带领下,同学们分组进行通讯录管理,包括创建通讯录、添加联系人、查询信息等。
通过实际操作,同学们熟练掌握了通讯录的基本操作。
1. 同学们对通讯录的基本概念、作用有了更深入的了解;2. 掌握了通讯录的创建、编辑、查询、导出等功能;3. 提高了信息处理能力,为今后的工作打下了坚实基础;4. 培养了团队协作和沟通能力。
五、实训总结本次通讯录实训活动,同学们积极参与,认真完成各项任务。
通过实训,同学们对通讯录有了更加全面的认识,掌握了通讯录的基本操作,提高了信息处理能力。
在今后的工作和生活中,通讯录将发挥重要作用,希望同学们能够充分利用所学知识,提高工作效率。
数据结构实验报告之通讯录的实现

数据结构实验报告之通讯录的实现一、实验题目利用线性表实现一个通讯录管理,通信录的数据格式如下: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.查找联系人按姓名查找查找是指用户输入要查找的联系人的姓名,系统该函数内找到该联系人,返回该联系人数据域的指针,在主函数中输出该联系人的全部信息。
[数据结构课程设计通讯录查询系统实验报告范文及源代码]数据结构通讯录
![[数据结构课程设计通讯录查询系统实验报告范文及源代码]数据结构通讯录](https://img.taocdn.com/s3/m/e16be22d657d27284b73f242336c1eb91a3733b4.png)
[数据结构课程设计通讯录查询系统实验报告范文及源代码]数据结构通讯录工程名称:停车管理系统姓名:学号:专业:软件工程1.需求分析为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的与地址。
设计散列表存储,设计并实现通讯录查找系统。
1.根本要求〔1〕每个记录有以下数据项:号码、用户名、地址;〔2〕从键盘输入各记录,分别以号码为关键字建立散列表;〔3〕采用二次探测再散列法解决冲突;〔4〕查找并显示给定号码的记录;〔5〕通讯录信息文件保存。
2.重点、难点重点:〔1〕通过实验深入理解哈希表既是一种存储形式,又是一种查找方法;〔2〕哈希表的构造;〔3〕哈希冲突方案的设计。
难点:哈希表的构造与哈希冲突方案的设计输入的形式和输入值的范围;输入三个字符串:分别是号码,姓名,地址,每行一个数据字符串长度适当如:号码〔纯数字〕姓名地址输出的形式;如:姓名号码地址程序所能到达的功能。
1:并且通过号码为关键字,用二次再散列法寻找地址储存在哈希表中。
2:3:4:5:显示通讯录6:把通讯录写入文件储存。
2.概要设计(1)数据结构tructlit{chara[12];charname[15];charadd[15];intf=0;};用连续的内存空间构建哈希表tructqtack{tructlit某bae;inti;};(2)程序模块1:构建二次再散列:inti;for(i=1;i<25;i++)d[2某i]=-1某i某i;for(i=1;i<25;i++)/某构造二次再散列某/d[i+i-1]=i某i;2:主菜单:voidinterface(){inti;printf("某某某某某某某某某某某某某某某某某某某某\n");printf("某某某某某某某某某某某某某某某某某某某某\n");canf("%d",&i);witch(i){cae0:return;break;cae1:huru();break;cae2:print();break;cae3:each();break;cae4:del();break;cae5:change();break;cae6:write();break;};}3:输入voidhuru()4:存入哈希表,采用二次探测再散列法解决冲突;voidtore(char某a,char某name,char某add)voideach();voidchange()Voiddel〔〕;voidwrite()(3)各模块之间的调用关系以及算法设计3.详细设计4.测试与分析主界面:构建哈希表,允许号码重复可以支持姓名,,地址三个关键字的查找可以按照姓名地址删除写文件:创立文件通讯录.t某t 如图:5.附录3.cpp#include<tdio.h>#include<tdlib.h>#include<tring.h>#include<iotream>#include<tring.h>uingnamepacetd;intd[50];/某再散列某/tructlit{chara[12];charname[15];charadd[15];intf=0;};tructqtack{tructlit某bae;inti;};tructqtackS;voidtore(char某a,char某name,char某add){intkey;key=int(a[0])+int(a[3])+int(a[7]);/某以号码的第1,4,8位作为关键字构造哈希函数某/S.i=key%20;intj=1;while(true){if((S.bae+S.i)->f==0){trcpy((S.bae+S.i)->a,a);trcpy((S.bae+S.i)->name,name);trcpy((S.bae+S.i)->add,add);(S.bae+S.i)->f=1;break;}S.i=(key%20+d[j])%20;j++;}}voidhuru(){voidinterface();cout<<"请输入:\n例如:\n小王\n安徽省合肥市\n输入0结束\n"; chara[12];charname[15];charadd[15];while(true){canf("%",a);if(a[0]=='0')break;canf("%",name);canf("%",add);printf("%已保存\n",name);tore(a,name,add);/某将输入保存到哈希表某/}interface();}voidprint(){voidinterface();inti;printf("姓名号码地址\n");for(i=0;i<20;i++){if((S.bae+i)->f==1){printf("%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add);}}interface();}voideach(){voidinterface();inti;intff=0;intb;chara[15];printf("输入1按号码查找,输入2按姓名查找,输入3按地址查找\n");canf("%d",&b);witch(b){cae1:printf("请输入号码\n");canf("%",a);for(i=0;i<20;i++)if(trcmp(a,(S.bae+i)->a)==0){printf("%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add); ff=1;}if(ff==0)printf("找不到该用户\n");break;cae2:printf("请输入姓名\n");canf("%",a);for(i=0;i<20;i++)if(trcmp(a,(S.bae+i)->name)==0){printf("%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add); ff=1;}if(ff==0)printf("找不到该用户\n");break;cae3:printf("请输入地址\n");canf("%",a);for(i=0;i<20;i++)if(trcmp(a,(S.bae+i)->add)==0){printf("%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add); ff=1;}if(ff==0)printf("找不到该用户\n");break;}interface();}voiddel(){voidinterface();inti;intff=0;chara[15];printf("输入1按号码删除,输入2按姓名删除,输入3按地址删除\n");canf("%d",&b);witch(b){cae1:printf("请输入号码\n");canf("%",a);for(i=0;i<20;i++)if(trcmp(a,(S.bae+i)->a)==0){(S.bae+i)->f=0;Print(“已删除:%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add);ff=1;}if(ff==0)printf("找不到该用户\n");cae2:printf("请输入姓名\n");canf("%",a);for(i=0;i<20;i++)if(trcmp(a,(S.bae+i)->name)==0){(S.bae+i)->f=0;printf("已删除:%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add);ff=1;}if(ff==0)printf("找不到该用户\n");break;cae3:printf("请输入地址\n");canf("%",a);for(i=0;i<20;i++)if(trcmp(a,(S.bae+i)->add)==0){(S.bae+i)->f=0;printf("已删除:%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add);ff=1;}if(ff==0)printf("找不到该用户\n");break;}interface();}voidchange(){voidinterface();inti;intff=0;intb;chara[15];printf("请输入姓名\n");canf("%",a);for(i=0;i<20;i++)if(trcmp(a,(S.bae+i)->name)==0){printf("您要修改的是:%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add);printf("请输入新信息\n");canf("%",(S.bae+i)->a);canf("%",(S.bae+i)->name);canf("%",(S.bae+i)->add);printf("已修改成:%%%\n",(S.bae+i)->name,(S.bae+i)->a,(S.bae+i)->add);ff=1;}if(ff==0)printf("找不到该用户\n");interface();}voidwrite()voidinterface();inti=0;FILE某fp;if((fp=fopen("通讯录.t某t","wb"))==NULL){printf("openfileerror\n");e某it(1);}for(i=0;i<=20;i++){intch=32;if((S.bae+i)->f==1){fprintf(fp,"%",(S.bae+i)->name);fputc(ch,fp); fprintf(fp,"%",(S.bae+i)->a);fputc(ch,fp);ch=10;fprintf(fp,"%",(S.bae+i)->add);fputc(ch,fp); }fcloe(fp);interface();}voidinterface(){inti;printf("某某某某某某某某某某某某某某某某某某某某\n"); printf("某某某某某某某某某某某某某某某某某某某某\n"); canf("%d",&i);witch(i){cae0:return;break;cae1:huru();break;cae2:print();break;cae3:each();break;cae4:del();break;cae5:change();break;cae6:write();break;}intmain(){ytem("color70");//可以写成red调出颜色组S.bae=(tructlit某)malloc(20某izeof(tructlit)); ytem("date/T");ytem("TIME/T");inti;for(i=1;i<25;i++)d[2某i]=-1某i某i;for(i=1;i<25;i++)/某构造二次再散列某/d[i+i-1]=i某i;interface();}6.用户使用手册根据主菜单提示选择所想要的操作0:结束程序小华安徽合肥可以根据姓名,,地址分别作为关键字进行查询谢谢使用!。
北邮数据结构实验报告-排序

北邮数据结构实验报告-排序北邮数据结构实验报告-排序一、实验目的本实验旨在掌握常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等,并通过实际编程实现对数字序列的排序。
二、实验内容1.冒泡排序冒泡排序是一种简单的排序算法,其基本思想是依次比较相邻的两个元素,并按照从小到大或从大到小的顺序交换。
具体步骤如下:- 从待排序序列的第一个元素开始,依次比较相邻的两个元素;- 如果前面的元素大于后面的元素,则交换这两个元素的位置;- 重复上述步骤,直到整个序列有序。
2.插入排序插入排序是一种简单且直观的排序算法,其基本思想是将待排序序列分为已排序和未排序两部分,每次从未排序部分中选择一个元素插入到已排序部分的合适位置。
具体步骤如下:- 从待排序序列中选择一个元素作为已排序部分的第一个元素;- 依次将未排序部分的元素插入到已排序部分的合适位置,使得已排序部分保持有序;- 重复上述步骤,直到整个序列有序。
3.选择排序选择排序是一种简单且直观的排序算法,其基本思想是每次选择未排序部分中的最小(或最大)元素,并将其放在已排序部分的末尾。
具体步骤如下:- 在未排序部分中选择最小(或最大)的元素;- 将选择的最小(或最大)元素与未排序部分的第一个元素交换位置;- 重复上述步骤,直到整个序列有序。
4.快速排序快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序序列分割成两部分,其中一部分的元素都比另一部分的元素小。
具体步骤如下:- 选择一个枢轴元素(一般选择第一个元素);- 将待排序序列中小于枢轴元素的元素放在枢轴元素的左侧,大于枢轴元素的元素放在枢轴元素的右侧;- 对枢轴元素左右两侧的子序列分别进行递归快速排序;- 重复上述步骤,直到整个序列有序。
5.归并排序归并排序是一种高效的排序算法,其基本思想是将待排序序列划分成足够小的子序列,然后对这些子序列进行两两合并,最终形成有序的序列。
具体步骤如下:- 将待排序序列递归地划分成足够小的子序列;- 对每个子序列进行归并排序;- 合并相邻的子序列,直到整个序列有序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
DataType x=q->data;//保存成员数据
p->next=q->next;
delete q;
cout<<"删除成功!"<<endl;
return x;
}
else
{
cout<<"该成员不存在!"<<endl;
}
}
void ContactBook::Modify(DataType a,int i)
rear=new Node;
rear=front;
for(int i=0;i<n;i++) //尾插法
{
Node* p=new Node;
p->data=a[i];
rear->next=p;
rear=p;
}
rear->next=NULL;
}
void ContactBook::Add(DataType a)//尾插法
{
DataType data; //数据
struct Node * next; //指针指向下一节点
};
class ContactBook
{
public:
ContactBook();//默认构造函数
ContactBook(DataType a[],int n);//构造函数
void Add(DataType a); //增加成员
数据结构实验报告
实验名称:实验———线性表
学生姓名:
班级:
班内序号:
学号:
日期:实验要求
1.1 实验目的
通过选择下面四个题目之一进行实现,掌握如下内容:
熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法
学习指针、模板类、异常处理的使用
掌握线性表的操作的实现方法
学习使用线性表解决实际问题的能力
1.2实验内容
Node* rear;
};
ContactBook::ContactBook()
{
front=new Node;
rear=new Node;
front->next=NULL;
rear=front;
}
ContactBook::ContactBook(DataType a[],int n)
{
front=new Node;
附源程序:
#include<iostream>
using namespace std;
struct DataType
{
int ID;//ID
char name[10];//姓名
char ch;//性别
char phone[13];//电话
char addr[31];//地址
};
struct Node
能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作。
能够保存每次更新的数据(选作)
能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作)
编写测试main()函数测试线性表的正确性
2.程序分析
通过编程完成通讯录管理系统,实现建立、增加、修改、查找、删除、输出等一般功能,每个数据元素包含成员的ID、姓名、电话、住址等基本信息。本程序使用链表的功能,以C++语言为基础编写。对于本通讯录管理系统的建立,需要了解并掌握链表的算法与设计方法,综合运用所学知识完成。
代码实现:
ContactBook::ContactBook(DataType a[],int n)
{
front=new Node;
rear=new Node;
rear=front;
for(int i=0;i<n;i++) //尾插法
{
Node* p=new Node;
p->data=a[i];
rear->next=p;
{
cout<<"您的通讯录成员如下:"<<endl;
cout<<"********************"<<endl;
Node* p=front->next;
while(p)
{
cout<<p->data.ID<<" "<<p-><<" "
<<p->data.ch<<" "<<p->data.phone<<" "
本实验还要求我们学会对异常操作进行处理,本程序中也对该要求做了相关改进,比如要求“请输入数字选择”时,对于输入不合理的数字或字符都有相应的提示、处理。
本程序的不足之处有二。一是查找用户时只能进行ID匹配查找,而不能对其他信息进行匹配查找。二是没加入读取和保存联系人的功能,该功能可以通过使用文件流,将联系人信息输出到指定文件中保存,并且可以读取后进行操作。
3.3.5 删除成员
3.3.6 打印成员
3.3.7 退出
4.总结
通过本实验,巩固了我对链表的理解,学会了使用线性表解决一些实际的问题。但实验中还是有一些问题暴露了出来。
比如一开始在调试的时候,打印成员时出现了如下截图中的问题。
经过分析,才知道原来初始化指针p的时候指向了头指针并打印了出来,修改后p应该指向头指针的next域。调试中诸如这样的问题并不少见,也就是内存错误。
{1003,"王五",'m',"15501010101","天津"}};
ContactBook Test(a,3);//初始化通讯录
int no;
do{
cout<<"1.建立我的通讯录"<<endl;
cout<<"2.增加通讯录成员"<<endl;
cout<<"3.查找通讯录成员"<<endl;
cout<<"4.修改通讯录成员"&cout<<"请输入成员ID,姓名,性别,电话号码,地址"<<endl;
DataType x;
cin>>x.ID>>>>x.ch>>x.phone>>x.addr;
Test.Add(x);
cout<<"添加成功!"<<endl;
cout<<"********************"<<endl;
{
DataType* p=Get(i);
*p=a;
}
void ContactBook::printList()
{
cout<<"您的通讯录成员如下:"<<endl;
cout<<"********************"<<endl;
Node* p=front->next;
while(p)
{
cout<<p->data.ID<<" "<<p-><<" "
{
Node* p=new Node;
p->data=a;
rear->next=p;
rear=p;
rear->next=NULL;
}
DataType* ContactBook::Get(int i)
{
Node* p=front;
while(p)
{
if(p->data.ID==i)
return &p->data;
rear->next=NULL;
}
时间复杂度=o(1)
2.2.3查找成员
伪代码:
1.初始化指针p指向头指针
2.循环直到匹配到ID或为p为空
3.找到则返回p的位置
4.找不到则返回空指针
代码实现:
DataType* ContactBook::Get(int i)
{
Node* p=front;
while(p)
4.保存q的数据
5.p指向q的下一节点
6.释放q节点
代码实现:
DataType ContactBook::Delete(int i)
{
Node* p=front;
while(p)
{
if(p->next->data.ID==i)break;
p=p->next;
}
Node* q=p->next;//q指针指向要删除的成员
{
if(p->data.ID==i)//ID匹配模式查找
return &p->data;//找到则返回p的地址
p=p->next;
}
return NULL;//找不到则返回空
}
时间复杂度=o(n)
2.2.4删除成员
伪代码:
1.初始化指针p指向头指针
2.循环匹配ID找到要删除的成员的前一个节点
3.初始化指针q指向要删除的成员
p=p->next;
}
return NULL;
}
DataType ContactBook::Delete(int i)