1、数据结构课程设计 (数据结构课程设计 (一、设计目的1.1问题描述:任意给定一个M进制的数x,请实现如下要求:、对给字一个M进制的数据x,求出此数x的10进制值(用MD表示);、实现对x向任意的一个非M进制的数的转换;1.2问题分析:、用串实现该问题:m,n,x是定义的全局变量;Loop循环是实现M进制数转换为10进制;trans()是实现10进制数转换为n进制数的函数;(4)voidmain()是主函数,功能是给出测试的数据,并在特定条件下调用trans()函数。、用栈实现该问题:SeqStack定义栈,top为栈顶指针;intInitStack(SqStack&S)到voidClearSt
2、ack(SqStack&S)六大模块分别表示构造一个空栈、判断栈是否为空、判断栈是否为满、进栈、出栈、摧毁栈;SeqStackS是指定义栈S;for()循环和while()循环的功能是将M进制数转换成10进制数;do.while实现输入转换合理的进制,第二个while()是把之前转换的10进制值压入栈,第三个while()循环是转换后的出栈输出;voidmain()是主函数。其功能是输入需要测试的数据以及需要转换的进制,实现M进制数向任意非M进制数的转换。二、设计过程2.1方案确定:在数组和栈实现时,利用for()循环和while()循环以及调用进制间的转换函数和输出函数,使M进制先转换成十进
3、制在转换成非M进制。2.2程序设计模块设计连接图需要转换M进制数模块串实现模块栈实现模块10进制值输出模块10进制值输出模块非M进制转换模块1非M进制转换模块22.3重点模块功能描述:1.串实现模块:把M进制数x存入串中。2.栈实现模块:把M进制数x存入栈中。3.非M进制转换模块1,运用串实现转换。4.非M进制转换模块2,运用栈实现转换。2.4方法设计:程序运用串和栈实现数组之间的转换。把M进制的数x的各位分别存入串和链栈中,运用数组的读入读出和栈的出栈和入栈算法,让程序更加人性化的实现任意数制之间的转换,在运用函数调用模块的连接,输出转换成10进制的值和非M进制的值。2.5程序流程图开始串栈
4、输入需要转换的进制和数10进制值输出输入要转换到的进制N转换后输出串转换:#include#include/输入十进制数N和转化的进制数Mvoidtrans(intn,intm)charstr100;inti;for(i=0;n0;i+)if(n%m0;n-)printf(%c,strn-1);voidmain()intm,n,x;charch;printf(geidingjingzhiM-);scanf(%d,&m);loop:printf(geidingyige%djinzhideshuX-,m);fflush(stdin);/一个M进制的数X转10进制for(x=0;)ch=getcha
5、r();if(ch=0&ch=a&ch=A&ch=m)gotoloop;x=x*m+n;printf(zhuanhuacheng10jinzhideshuwei-%dn,x);printf(geidingyaozhuanhuachengdejinzhiN-);scanf(%d,&m);printf(zhuanhuacheng%djinzhihoudejieguo-,m);trans(x,m);printf(n);栈转换:#include#include#defineStack_Size20typedefintElemType;/顺序栈存储类型typedefstructElemTypeelemS
6、tack_Size;inttop;SeqStack;/初始化:为未初始化的顺序栈S设置栈顶指针voidInitStack(SeqStack*S)S-top=-1;printf(kongzhanS=()n);/判空栈:判断栈S是否为空栈intIsEmpty(SeqStack*S)if(S-top=-1)return1;elsereturn0;/判栈满:判断栈S是否为满栈intIsFull(SeqStack*S)if(S-top=Stack_Size-1)return1;elsereturn0;/进栈:向S栈顶压入一个数据元素intPush(SeqStack*S,ElemTypex)if(IsFu
7、ll(S)return0;S-top+;S-elemS-top=x;return1;/出栈:弹出S的栈顶元素,并用x返回intPop(SeqStack*S,ElemType*x)if(IsEmpty(S)return0;*x=S-elemS-top;S-top-;return1;/销毁栈SvoidClearStack(SeqStack*S)free(S);printf(zhanxiaohuin);voidmain()charx20;intMx;intM;intm;intX=0;intt;inti,length;SeqStack*S=(SeqStack*)malloc(sizeof(SeqSta
8、ck);InitStack(S);printf(qingshurujinzhiheshu:);scanf(%d,%s,&Mx,x);t=1;length=strlen(x);for(i=0;i=a&xi=10)printf(%c,a+m-10);elseprintf(%d,m);printf(n);ClearStack(S);三、运行结果1、2进制的111的10进制值,转换成3进制的测试情况如下(栈实现):2、7进制的236的10进制值,转换成9进制的测试情况如下(串实现):四、总结与展望在这次课程设计中使我们明白在碰到一个大的程序,不知道该如何下手时,只有找多方面的资料,加强思考能力。做这次
9、数制转换的课程设计是我知道了只有在细节方面需要熟练运用栈、数组、串,这样才可以。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了数据结构的方便和巧妙。数据结构课程设计实验报告目录1.单位员工通讯录管理系统(线性表的应用)*22.停车场管理(栈和队列的应用)*43.哈夫曼编码/译码系统(树应用)*64.教学计划编制问题(图的应用)*85.药店的药品销售统计系统(排序应用*116.
10、最小生成树问题(*)*137总结*158源代码*1、单位员工通讯录管理系统(线性表的应用)需求分析为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。问题分析为建立单位员工通讯录系统,首先要实现员工信息的录入、保存等基本操作。对于员工通讯录我们要存入要求的员工的各种信息等,对于已经保存的信息,我们要可以对这些信息进行查询、修改、插入新信息、删除信息、还有可以直接输出整个所有员工信息等。而这些操作对于我们来说都是对建立的链表的基本操作,对于本次试验我采用单向线性链表
11、。算法设计首先我们要进行最基本的操作,即建立链表。链表的节点信息保存的有员工编号、员工姓名、办公室电话号码、手机号码、员工邮箱这些信息。而链表的结点信息保存的有员工信息以及其指针域。然后我们可以添加员工信息,对于新的员工信息我们将其添加在链表的表尾,在添加之前我们要进行一项操作,即遍历链表找到其尾指针,然后开辟一个结点并将其加到链尾。我们还可以进行员工信息的查询操作,在进行查询时我们首先要遍历链表,然后在遍历的同时与关键字进行比较从而找到员工信息并输出。员工信息删除操作,此操作首先要找到要删除的员工信息,然后将此节点的前一节点的后续指针直接指向要删除的结点的后续指针,并且释放要删除的结点空间即
12、可。员工信息修改,首先找到要修改的员工,然后输入要修改的员工信息,将输入信息直接覆盖在原有信息上即可。员工信息输出,遍历整个链表并输出。流程图如下:1.2.3.4.5.员工信息查询员工信息插入员工信息修改员工信息删除员工信息输出2开始建立员工信息链表中项结束所有操作或者返回重新选择操作1.2.3.4.5调试分析及测试数据员工信息插入:员工信息查询:员工信息删除:员工信息修改:2、停车场管理(栈和队列的应用)需求分析设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若
13、车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。问题分析停车场停车系统,首先来的车辆要进入停车厂或者进入便道。当停车场车辆未满时直接将车停入停车场。当停车场车辆停满时,则此时进入的车辆应该进入便道。然后等待停车场中的车辆离去,离去一辆车则便道中的车辆进入停车场。算法设计此算法用到了栈和队列,在栈中保存停车场车辆,在队列
14、中保存便道中车辆,本实验要定义一个队列两个栈,其中一个栈可以辅助停车场中的车辆离开,即离开一辆车时,在此车前面的车依次进入辅助栈,离开后这些车辆再进入停车栈,然后判断队列中是否有车,如果有则将便道队列中的车辆移进停车厂。否则不进行操作。本实验主要运用的就是对栈和队列的基本操作。流程图如下:调试分析及测试数据结束1.进车2.出车初始化栈和队列可以反复选择进行重复操作开始3、哈夫曼编码/译码系统(树应用)需求分析利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收
15、后将传来的数据进行译码,即将信息还原成发送前的字符信息。问题分析在本例中设置发送者和接受者两个功能,发送者的功能包括:输入待传送的字符信息;统计字符信息中出现的字符种类数和各字符出现的次数(频率);根据字符的种类数和各自出现的次数建立哈夫曼树;利用以上哈夫曼树求出各字符的哈夫曼编码;将字符信息转换成对应的编码信息进行传送。接受者的功能包括:接收发送者传送来的编码信息;利用上述哈夫曼树对编码信息进行翻译,即将编码信息还原成发送前的字符信息。从以上分析可发现,在本例中的主要算法有三个:(1)哈夫曼树的建立;(2)哈夫曼编码的生成;(3)对编码信息的翻译。本实验首先从文件中读取数据,然后分析数据,对
16、不同的元素依次存入一字符数组并统计其出现的次数并当做其权值,然后根据这些信息建立哈弗曼树,并对各个字符进行哈弗曼编码,然后根据各个字符的编码对所有输入的一组字符进行哈弗曼编码。译码是根据哈弗曼树和接收到的一组编码进行译码操作。译码也就是对哈弗曼树的遍历。算法设计首先读入一组字符,然后统计这些字符中不同字符出现的次数,并当做其权值,然后根据不同字符及其权值建立哈弗曼树。建立哈弗曼树后即可得到这些不同字符的哈弗曼编码,然后即可根据这些哈弗曼编码对那组输入的一串字符进行哈弗曼编码。译码是根据一组编码翻译成一组字符的操作,其算法就是根据这一串编码来对哈弗曼树进行遍历,每遍历到一个叶子结点即输出一个字符
17、,直至将编码操作完即可完成多编码的翻译操作。调试分析及测试数据4、教学计划编制问题(图的应用)需求分析大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。1、输入参数应包括:学期总数,一学期的学分上限,每门课的课程号(可以是固定占3位的字母数字串)、学分和直接先修课的课程号。2、应允许用户指定下列两种编排策略之一:一是使学生在各学期中的学
18、习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。3、若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。计划的表格格式可以自己设计。4、可设学期总数不超过12,课程总数不超过100。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。问题分析编制教学计划,当然涉及到的课程都要给学完。所以我们可以将所以的课程编制成一张图,然后遍历图。由于课程有前续后继的关系,所以用AOV网是最合适。对AOV网进行拓扑排序即可以得出结果。对AOV网进行拓扑排序有两种情况:广度优先和深度优先。在进行深度优先周游时,我们要考虑到一种情况。例如:高等数学和C语言编程是并列
19、的两门学科,他们之间没有前续后继的关系,可以同时进行学习。高等数学是数值分析和电子电路的基础课程,电子电路又是模拟电子电路的基础课程。C语言编程是数据结构的基础课程,数据结构是算法设计与分析的基础课程。如果按照深度优先周游的话就有可能将上面几门课程排成:C语言程序设计,数据结构,算法设计与分析,高等数学,电子电路,模拟电子电路。这样的教学计划很明显不符合实际教学的需要。因此我们应该进行广度优先周游,将高等数学和C语言程序设计先学,再学其他后继课程。算法设计首先确定学期数和每学期的学分总数上限,不能一学期将很多课全部学完。然后根据输入的计划课程树和输入的拓扑排序所形成的课程先修关系建立拓扑图。有
20、向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR。调试分析及测试数据5、药店的药品销售统计系统(排序应用)需求分析设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。问题分析在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排
21、序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。算法设计首先从txt文件中读取数据信息并保存,本次试验采用了5中排序方法。其中编号排序是按照基数排序,采用多关键字进行排序。基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。对单价的排序采用了直接插入排序和冒泡排序,直接插入排序就是首先将第一个元素看成是一个有序的,然后第二个元素和第一个比较,若大于第一个则放在其后面否则放前面,依次直至最后一个。冒泡排序就是采用两个循环,即将第一个元素和第二个比较若第一个大于第二个则交换,
22、否则不变,然后第二个和第三个比较,同上。第一趟可将最大的一个放在最后,依次可得排序。销售量是快速排序,快速排序就是首先设置一个关键字,然后让最后一个和其比较,直至找到一个比关键字小的,然后和其交换,接下来让第一个和其比较,直至找到一个比其大的,然后交换,在找到的位置分别做标记,依次执行即可。销售额使用的是堆排序,堆排序首先要建立一个完全二叉树的堆,其标准符合为父节点始终比子节点大。然后依次输出顶结点,然后在建立一个符合标准的堆重复操作即可。调试分析及测试数据6、最小生成树问题(*)【需求分析】若要在n个城市之间建设通信网络,只需要假设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个
23、网的最小生成树问题。问题分析利用克鲁斯卡尔算法求网的最小生成树。利用普里姆算法求网的最小生成树。要求输出各条边及它们的权值。通信线路一旦建成,必然是双向的。因此,构造最小生成树的网一定是无向网。设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可利用C语言提供的随机函数产生。图的存储结构的选取应和所作操作相适应。为了便于选择权值最小的边,此题的存储结构既不选用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组表示图。算法设计Kruskal算法要选择n-1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意
24、到所选取的边若产生环路则不可能形成一棵生成树。Kruskal算法分e步,其中e是网络中边的数目。按耗费递增的顺序来考虑这e条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。Prim首先任意选取一个顶点放入到最小生成树中去,然后分别在最小生成树的内外各选取一个定点顶点,要求这两个顶点之间的权重是最小的。然后将最小生成树外的这个顶点加入到最小生成树中去,而这条边就做为最小生成树的一条边。重复以上操作,最后将顶点全部包含在最小生成树之中为止调试分析及测试数据总结做了两个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅,我突然发现写程
25、序还挺有意思的。由于上学期的C+语言跟这学期的数据结构都算不上真正的懂,对于书上的稍微难点的知识就是是而非的,所以我只是对老师的程序理解,我也试着去改变了一些变量,自己也尽量多的去理解老师做程序的思路。当我第一天坐在那里的时候,我就不知道该做些什么,后来我只有下来自己看了一遍书来熟悉下以前学过的知识。通过这次的程序设计,发现一个程序设计就是算法与数据结构的结合体,自己也开始对程序产生了前所未有的兴趣,以前偷工减料的学习也不可能一下子写出一个程序出来,于是我就认真看老师写的程序,发现我们看懂了一个程序其实不难,难的是对于一个程序的思想的理解,我们要掌握一个算法,不仅仅限于读懂,主要的是要理解老师
26、的思路,学习老师的解决问题的方法。这次试验中,我发现书本上的知识是一个基础,但是我基础都没掌握,更别说写出一个整整的程序了。自己在写程序的时候,也发现自己的知识太少了,特别是基础知识很多都是模模糊糊的一个概念,没有落实到真正的程序,所以自己写的时候也感到万分痛苦,基本上涉及一个知识我就会去看看书,对于书本上的知识没掌握好。在饭后闲暇时间我也总结了一下,自己以前上课也认真的听了,但是还是写不出来,这主要归结于自己的练习太少了,而且也总是半懂就不管了。在改写老师的程序中也出现了很多的问题,不断的修改就是不断的学习过程,当我们全身心的投入其中时,实际上是一件很有乐趣的事情。对于以后的学习有了几点总结
27、:第一、熟记各种数据结构类型,定义、特点、基本运算(分开点一点也没多少东西,难度不大,但是基本);第二、各种常用的排序算法,如冒泡排序、堆排序,这些是必考的内容,分数不会少于20%;第三,多做习题,看题型,针对题型来有选择复习;数据结构看上去很复杂,但你静下心来把书扫上几遍,分解各个知识点,这一下来,学数据结构的思路就会很清晰了。1.#include#includeusingnamespacestd;typedefstruct/*员工通讯信息的结构类型定义*/charnum20;/*员工编号*/charname20;/*员工姓名*/charphone20;/*办公室电话号码*/charcall
28、20;/*手机号码*/charemail20;/员工邮箱DataType;/*通讯录单链表的结点类型*/typedefstructnodeDataTypedata;/*结点的数据域*/structnode*next;/*结点的指针域*/ListNode,*LinkList;LinkListlist=newListNode;voidchushihua(LinkListlist)ListNode*p=newListNode;strcpy(p-data.call,15011111111);strcpy(p-data.email,1);strcpy(p-data.name,lvdezhou);strc
29、py(p-data.num,201*1);strcpy(p-data.phone,1314111);list-next=p;p-next=NULL;voaa=list-next;coutbh;doif(!(strcmp(bh,aa-data.num)coutwhile(aa-next!=NULL,aa=aa-next);voidyuangongxinxicharu(LinkListlist)ListNode*w;w=list-next;while(w-next!=NULL)w=w-next;ListNode*u=newListNode;u-next=NULL;coutu-data.call;c
30、outu-data.email;coutu-data.name;coutu-data.num;coutu-data.phone;w-next=u;w=w-next;voidshanchu(LinkListlist)ListNode*cz1;ListNode*cz2;ListNode*cz3;cz1=list;cz2=list;ints=0;charchax20;coutchax;while(strcmp(chax,cz1-data.num)s+;cz1=cz1-next;for(intj=0;jnext;cz3=cz2-next;cz2-next=cz3-next;voidxiugai(Lin
31、kListlist)ListNode*xiug;ListNode*zans;zans=list-next;coutbh;doif(!(strcmp(bh,zans-data.num)xiug=newListNode;coutvoidjiemian(LinkListlist)intxuhao=0;coutcoutchu;S.top-;while(strcmp(S.top-name,chu)*(q.top)=*(S.top);q.top+;S.top-;coutSqStackq;/备用栈,用来辅助车的进出/便道用队列进行操作,假设停车每天不超过辆HTNode,*HuffmanTree;Huffma
32、nTreep;inti;typedefchar*HuffmanCode;voidtongji(char*d1,intfor(p=HT+1,i=1;irchild=0;p-weight=*w;for(;ilchild=p-parent=p-rchild=0;p-weight=0;for(i=n+1;iif(HTt.parent=0&t!=s1)s2=t;break;for(t=t+1;tHTt.weight&HTt.parent=0&t!=s1)s2=t;HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1
33、.weight+HTs2.weight;HC=newchar*n+1;char*cd=newcharn;cdn-1=0;intstart,c,f;for(i=1;iHuffmanCoding(HT,HC,w,n,d);cout/*图的邻接表存储的基本操作*/intLocateVex(ALGraphG,VertexTypeu)/*初始条件:图G存在,u和G中顶点有相同特征*/*操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1*/inti;for(i=0;ip=G.verticesi.firstarc;while(p)printf(%s%s,G.verticesi.data,G.v
34、erticesp-adjvex.data);#defineSTACK_INIT_SIZE10/*存储空间初始分配量*/#defineSTACKINCREMENT2/*存储空间分配增量*/typedefstructSqStackvoidClearStack(SqStack*S)/清空栈的操作S-top=S-base;StatusStackEmpty(SqStackS)p=p-nextarc;printf(n);voidFindInDegree(ALGraphG,intindegree)/*求顶点的入度,算法调用*/inti;ArcNode*p;for(i=0;inextarc;typedefin
35、tSElemType;/*栈类型*/*栈的顺序存储表示*/SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/SElemType*top;/*栈顶指针*/intstacksize;/*当前已分配的存储空间,以元素为单位*/SqStack;/*顺序栈*/*顺序栈的基本操作*/StatusInitStack(SqStack*S)/*构造一个空栈S*/(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType);if(!(*S).base)exit(OVERFLOW);/*存储分配失败*/(*S).top
36、=(*S).base;(*S).stacksize=STACK_INIT_SIZE;returnOK;/*若栈S为空栈,则返回TRUE,否则返回FALSE*/if(S.top=S.base)returnTRUE;elsereturnFALSE;StatusPop(SqStack*S,SElemType*e)/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/if(*S).top=(*S).base)returnERROR;*e=*-(*S).top;returnOK;StatusPush(SqStack*S,SElemTypee)/*插入元素e为新的栈顶元素*/i
37、f(*S).top-(*S).base=(*S).stacksize)/*栈满,追加存储空间*/(*S).base=(SElemType*)realloc(*S).base,(*S).stacksize+STACKINCREMENT)*sizeof(SElemType);pathtwob;ArcNode*p;FindInDegree(G,indegree);/*for(p=G.verticesi.firstarc;p;p=p-nextarc)/*对i号顶点的每个邻接点的入度减*/if(!(*S).base)exit(OVERFLOW);/*存储分配失败*/(*S).top=(*S).base+
38、(*S).stacksize;(*S).stacksize+=STACKINCREMENT;*(*S).top)+=e;returnOK;typedefintpathoneMAXCLASS;typedefintpathtwoMAXCLASS;StatusTopologicalSort(ALGraphG)/*有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,*/*否则返回ERROR。*/inti,k,j=0,count,indegreeMAX_VERTEX_NUM;boolhas=false;SqStackS;pathonea;对各顶点求入度indegree0.ve
39、rnum-1*/InitStack(&S);/*初始化栈*/for(i=0;iintqq=1;/学期数intxxf;while(qqnextarc)/*对i号顶点的每个邻接点的入度减*/k=p-adjvex;indegreek-;/*if(!(-indegreek)若入度减为,则入栈Push(&S,k);*/resultrtop=i;rtop+;coutDataTyper20;intlength;/couta;for(inti=0;iif(S.ri.priceL.ri-1.price)L.ri=S.ri;for(inte=0;etif(!fj)fj=p;elserej.next=p;ej=p;voidCollect(DataType*r,inti,int*f,int*e)intj,t;for(j=0;!fj;j+);r0.next=fj;t=ej;while(j#include#include#include#includeusingnamespacestd;/存储结点结构structNodeintData1;intData2;intdis;/比较函数boolJudgDis(constNode&p1,constNode&p2)returnp1.disData1;cout