数据结构实践教程课程设计报告_第1页
数据结构实践教程课程设计报告_第2页
数据结构实践教程课程设计报告_第3页
数据结构实践教程课程设计报告_第4页
数据结构实践教程课程设计报告_第5页
已阅读5页,还剩135页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-PAGE . z数据构造实践教程目 录第一局部 根底篇-. z线性表学生成绩管理工程简介设计思路数据构造程序清单运行结果考试报名管理工程简介设计思路数据构造程序清单运行结果约瑟夫生者死者游戏工程简介设计思路数据构造程序清单运行结果约瑟夫双向生死游戏工程简介设计思路数据构造程序清单运行结果 栈和队列2.1 迷宫旅行游戏 工程简介 知识要点 设计思路 程序清单 运行结果2.2 八皇后问题 工程简介 知识要点 设计思路 程序清单 运行结果2.3 停车场的停车管理 工程简介 知识要点 设计思路 程序清单 运行结果串、数组和广义表3.1 单词检索统计程序 工程简介 设计思路 数据构造 程序清单 运行结

2、果3.2 Internet网络通路管理 工程简介 设计思路 数据构造 程序清单 运行结果树和二叉树4.1 家谱管理 工程简介 设计思路 数据构造 程序清单 运行结果4.2 表达式求值问题 工程简介 设计思路 数据构造 程序清单 运行结果4.4 图像压缩编码优化 工程简介 设计思路 数据构造 程序清单 运行结果图5.1 公交路线管理 工程简介 设计思路 数据构造 程序清单 运行结果5.2 导航最短路径查询 工程简介 设计思路 数据构造 程序清单 运行结果5.4 电网建立造价计算 工程简介 设计思路 数据构造 程序清单 运行结果5.4 软件工程进度规划 工程简介 设计思路 数据构造 程序清单 运行

3、结果-. z第二局部 综合篇-. z-PAGE . z1.1 景区旅游信息管理系统 工程需求 知识要点 设计流程 程序清单 运行测试第一局部 根底篇第一章 线性表线性表是数据构造中最简单、最常用的一种线性构造,也是学习数据构造全部容的根底,其掌握的好坏直接影响着后继知识的学习。本章通过四个模拟工程来学习线性表的顺序和链式存储构造,首先通过使用有关数组的操作实现学生成绩管理,其次通过使用有关线性链表的操作实现考试报名管理,然后通过使用循环链表的操作实现约瑟夫生者死者游戏。1.1 学生成绩管理 工程简介学生成绩管理是学校教务部门日常工作的重要组成局部,其处理信息量很大。本工程是对学生成绩管理的简单

4、模拟,用菜单项选择择方式完成以下功能:输入学生数据;输出学生数据;学生数据查询;添加学生数据;修改学生数据;删除学生数据。 设计思路本工程的实质是完成对学生成绩信息的建立、查找、插入、修改、删除等功能,可以首先定义工程的数据构造,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。 数据构造本工程的数据是一组学生的成绩信息,每条学生的成绩信息由*、和成绩组成,这组学生的成绩信息具有一样特性,属于同一数据对象,相邻数据元素之间存在序偶关系。由此可以看出,这些数据具有线性表中数据元素的性质,所以该系统的数据采用线性表来存储。顺序表是线性表的顺序存储构造,是

5、指用一组连续的存单元依次存放线性表的数据元素。在顺序存储构造下,逻辑关系相邻的两个元素在物理位置上也相邻,这是顺序表的特点。本工程可以采用顺序表的线性表顺序存储构造。假设一个数据元素仅占一个存储单元,则其存储方式参见图1-1。从图1-1中可见,第i个数据元素的地址为Loc(ai)=loc(a1)+(i-1)假设线性表中每个元素占用k个存储单元,则在顺序表中,线性表的第i个元素的存储位置与第1个元素的存储位置的关系是Loc(ai)=loc(a1)+(i-1)*k这里Loc(ai)是第i个元素的存储位置,loc(a1)是第1个元素的存储位置,也称为线性表的基址。显然,顺序表便于进展随机,故线性表的

6、顺序存储构造是一种随机存储构造。顺序表适宜于做查找这样的静态操作;顺序存储的优点是存储密度大,存储空间利用率高。缺点是插入或删除元素时不方便。由于C语言的数组类型也有随机存储的特点,一维数组的机表示就是顺序构造。因此,可用C语言的一维数组实现线性表的顺序存储。数组实现线性表的顺序存储的优点是可以随机存取表中任一元素O(1),存储空间使用紧凑;缺点是在插入,删除*一元素时,需要移动大量元素O(n),预先分配空间需按最大空间分配,利用不充分,表容量难以扩大。用构造体类型定义每个学生数据,故该数组中的每个数据的构造可描述为:typedef struct STUchar stuno10;/* char

7、 name10; /float score;/成绩 ElemType; 程序清单#include#include#include#include#define Ma*ListSize 20#define EQUAL 1typedef struct STU char stuno 10; char name 10;float score;ElemType;class Listprivate: /线性表的数组表示 ElemType elemMa*ListSize; int length; int Ma*Size; public: /输入学生数据 void init(List *L,int ms);

8、/删除所有学生数据 void DestroyList(List &L)free(&L); /将顺序表置为空表 void ClearList()length=0; /判断顺序表是否为空表 bool ListEmpty() return length=0; /判断顺序表是否为满 bool ListFull() return length=Ma*Size;/删除*个学生数据 bool ListDelete(int,ElemType &e); /遍历顺序表 void ListTraverse(); /返回顺序表的长度 int ListLength(); /学生数据查询 void GetElem(int

9、,ElemType *); /修改学生数据 bool UpdateList(ElemType& e,ElemType); /添加学生数据 bool ListInsert(int,ElemType &); /对学生数据按升序或降序输出 void printlist(int);void List:init(List *L,int ms)*L=(List *)malloc(sizeof(List); (*L)-length=0; (*L)-Ma*Size=ms;int List:ListLength()return length;bool List:ListDelete(int mark,ElemT

10、ype &e)int i,j; if(ListEmpty() return false; if(mark0) /删除表头元素 e=elem0; for(i=1; ilength; i+) elemi-1=elemi; else /删除表尾元素 if(mark0) e=elemlength-1; else /删除值为e的元素 for(i=0;i=length) return false;else e=elemi; for(j=i+1;jlength;j+)elemj-1=elemj; length-; return true;void List:ListTraverse()for(int i=0

11、;ilength;i+) coutsetw(8); coutsetw(10)elemi.stuno; coutsetw(9)elemi.age; coutsetw(8)elemi.scorename,e2-name) return false; if (strcmp(e1-stuno,e2-stuno) return false; if (e1-age!=e2-age) return false; if (e1-score!=e2-score) return false; return true;bool List:Less_EqualList(ElemType *e1,E

12、lemType *e2) if(strcmp(e1-name,e2-name)=0) return true; else return false;bool List:LocateElem(ElemType e,int type) int i; switch (type) case EQUAL:for(i=0;ilength;i+) if(EqualList(&elemi,&e) return true;break; default:break; return false;/修改学生数据bool List:UpdateList(ElemType& e,ElemType e1)for(int i

13、=0;ilength;i+) if(strcmp(,)=0) elemi=e1;return true;return false;bool List:ListInsert(int i,ElemType &e)ElemType *p,*q;if(ilength+1) return false;q=&elemi-1; for(p=&elemlength-1;p=q;-p)*(p+1)=*p; *q=e; +length; return true;/对学生成绩按升序或降序输出void List:printlist(int mark)int* b=new intlength; in

14、t i,k; cout * 成绩n; if(mark!=0) for(i=0; ilength;i+) bi=i; for(i=0; ilength;i+) k=i;for(int j=i+1;jlength;j+) if(mark=1&elembj.scoreelembk.score) k=j; if(mark=-1&elembk.scoreelembj.score) k=j;if(k!=i) int *=bi;bi=bk;bk=*; for(int i=0;ilength;i+)coutsetw(8); coutsetw(10)elembi.stuno; coutse

15、tw(9)elembi.age; coutsetw(8)elembi.scoreendl;else for(i=0;ilength;i+)coutsetw(8); coutsetw(10)elemi.stuno; coutsetw(9)elemi.age; coutsetw(8)elemi.scoreendl;void main() coutlinelist1m.cpp运行结果:n; ElemType e,e1,e2,e3,e4,e5,e6; List *La,*Lb,*Lc; int k; coutinit(&La,4); strcpy(,stu1); strcpy(e1

16、.stuno,100001); e1.age=22;e1.score=88; La-ListInsert(1,e1);strcpy(,stu2); strcpy(e2.stuno,100002);e2.age=21; e2.score=79; La-ListInsert(2,e2);strcpy(,stu3); strcpy(e3.stuno,100003);e3.age=19; e3.score=87; La-ListInsert(3,e3); La-printlist(0); cout表La长:ListLength()init(&Lb,4); strcpy(,zmofun); strcpy

17、(e4.stuno,100001); e4.age=20; e4.score=94; Lb-ListInsert(1,e4);strcpy(,bobjin); strcpy(e5.stuno,100002);e5.age=23; e5.score=69; Lb-ListInsert(2,e5);strcpy(,stu1); strcpy(e6.stuno,100001);e6.age=22; e6.score=88; Lb-ListInsert(3,e6); Lb-printlist(0); cout表Lb长:ListLength()ListDelete(-1,e6); if(k=0) cou

18、t删除失败!n; else cout删除成功!n; coutprintlist(0); cin.get(); coutprintlist(1);cin.get(); coutprintlist(-1);cin.get();运行结果首先建立学生信息管理,输出结果为:*成绩Stu110000180Stu210000291Stu310000356其次查询*为100002的学生的成绩,输出结果为:91再次调用插入函数,插入Stu4成功!输入结果为:*成绩Stu110000180Stu210000291Stu310000356Stu410000475最后删除Stu2成果!输出结果为:*成绩Stu1100

19、00180Stu310000356Stu410000475查询不及格的学生,输出结果为:Stu3100003561.2 考试报名管理 工程简介考试报名工作给各高校报名工作带来了新的挑战,给教务管理部门增加了很大的工作量,报名数据手工录入既费时又会不可防止地出现错误,同时也给不少学生以可乘之机。本工程是对考试报名管理的简单模拟,用菜单项选择择方式完成以下功能:输入考生信息;输出考生信息;查询考生信息;添加考生信息;修改考生信息;删除考生信息。 设计思路本工程的实质是完成对考生信息的建立、查找、插入、修改、删除等功能,可以首先定义工程的数据构造,然后将每个功能写成一个函数来完成对数据的操作,最后完

20、成主函数以验证各个函数功能并得出运行结果。 数据构造本工程的数据是一组考生信息,每条考生信息由号、性别、年龄、报考类别等信息组成,这组考生信息具有一样特性,属于同一数据对象,相邻数据元素之间存在序偶关系。由此可以看出,这些数据也具有线性表中数据元素的性质,所以该系统的数据可以采用线性表来存储。从上一节的例子中可见,线性表的顺序存储构造的特点是逻辑关系相邻的两个元素在物理位置上也相邻,因此可以随机存储表中任一元素,它的存储位置可用一个简单、直观的公式来表示。然而,从另一个方面来看,这个特点也铸成了这种存储构造的弱点:在做插入或删除操作时,需要移动大量元素。为克制这一缺点,我们引入另一种存储形式链

21、式存储。链式存储是线性表的另一种表示方法,由于它不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储构造的弱点,但同时也失去了顺序表可随机存取的特点。链式存储的优点是插入或删除元素时很方便,使用灵活。缺点是存储密度小,存储空间利用率低。事实上,链表插入、删除运算的快捷是以空间代价来换取时间。顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。假设线性表的长度变化不大,且其主要操作是查找,则采用顺序表;假设线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。本工程对考生数据主要进展插入、删除、修改等操作,所以采用链式存储构造比拟适合。用构造体类型定义每个考生

22、信息,故该单链表中的每个结点的构造可描述为:typedef struct e*amineechar e*amno10;/号 char name10; /char se*;float age;char e*amtype5;/成绩 ElemType; 程序清单/单链表的类定义linklist3.h#ifndef linklist3H#define linklist3H#define LEN 30/定义ElemType为inttypedef int ElemType;/单链表中结点的类型typedef struct LNode ElemType data;/值域 LNode *ne*t; /指针域L

23、Node;class LinkList LNode *head; public:/构造函数 LinkList();/析构函数 LinkList();/清空单链表 void ClearList();/求单链表长度 int ListSize();/检查单链表是否为空 bool ListEmpty();/返回单链表中指定序号的结点值 ElemType GetElem(int pos);/遍历单链表 void TraverseList(void f(ElemType &);/从单链表中查找元素 bool FindList(ElemType& item);/更新单链表中的给定元素 bool Update

24、List(const ElemType& item,ElemType e);/向单链表插入元素,mark=0插在表首,否则插在表尾 void InsertList(ElemType item,int mark);/从单链表中删除元素 , mark为要删除的第几个元素 bool DeleteList(ElemType& item,int mark);/对单链表进展有序排列 mark0升序,否则降序 void pailie(int mark=1);/对单链表进展有序输出,mark=0不排序,mark0升序,markne*t=NULL;LinkList:LinkList()/析构函数LNode *p

25、=head-ne*t ,*q; while(p) q=p-ne*t ; free(p); p=q; void LinkList:ClearList()/清空单链表LNode*p=head-ne*t ,*q; while(p) q=p-ne*t; free(p); p=q; head-ne*t =NULL;int LinkList:ListSize()/求单链表长度LNode*p=head-ne*t ; int i=0; while(p) i+; p=p-ne*t ; return i;bool LinkList:ListEmpty()/检查单链表是否为空return ListSize()=0;

26、/返回单链表中指定序号的结点值ElemType LinkList:GetElem(int pos)LNode*p=head-ne*t ; int i=1; while(p) if(i+=pos)return p-data ; p=p-ne*t ; return head-data ;void LinkList:TraverseList(void f(ElemType &)/遍历单链表LNode*p=head-ne*t ; while(p) f(p-data ); p=p-ne*t ;bool LinkList:FindList(ElemType& item)/从单链表中查找元素LNode*p=

27、head-ne*t ; while(p) if(p-data=item)return 1; p=p-ne*t ; return 0;/更新单链表中的给定元素bool LinkList:UpdateList(const ElemType &item,ElemType e)LNode*p=head-ne*t ; bool flag=0; while(p) if(p-data=item) p-data=e; flag=1; p=p-ne*t ; return flag;/向单链表插入元素void LinkList:InsertList(ElemType item,int mark)LNode *q=

28、 new LNode; q-data = item; if(mark=0) q-ne*t = head-ne*t ; head-ne*t=q; return; LNode *p=head; while(p-ne*t) p=p-ne*t ; q-ne*t =NULL; p-ne*t =q;/从单链表中删除元素bool LinkList:DeleteList(ElemType& item,int mark)if(ListEmpty()|markListSize()return 0; LNode *p=head,*q; for(int i=0;ine*t; item=p-ne*t-data; q=p

29、-ne*t-ne*t ; free(p-ne*t ); p-ne*t=q; return 1;/对单链表进展有序排列mark0升序,否则降序void LinkList:pailie(int mark)ElemType aLEN+1; LNode *p=head-ne*t; int k ; for(k=1;p!=NULL;k+,p=p-ne*t ) ak=p-data;k-; for(int i=1;ik;i+) for(int j=1;j0&ajaj+1|mark0&ajne*t; for(int j=1;jne*t ) p-data=aj;/对单链表进展有序输出void LinkList:O

30、rderOutputList(int mark)ElemType aLEN+1; LNode *p=head-ne*t; int k ; for( k=1;p!=NULL;k+,p=p-ne*t ) ak=p-data; k-; for(int i=1;ik;i+)for(int j=1;j0&ajaj+1|mark0&ajaj+1)t=aj+1; aj+1=aj; aj=t;for(int j=1;j=k;j+)coutaj ;#include#include#include/#include#includelinklist3.cppvoid ff(int &a)/用于遍历的函数couta

31、;void main()coutnlinklist3m.cpp运行结果:n; int init_size,seed,*u; cout首先请构造单链表list; coutinit_size; seed=150; cout*u;coutn单链表list构造成功!n它是:; list.TraverseList(ff); coutn它为空吗(1:是;0:不是):list.ListEmpty(); coutn长度为:list.ListSize() ; int i; coutn请输入你想得到第几个元素的值(1-init_sizei; cout单链表list中第i的值是list.GetElem(i); in

32、t it; coutn请输入你想删除第几个元素的值(1-init_sizei; list.DeleteList(it,i); coutn单链表list删除第i个元素it后变为:; list.TraverseList(ff);/对单链表list每个数进展遍历. int news,olds; coutolds; coutnews; list.UpdateList(olds,news); coutn修改后单链表list变为:; list.TraverseList(ff); coutn下面请构造单链表list2; coutinit_size; seed=120; cout*u;coutn按回车键完毕.

33、; cin.get();cin.get(); 运行结果1.3 约瑟夫生者死者游戏 工程简介约瑟夫生者死者游戏的大意是:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种方法,并议定30个人围成一圈,由第一个人开场,依次报数,数到第9人,便把他投入大海中,然后从他的下一个人数起,数到第9人,再将他投入大海,如此循环,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。 设计思路本游戏的数学建模如下:假设n个旅客排成一个环形,依次顺序编号1,2,n。从*个指定的第1号开场,沿环计数,每数到第m个

34、人就让其出列,且从下一个人开场重新计数,继续进展下去。这个过程一直进展到剩下k个旅客为止。本游戏的要求用户输入的容包括: 1. 旅客的个数,也就是n的值; 2. 离开旅客的间隔数,也就是m的值;3. 所有旅客的序号作为一组数据要求存放在*种数据构造中。本游戏要求输出的容是包括1. 离开旅客的序号; 2. 剩余旅客的序号; 所以,根据上面的模型分析及输入输出参数分析,可以定义一种数据构造后进展算法实现。 数据构造为了解决这一问题,可以用长度为30的数组作为线性存储构造,并把该数组看成是一个首尾相接的环形构造,则每投入大海一个乘客,就要在该数组的相应位置做一个删除标记,该单元以后就不再作为计数单元

35、。这样做不仅算法较为复杂,而且效率低,还要移动大量的元素。用单循环链表解决这一问题,实现的方法相对要简单得多。首先要定义链表结点,单循环链表的结点构造与一般的结点构造完全一样,只是数据域用一个整数来表示位置;然后将它们组成具有30个结点的单循环链表。接下来从位置为1的结点开场数,数到第8个结点,就将下一个结点从循环链表中删去,然后再从删去结点的下一个结点开场数起,数到第8个结点,再将其下一个结点删去,如此进展下去,直到剩下15个结点为止。为了不失一般性,将30改为一个任意输入的正整数n,而报数上限原为9也为一个任选的正整数k。这样该算法描述如下:(1) 创立含有n个结点的单循环链表;(2) 生

36、着与死者的选择:p指向链表的第一个结点,初始i置为1;while(idata;i自增1;(3) 输出所有生者的位置。 程序清单LinkList InitRing(int n, LinkList R) /尾插入法建立单循环链表函数ListNode *p, *q;int I;R=q=(LinkNode *)malloc(sizeof(LinkNode);for(i=1;idata=i;q-ne*t=p;q=p;p-data=n;p-ne*t=R;R=p;return R;LinkList DeleteDeath(int n, int k, LinkList R) /生者与死者的选择int i, j

37、;ListNode *p, *q;p=R;for(i=1; in/2; i+)/删除一半结点for(j=1; jne*t;q=p-ne*t;p-ne*t=q-ne*t;printf(%4d, q-data);free(q);R=p; return R;void OutRing(int n, LinkList R) /输出所有生者int i;LinkNode *p;p=R;for(i=1;ine*t)printf(%4d, p-data)有了上述算法分析和设计之后,实现就比拟简单了。首先要定义一个链表构造类型,然后编写一个主函数调用上面已定义好的函数即可。主函数的源程序如下:#include#i

38、ncludetypedef struct nodeint data;struct node * ne*t;ListNode;typedef ListNode * LinkList;void main()LinkList R;int n,k;LinkList InitRing(int n, LinkList R);LinkList DeleteDeath(int n, int k, LinkList R);void OutRing(int n, LinkList R);printf(总人数n. 报数上限k=);scanf(%d%d,&n, &k);R=InitRing(n, R);R=Delet

39、eDeath(n, k, R);OutRing(n, R); 运行结果编译运行上述程序,提示:总人数n. 报数上限k=输入30和9后并回车可得出如下结果:9 18 27 6 16 26 7 19 30 12 24 8 22 5 23 21 25 28 29 1 2 3 4 10 11 13 14 15 17 201.4约瑟夫双向生死游戏 工程简介约瑟夫双向生死游戏是在约瑟夫生者死者游戏的根底上,正向计数后反向计数,然后再正向计数。具体描述如下:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种方

40、法,并议定30个人围成一圈,由第一个人开场,顺时针依次报数,数到第9人,便把他投入大海中,然后从他的下一个人数起,逆时针数到第5人,将他投入大海,然后从他逆时针的下一个人数起,顺时针数到第9人,再将他投入大海,如此循环,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。 设计思路本游戏的数学建模如下:假设n个旅客排成一个环形,依次顺序编号1,2,n。从*个指定的第1号开场,沿环计数,数到第m个人就让其出列,然后从第m+1个人反向计数到m-k+1个人,让其出列,然后从m-k个人开场重新正向沿环计数,再数m个人后让其出列,然后再反向数k 个人后让其出列。这个过程一直进展到剩下q个旅客为止。本

41、游戏的要求用户输入的容包括: 1. 旅客的个数,也就是n的值; 2. 正向离开旅客的间隔数,也就是m的值;3. 反向离开旅客的间隔数,也就是k的值;4. 所有旅客的序号作为一组数据要求存放在*种数据构造中。本游戏要求输出的容是包括1. 离开旅客的序号; 2. 剩余旅客的序号; 所以,根据上面的模型分析及输入输出参数分析,可以定义一种数据构造后进展算法实现。 数据构造约瑟夫双向生死游戏如果用单循环链表作为线性存储构造,就只能正向计数结点,反向计数比拟困难,算法较为复杂,而且效率低。用双向循环链表解决这一问题,实现的方法相对要简单得多。为了不失一般性,将30改为一个任意输入的正整数n,而正向报数上

42、限原为9也为一个任选的正整数m,正向报数上限原为5也为一个任选的正整数k,。这样该算法描述如下:(1) 创立含有n个结点的双向循环链表;(2) 生着与死者的选择:p指向链表的第一个结点,初始i置为1;while(idata;i自增1;从p指向的结点沿链后退k-1步;删除第k个结点q所指向的结点;p指向q的上一个结点;输出其位置q-data;i自增1;(3) 输出所有生者的位置。 程序清单/双向循环链表的类定义dcirlinkl.htypedef int ElemType;/双向链表结点的类型定义typedef struct DuLNode ElemType data; struct DuLNo

43、de *prior;/左指针 struct DuLNode *ne*t;/右指针DuLNode;#define LEN 20class DuLinkListprivate: DuLNode *head;/指向表头的指针 DuLNode *curr;/当前结点指针 int count;/ 双向循环链表的结点个数 public:/构造函数 DuLinkList();/析构函数 DuLinkList()delete head;/创立有序或无序的带头结点的双向循环链表 DuLNode *CreateCLinkL(int,int,int mark=0);/清空单循环链表 void ClearCList(

44、);/求双向循环链表长度 int CListSize();/检查双向循环链表是否为空 bool CListEmpty();/返回指向第pos个结点的指针 DuLNode *Inde*(int pos);/返回双向循环链表中指定序号的结点值 ElemType GetElem(int pos);/遍历双向循环链表 void TraverseCList();/当前指针curr指向pos结点并返回curr DuLNode *Reset(int pos=0);/当前指针curr指向下一结点并返回 DuLNode *Ne*t();/当前指针curr指向上一结点并返回 DuLNode *Prior();/

45、判双向循环链表当前指针curr=head 否 bool EndOCList();/判双向循环链表当前指针curr-ne*t是否到达表尾 bool EndCList();/判双向循环链表当前指针curr-prior是否到达表尾 bool PEndCList();/删除curr-ne*t所指结点,并返回所删结点的data ElemType DeleteNt();/从双向循环链表中查找元素 bool FindCList(ElemType& item);/更新双向循环链表中的给定元素 bool UpdateCList(const ElemType &item,ElemType &e);/向链表中第po

46、s个结点前插入域值为item的新结点 void InsertCLfront(const ElemType& item,int pos);/向链表中第pos个结点后插入域值为item的新结点 void InsertCLafter(const ElemType& item,int pos);/从链表中删除第pos个结点并返回被删结点的data ElemType DeleteCList(int pos);/双向循环链表的实现dcirlinkl.cpp#include#include#includedcirlinkl.h/构造函数DuLinkList:DuLinkList()head=new DuLN

47、ode; head-prior=head; head-ne*t=head; curr=NULL; count=0;/创立有序或无序的带头结点的双向循环链表DuLNode *DuLinkList:CreateCLinkL(int n,int m,int mark)ElemType *,aLEN; srand(m); for(int i=0;in;i+) ai=rand()%100; for(i=0;in-1;i+) int k=i; for(int j=i+1;jaj) k=j; if(k!=i) *=ak;ak=ai;ai=*; DuLNode *p; head=new DuLNode; he

48、ad-prior=NULL; head-ne*t=curr=p=new DuLNode; curr-prior=head; for(i=0;idata=ai;/升序 else if(mark=-1) p-data=an-1-i;/降序 else p-data=rand()%100;/无序 if(ine*t=new DuLNode; curr-prior=p;p=curr; count+; head-prior=curr; curr-ne*t=head; return head;/清空双向循环链表void DuLinkList:ClearCList()DuLNode *cp,*np; cp=he

49、ad-ne*t; while(cp!=head) np=cp-ne*t;delete cp;cp=np; head=NULL;/求双向循环链表长度int DuLinkList:CListSize()DuLNode* p=head-ne*t; int i=0; while(p!=head) i+;p=p-ne*t; return i;/检查双向循环链表是否为空bool DuLinkList:CListEmpty()return head-ne*t=head;/返回指向第pos个结点的指针DuLNode *DuLinkList:Inde*(int pos)if(pos1) cerrpos is o

50、ut range!ne*t; int i=0; while(p!=head) i+; if(i=pos) break; p=p-ne*t; if(p!=head) return p; else cerrpos is out range!endl; return NULL;/返回双向循环链表中指定序号的结点值ElemType DuLinkList:GetElem(int pos)if(pos1) cerrpos is out range!ne*t; int i=0; while(p!=head) i+; if(i=pos) break; p=p-ne*t; if(p!=head) return

51、p-data; else cerrpos is out range!ne*t; while(p!=head) coutsetw(4)data; p=p-ne*t; coutne*t; int i=-1; while(p!=head) i+; if(i=pos) break; p=p-ne*t;curr=curr-ne*t; return curr;/当前指针curr指向下一结点并返回DuLNode *DuLinkList:Ne*t()curr=curr-ne*t; return curr; /当前指针curr指向上一结点并返回DuLNode *DuLinkList:Prior()curr=cu

52、rr-prior; return curr;/ 判双向循环链表当前指针curr=head 否bool DuLinkList:EndOCList()return curr=head;/判双向循环链表当前指针curr-ne*t是否到达表尾bool DuLinkList:EndCList()return curr-ne*t=head;/判双向循环链表当前指针curr-prior是否到达表尾bool DuLinkList:PEndCList()return curr-prior=head;/删除curr-ne*t所指结点,并返回所删结点的dataElemType DuLinkList:DeleteNt

53、()DuLNode *p=curr-ne*t; curr-ne*t=p-ne*t; curr-ne*t-ne*t-prior=p-prior; ElemType data=p-data; delete p; count-; return data;/从双向循环链表中查找元素bool DuLinkList:FindCList(ElemType& item)DuLNode* p=head-ne*t; while(p!=head) if(p-data=item) item=p-data;return true; else p=p-ne*t; return false;/更新双向循环链表中的给定元素b

54、ool DuLinkList:UpdateCList(const ElemType &item,ElemType &e)DuLNode* p=head-ne*t; while(p!=head) /查找元素 if(p-data=item) break; else p=p-ne*t; if(p=head) return false; else /更新元素 p-data=e;return true;/向链表中第pos个结点前插入域值为item的新结点void DuLinkList:InsertCLfront(const ElemType& item,int pos)DuLNode *newP=new

55、 DuLNode; newP-data=item; DuLNode* p=head-ne*t; int i=0; while(p!=head) i+; if(i=pos) break; p=p-ne*t; newP-prior=p-prior; p-prior-ne*t=newP; newP-ne*t=p; p-prior=newP; count+;/向链表中第pos个结点后插入域值为item的新结点void DuLinkList:InsertCLafter(const ElemType& item,int pos)DuLNode *newP=new DuLNode; newP-data=it

56、em; DuLNode* p=head-ne*t; int i=-1; while(p!=head) i+; if(i=pos) break; p=p-ne*t; newP-prior=p-prior; p-prior-ne*t=newP; newP-ne*t=p; p-prior=newP; count+;/从链表中删除第pos个结点并返回被删结点的dataElemType DuLinkList:DeleteCList(int pos)if(pos1) cerrpos is out range!ne*t; ElemType data; int i=0; while(p!=head) i+;

57、if(i=pos) break; p=p-ne*t; if(p!=head) data=p-data; p-prior-ne*t=p-ne*t; p-ne*t-prior=p-prior; delete p;count-;return data; else return pos; /双向循环链表的测试与应用dcirlinklm.cpp#include#include dcirlinkl.cppvoid main()coutdcirlinklm.cpp运行结果:n; int m=150,i,n=10,*,it; DuLinkList p,t,q,mylink; p.CreateCLinkL(n,

58、m,1); if(p.CListEmpty() cout双向循环链表p空!n; else cout双向循环链表p非空!n; cout双向循环链表p(升序):n; p.TraverseCList(); if(p.CListEmpty() cout双向循环链表p空!n; else cout双向循环链表p非空!n; if(p.EndCList() cout双向循环链表p满!n; else cout双向循环链表p非满!n; cout双向循环链表t(无序):n; t.CreateCLinkL(n-2,m); t.TraverseCList(); cout双向循环链表t的长度:t.CListSize()e

59、ndl; cout双向循环链表q(降序):n; q.CreateCLinkL(n,m,-1); q.TraverseCList(); cout双向循环链表q的长度:q.CListSize()endl; cout链表q的第1个元素:q.GetElem(1)endl; cout链表q的第1个元素地址:q.Inde*(1)endl; cout链表q的第5个元素:q.GetElem(5)endl; cout链表q的第5个元素地址:q.Inde*(5)endl; cout链表q的第10个元素:q.GetElem(10)endl; cout链表q的第10个元素地址:q.Inde*(10)endl; cou

60、tne*t所指元素地址:q.Ne*t()endl; *=65;it=66; if(q.FindCList(*) cout*查找成功!n; else cout*查找不成功!n; if(q.UpdateCList(*,it) cout*更新成功!n; else cout*更新不成功!n; cout更新后双向循环链表q:n; q.TraverseCList(); cout插入后双向循环链表q:n; it=100;q.InsertCLfront(it,1); q.TraverseCList(); cout插入后双向循环链表q:n; it=101;q.InsertCLfront(it,5); q.Tra

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论