数据结构课程设计报告附源码.docx
《数据结构课程设计报告附源码.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告附源码.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告附源码
《数据结构与算法》
课程设计报告
(2012—2013学年第3学期)
专业:
班级:
姓名:
学号:
指导教师:
成绩:
计算机与信息工程学院
2013
年
7
月
12
日
目录
一.课程设计的目的与要求(含设计指标)…………………2
二.方案实现与调试……………………………………………2
2.1停车场管理系统
2.1.1算法描述及实验步骤
1、问题描述即要求
2、需求分析
3、概要设计
4、详细设计
5、调试分析
6、测试结果
7、用户手册
8、改进方案
2.2公共祖先
2.2.1算法描述及实验步骤
2.3叶子节点排序
2.3.1算法描述及实验步骤
2.4插入冒泡
2.4.1算法描述及实验步骤
三.课程设计分析与总结………………………………………11
四.源程序清单…………………………………………………11
一.课程设计的目的与要求(含设计指标)
基本要求:
学生必须仔细阅读《数据结构》课程设计指导书,认真主动完成课程设计的要求。
有问题及时主动通过各种方式与教师联系沟通。
学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课程设计过程中不断检测自己的计划完成情况,有困难及时向教师汇报。
课程设计按照教学要求需要一周时间完成,一周中每天(按每周5天)上机调试程序时间不少于4小时,总共至少要上机调试程序15小时。
根据设计报告要求编写设计报告,主要内容包括目的、意义、原理和实现方法简介、过程分析及说明、实验结果情况说明、结论。
二.方案实现与调试
1.问题描述即要求
停车场是一个可停放n辆汽车的狭长通道,并只有一个大门可供汽车进出,汽车在停车场内按车辆到达的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),如车长内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理.每一组输入数据包括三个数据项:
汽车”到达”或”离去”信息,汽车牌照号码以及到达或离去的时刻(到达或离去的时刻也可用计算机控制).对每一组输入数据进行操作后的输入信息为:
如是车辆到达,则输入汽车在停车场内或便道上的停留位置;如是车辆离去,则输入汽车在停车场内停留的时间和应交的费用。
每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场应交纳的费用和它在停车场内停留的时间。
1、系统分为:
初始化、有车进入、有车离开、退出四个模块。
2、停车场管理程序
4详细设计
菜单函数设计:
分为初始化、有车进入、有车离开、退出。
voidmenu()
{
intn,w;
do
puts("****MENU***");
puts("1.初始化");
puts("2.有车进入");
puts("3.有车离开");
puts("4.退出");
printf("请选择你需要的服务(1-4):
");
scanf("%d",&n);
if(n<1||n>4)
w=1;
getchar();
}
elsew=0;
}while(w==1);
switch(n)
case1:
chushi();break;/*停车函数*/
case2:
jinru();break;/*开车函数*/
case3:
likai();break;/*退出*/
case4:
exit(0);break;/*初始化*/
初始化模块设计:
将车道和停车场内所有的车清空。
voidchushi()/*初始化*/
inti,j;
for(i=0;ichn[i].neikong=0;/*停车场设置为空*/for(j=0;jchw[i].waikong=0;printf("已初始化");menu();}进入函数设计:车辆到达需要给车编号及给出车停的位置和停车时间等。voidjinru()/*车辆进入函数*/{inti,a;inth=0;printf("请输入该车系序号(从0开始):");scanf("%d",&a);for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}离开函数设计:车辆离开时间,应缴费用,判断便道上是否有车,有则将车停入停车场。voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}退出函数。5调试分析i.静态调试:按求解算法和C语言的语法规则进行检查;语法上出现一些很小的问题,但也是程序无法运行。ii.动态调试:将设计题给出的路径进行运行;程序无法运行,无法给出结果,修改好后于理想结果产生偏差。6测试结果主菜单初始化进入离开退出7用户手册(1)本程序在TC环境下形成xxx.exe的执行文件。(2)在windows系统界面上运行xxx.exe即可显示运行界面,按提示命令输入需要的服务进行选择。8改进方案本程序无法显示停车场所有车辆的信息,需要在有车进入函数和离开函数中添加变量,最后对变量进行输出,即为停车场所有车辆的信息。2.2.公共祖先2.2.1算法描述及实验步骤算法思想:这道题的关键在于每个节点中包含指向父节点的指针,这使得程序可以用一个简单的算法实现。首先给出p的父节点p->parent,然后将q的所有父节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。如果没找到相等节点,则将q的所有父节点依次和p->parent->parent作比较......直到p->parent==root。1.采用二叉链表的存储格式,按先序序列输入右图二叉树节点的值,用*代表虚结点(空指针),对右图输入应为AB*DF*J**G*K**C*EH**IL**M**,先序遍历二叉树,输出节点的值。前序遍历输出正常2.输入任意两个子节点的值,输出其最小公共祖先,从二叉树的结构图中可以看出J和H的公共祖先只有根节点,也就是最小公共祖先,故输出A正确。3.若输入的两个子节点的公共祖先不止一个,则输出两者的所有公共祖先,第一个输出的为最小公共祖先,如输入HM,输出应为:ECA,E为最小公共祖先2.2.2调试过程及实验结果本实验要求掌握二叉树的基本操作,熟悉二叉树的前序、中序、后序遍历操作,并能利用二叉树的基本操作解决相关的程序问题,我选取了《数据结构(C语言版)习题集》上的一道题目:在二叉树T中求结点*p和*q的共同最小祖先,即LCA问题,作为实验内容进行实验。如果二叉树结点数据结构中有父指针,那这个问题将变得非常简单,只要分别从两个结点出发向上走到树根,得到两个结点的分支路径,求出这两条路径相互重合部分的最靠下的结点,就是所求的LCA.但实际情况是,通常二叉树结点中并没有父结点指针,如本实验中采用的就是只有左右孩子指针的二叉链表存储形式,这时候就要遍历二叉树找到这两个结点,并找出它们的LCA.实际上,在遍历二叉树的时候,很容易就能够记录下根结点到任何结点的分支路径,只要有了分支路径,就可以对比找出LCA。采取前序遍历,即NLR的顺序,使用结构体数组来避免递归并且记录完整的分支路径。将从根节点开始到这两个子结点之间所有经过的结点分别保存到两个数组中,将两个数组的长度均调整为两个数组之中长度较短的一个的长度,因为两者路径中最小公共祖先及其之前的节点(直到根节点)均相同,这样从最后一个元素开始比较这两个数组中的元素,遇到相同的元素输出,则输出的元素即为两个节点的公共祖先,其中第一个输出的元素为最小公共祖先。根据上述思想,我设计了算法,经过编程调试,输出正常,说明程序没有错误。虽然上述算法不是最优算法,参阅网上资料可以看到有更好的优化算法,但其综合运用了自己所学的二叉树的建立,遍历,数组结构体等方面的知识,所以对自己巩固所学知识,提高应用能力,还是有很大帮助的。2.3题目:2.3.1算法描述及实验步骤1.题目要求设计一个算法,把二叉树的叶子结点按从左到右的顺序连成一个单链表。二叉树用二叉链存储,链接时用叶子结点的rchild域存放指针。2.应用程序功能程序运行结果如下:3.输入数据类型、格式和内容限制输入数据为整型,切勿输入整型以外数据类型,否则程序将进入循环。4.主要算法模块描述流程图:2.4各种排序2.3.1算法描述及实验步骤一、冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。二、插入排序 已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a) 优点:稳定,快; 缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。2.3.2调试过程及实验结果三.课程设计分析与总结通过本次课程设计,使我对数据结构和算法设计有了新的了解和认识,以前编程只是注重如何编写函数能够完成所要求的功能,只是凭单纯的意识和简单的语句来搭配一段程序,但现在感觉不一样了,在编写一个程序之前,经过仔细考虑,挑选出最适合当前题目的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了清晰的构思了,除此之外,也让我真正理解定义数据类型的好处,这样才能用好这样一种数据结构。总之,学习它让我觉得受益匪浅!四.源程序清单#include#include#include#defineN100/*预设停车场有100个车位*/#defineM100/*预设便道有100各出位*/#defineD1.2/*预设车辆停车费为1.2元每小时*/#defineNUMBER100voidmenu();voidchushi();voidjinru();voidlikai();structcar{intcarnum;intcararr;intcarlef;intcarstay;}car[NUMBER];structpark{intneikong;}chn[N-1];structchangwai{intwaikong;}chw[M-1];voidmain(){menu();/*菜单*/}voidmenu(){intn,w;do{puts("****MENU***");puts("1.初始化");puts("2.有车进入");puts("3.有车离开");puts("4.退出");printf("请选择你需要的服务(1-4):");scanf("%d",&n);if(n<1||n>4){w=1;getchar();}elsew=0;}while(w==1);switch(n){case1:chushi();break;/*停车函数*/case2:jinru();break;/*开车函数*/case3:likai();break;/*退出*/case4:exit(0);break;/*初始化*/}}voidchushi()/*初始化*/{inti,j;for(i=0;ichn[i].neikong=0;/*停车场设置为空*/for(j=0;jchw[i].waikong=0;printf("已初始化");menu();}voidjinru()/*车辆进入函数*/{inti,a;inth=0;printf("请输入该车系序号(从0开始):");scanf("%d",&a);for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}2.#include#include#definenull0#defineERROR0intcounter=0;typedefintTElemType;typedefstructBiTNode{TElemTypedata;structBiTNode*lchild,*rchild;}BiNode,*Bitree;Bitreeroot;//定义根结点insert_data(intx)/*生成二叉排序树*/{Bitreep,q,s;s=(Bitree)malloc(sizeof(BiNode));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intFindLowestCommonAncestor(BiNode*root,intv1,intv2){BiNode*n=root;while(1){if(n->data>v1&&n->data>v2)n=n->lchild;elseif(n->datadatan=n->rchild;elsereturnn->data;}}voidmain()/*先生成二叉排序树*/{BiNode*bt,*p,*q;intx,y,a,b;inti=1;//i记录结点个数,x存放结点值root=NULL;/*千万别忘了赋初值给root!*/printf("请输入数据,-9999表示输入结束\n");do{printf("pleaseinputdata%d:",i);i++;scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNowoutputdatavalue:\n");}elseinsert_data(x);/*调用插入数据元素的函数*/}while(x!=-9999);printf("请任意输入树中存在的两个结点:");scanf("%d,%d",&a,&b);y=FindLowestCommonAncestor(root,a,b);printf("输出%d和%d的最低公共祖先:",a,b);printf("%d\n",y);}3.#include#includetypedefintTElemType;typedefstructNode{TElemTypedata;structNode*lchild,*rchild;}Node,*tree;treeroot,L,t;//定义根结点intn=0;voidinsert_data(intx)/*生成二叉排序树*/{treep,q,s;s=(tree)malloc(sizeof(Node));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intPreOrderTraverse(treeroot){if(root!=NULL){//非空二叉树if(root->lchild==NULL&&root->rchild==NULL){t->rchild=root;t=root;}PreOrderTraverse(root->lchild);//递归遍历左子树PreOrderTraverse(root->rchild);//递归遍历右子树}return(0);}
chn[i].neikong=0;/*停车场设置为空*/
for(j=0;jchw[i].waikong=0;printf("已初始化");menu();}进入函数设计:车辆到达需要给车编号及给出车停的位置和停车时间等。voidjinru()/*车辆进入函数*/{inti,a;inth=0;printf("请输入该车系序号(从0开始):");scanf("%d",&a);for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}离开函数设计:车辆离开时间,应缴费用,判断便道上是否有车,有则将车停入停车场。voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}退出函数。5调试分析i.静态调试:按求解算法和C语言的语法规则进行检查;语法上出现一些很小的问题,但也是程序无法运行。ii.动态调试:将设计题给出的路径进行运行;程序无法运行,无法给出结果,修改好后于理想结果产生偏差。6测试结果主菜单初始化进入离开退出7用户手册(1)本程序在TC环境下形成xxx.exe的执行文件。(2)在windows系统界面上运行xxx.exe即可显示运行界面,按提示命令输入需要的服务进行选择。8改进方案本程序无法显示停车场所有车辆的信息,需要在有车进入函数和离开函数中添加变量,最后对变量进行输出,即为停车场所有车辆的信息。2.2.公共祖先2.2.1算法描述及实验步骤算法思想:这道题的关键在于每个节点中包含指向父节点的指针,这使得程序可以用一个简单的算法实现。首先给出p的父节点p->parent,然后将q的所有父节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。如果没找到相等节点,则将q的所有父节点依次和p->parent->parent作比较......直到p->parent==root。1.采用二叉链表的存储格式,按先序序列输入右图二叉树节点的值,用*代表虚结点(空指针),对右图输入应为AB*DF*J**G*K**C*EH**IL**M**,先序遍历二叉树,输出节点的值。前序遍历输出正常2.输入任意两个子节点的值,输出其最小公共祖先,从二叉树的结构图中可以看出J和H的公共祖先只有根节点,也就是最小公共祖先,故输出A正确。3.若输入的两个子节点的公共祖先不止一个,则输出两者的所有公共祖先,第一个输出的为最小公共祖先,如输入HM,输出应为:ECA,E为最小公共祖先2.2.2调试过程及实验结果本实验要求掌握二叉树的基本操作,熟悉二叉树的前序、中序、后序遍历操作,并能利用二叉树的基本操作解决相关的程序问题,我选取了《数据结构(C语言版)习题集》上的一道题目:在二叉树T中求结点*p和*q的共同最小祖先,即LCA问题,作为实验内容进行实验。如果二叉树结点数据结构中有父指针,那这个问题将变得非常简单,只要分别从两个结点出发向上走到树根,得到两个结点的分支路径,求出这两条路径相互重合部分的最靠下的结点,就是所求的LCA.但实际情况是,通常二叉树结点中并没有父结点指针,如本实验中采用的就是只有左右孩子指针的二叉链表存储形式,这时候就要遍历二叉树找到这两个结点,并找出它们的LCA.实际上,在遍历二叉树的时候,很容易就能够记录下根结点到任何结点的分支路径,只要有了分支路径,就可以对比找出LCA。采取前序遍历,即NLR的顺序,使用结构体数组来避免递归并且记录完整的分支路径。将从根节点开始到这两个子结点之间所有经过的结点分别保存到两个数组中,将两个数组的长度均调整为两个数组之中长度较短的一个的长度,因为两者路径中最小公共祖先及其之前的节点(直到根节点)均相同,这样从最后一个元素开始比较这两个数组中的元素,遇到相同的元素输出,则输出的元素即为两个节点的公共祖先,其中第一个输出的元素为最小公共祖先。根据上述思想,我设计了算法,经过编程调试,输出正常,说明程序没有错误。虽然上述算法不是最优算法,参阅网上资料可以看到有更好的优化算法,但其综合运用了自己所学的二叉树的建立,遍历,数组结构体等方面的知识,所以对自己巩固所学知识,提高应用能力,还是有很大帮助的。2.3题目:2.3.1算法描述及实验步骤1.题目要求设计一个算法,把二叉树的叶子结点按从左到右的顺序连成一个单链表。二叉树用二叉链存储,链接时用叶子结点的rchild域存放指针。2.应用程序功能程序运行结果如下:3.输入数据类型、格式和内容限制输入数据为整型,切勿输入整型以外数据类型,否则程序将进入循环。4.主要算法模块描述流程图:2.4各种排序2.3.1算法描述及实验步骤一、冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。二、插入排序 已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a) 优点:稳定,快; 缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。2.3.2调试过程及实验结果三.课程设计分析与总结通过本次课程设计,使我对数据结构和算法设计有了新的了解和认识,以前编程只是注重如何编写函数能够完成所要求的功能,只是凭单纯的意识和简单的语句来搭配一段程序,但现在感觉不一样了,在编写一个程序之前,经过仔细考虑,挑选出最适合当前题目的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了清晰的构思了,除此之外,也让我真正理解定义数据类型的好处,这样才能用好这样一种数据结构。总之,学习它让我觉得受益匪浅!四.源程序清单#include#include#include#defineN100/*预设停车场有100个车位*/#defineM100/*预设便道有100各出位*/#defineD1.2/*预设车辆停车费为1.2元每小时*/#defineNUMBER100voidmenu();voidchushi();voidjinru();voidlikai();structcar{intcarnum;intcararr;intcarlef;intcarstay;}car[NUMBER];structpark{intneikong;}chn[N-1];structchangwai{intwaikong;}chw[M-1];voidmain(){menu();/*菜单*/}voidmenu(){intn,w;do{puts("****MENU***");puts("1.初始化");puts("2.有车进入");puts("3.有车离开");puts("4.退出");printf("请选择你需要的服务(1-4):");scanf("%d",&n);if(n<1||n>4){w=1;getchar();}elsew=0;}while(w==1);switch(n){case1:chushi();break;/*停车函数*/case2:jinru();break;/*开车函数*/case3:likai();break;/*退出*/case4:exit(0);break;/*初始化*/}}voidchushi()/*初始化*/{inti,j;for(i=0;ichn[i].neikong=0;/*停车场设置为空*/for(j=0;jchw[i].waikong=0;printf("已初始化");menu();}voidjinru()/*车辆进入函数*/{inti,a;inth=0;printf("请输入该车系序号(从0开始):");scanf("%d",&a);for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}2.#include#include#definenull0#defineERROR0intcounter=0;typedefintTElemType;typedefstructBiTNode{TElemTypedata;structBiTNode*lchild,*rchild;}BiNode,*Bitree;Bitreeroot;//定义根结点insert_data(intx)/*生成二叉排序树*/{Bitreep,q,s;s=(Bitree)malloc(sizeof(BiNode));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intFindLowestCommonAncestor(BiNode*root,intv1,intv2){BiNode*n=root;while(1){if(n->data>v1&&n->data>v2)n=n->lchild;elseif(n->datadatan=n->rchild;elsereturnn->data;}}voidmain()/*先生成二叉排序树*/{BiNode*bt,*p,*q;intx,y,a,b;inti=1;//i记录结点个数,x存放结点值root=NULL;/*千万别忘了赋初值给root!*/printf("请输入数据,-9999表示输入结束\n");do{printf("pleaseinputdata%d:",i);i++;scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNowoutputdatavalue:\n");}elseinsert_data(x);/*调用插入数据元素的函数*/}while(x!=-9999);printf("请任意输入树中存在的两个结点:");scanf("%d,%d",&a,&b);y=FindLowestCommonAncestor(root,a,b);printf("输出%d和%d的最低公共祖先:",a,b);printf("%d\n",y);}3.#include#includetypedefintTElemType;typedefstructNode{TElemTypedata;structNode*lchild,*rchild;}Node,*tree;treeroot,L,t;//定义根结点intn=0;voidinsert_data(intx)/*生成二叉排序树*/{treep,q,s;s=(tree)malloc(sizeof(Node));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intPreOrderTraverse(treeroot){if(root!=NULL){//非空二叉树if(root->lchild==NULL&&root->rchild==NULL){t->rchild=root;t=root;}PreOrderTraverse(root->lchild);//递归遍历左子树PreOrderTraverse(root->rchild);//递归遍历右子树}return(0);}
chw[i].waikong=0;
printf("已初始化");
menu();
进入函数设计:
车辆到达需要给车编号及给出车停的位置和停车时间等。
voidjinru()/*车辆进入函数*/
inti,a;
inth=0;
printf("请输入该车系序号(从0开始):
scanf("%d",&a);
for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}离开函数设计:车辆离开时间,应缴费用,判断便道上是否有车,有则将车停入停车场。voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}退出函数。5调试分析i.静态调试:按求解算法和C语言的语法规则进行检查;语法上出现一些很小的问题,但也是程序无法运行。ii.动态调试:将设计题给出的路径进行运行;程序无法运行,无法给出结果,修改好后于理想结果产生偏差。6测试结果主菜单初始化进入离开退出7用户手册(1)本程序在TC环境下形成xxx.exe的执行文件。(2)在windows系统界面上运行xxx.exe即可显示运行界面,按提示命令输入需要的服务进行选择。8改进方案本程序无法显示停车场所有车辆的信息,需要在有车进入函数和离开函数中添加变量,最后对变量进行输出,即为停车场所有车辆的信息。2.2.公共祖先2.2.1算法描述及实验步骤算法思想:这道题的关键在于每个节点中包含指向父节点的指针,这使得程序可以用一个简单的算法实现。首先给出p的父节点p->parent,然后将q的所有父节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。如果没找到相等节点,则将q的所有父节点依次和p->parent->parent作比较......直到p->parent==root。1.采用二叉链表的存储格式,按先序序列输入右图二叉树节点的值,用*代表虚结点(空指针),对右图输入应为AB*DF*J**G*K**C*EH**IL**M**,先序遍历二叉树,输出节点的值。前序遍历输出正常2.输入任意两个子节点的值,输出其最小公共祖先,从二叉树的结构图中可以看出J和H的公共祖先只有根节点,也就是最小公共祖先,故输出A正确。3.若输入的两个子节点的公共祖先不止一个,则输出两者的所有公共祖先,第一个输出的为最小公共祖先,如输入HM,输出应为:ECA,E为最小公共祖先2.2.2调试过程及实验结果本实验要求掌握二叉树的基本操作,熟悉二叉树的前序、中序、后序遍历操作,并能利用二叉树的基本操作解决相关的程序问题,我选取了《数据结构(C语言版)习题集》上的一道题目:在二叉树T中求结点*p和*q的共同最小祖先,即LCA问题,作为实验内容进行实验。如果二叉树结点数据结构中有父指针,那这个问题将变得非常简单,只要分别从两个结点出发向上走到树根,得到两个结点的分支路径,求出这两条路径相互重合部分的最靠下的结点,就是所求的LCA.但实际情况是,通常二叉树结点中并没有父结点指针,如本实验中采用的就是只有左右孩子指针的二叉链表存储形式,这时候就要遍历二叉树找到这两个结点,并找出它们的LCA.实际上,在遍历二叉树的时候,很容易就能够记录下根结点到任何结点的分支路径,只要有了分支路径,就可以对比找出LCA。采取前序遍历,即NLR的顺序,使用结构体数组来避免递归并且记录完整的分支路径。将从根节点开始到这两个子结点之间所有经过的结点分别保存到两个数组中,将两个数组的长度均调整为两个数组之中长度较短的一个的长度,因为两者路径中最小公共祖先及其之前的节点(直到根节点)均相同,这样从最后一个元素开始比较这两个数组中的元素,遇到相同的元素输出,则输出的元素即为两个节点的公共祖先,其中第一个输出的元素为最小公共祖先。根据上述思想,我设计了算法,经过编程调试,输出正常,说明程序没有错误。虽然上述算法不是最优算法,参阅网上资料可以看到有更好的优化算法,但其综合运用了自己所学的二叉树的建立,遍历,数组结构体等方面的知识,所以对自己巩固所学知识,提高应用能力,还是有很大帮助的。2.3题目:2.3.1算法描述及实验步骤1.题目要求设计一个算法,把二叉树的叶子结点按从左到右的顺序连成一个单链表。二叉树用二叉链存储,链接时用叶子结点的rchild域存放指针。2.应用程序功能程序运行结果如下:3.输入数据类型、格式和内容限制输入数据为整型,切勿输入整型以外数据类型,否则程序将进入循环。4.主要算法模块描述流程图:2.4各种排序2.3.1算法描述及实验步骤一、冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。二、插入排序 已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a) 优点:稳定,快; 缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。2.3.2调试过程及实验结果三.课程设计分析与总结通过本次课程设计,使我对数据结构和算法设计有了新的了解和认识,以前编程只是注重如何编写函数能够完成所要求的功能,只是凭单纯的意识和简单的语句来搭配一段程序,但现在感觉不一样了,在编写一个程序之前,经过仔细考虑,挑选出最适合当前题目的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了清晰的构思了,除此之外,也让我真正理解定义数据类型的好处,这样才能用好这样一种数据结构。总之,学习它让我觉得受益匪浅!四.源程序清单#include#include#include#defineN100/*预设停车场有100个车位*/#defineM100/*预设便道有100各出位*/#defineD1.2/*预设车辆停车费为1.2元每小时*/#defineNUMBER100voidmenu();voidchushi();voidjinru();voidlikai();structcar{intcarnum;intcararr;intcarlef;intcarstay;}car[NUMBER];structpark{intneikong;}chn[N-1];structchangwai{intwaikong;}chw[M-1];voidmain(){menu();/*菜单*/}voidmenu(){intn,w;do{puts("****MENU***");puts("1.初始化");puts("2.有车进入");puts("3.有车离开");puts("4.退出");printf("请选择你需要的服务(1-4):");scanf("%d",&n);if(n<1||n>4){w=1;getchar();}elsew=0;}while(w==1);switch(n){case1:chushi();break;/*停车函数*/case2:jinru();break;/*开车函数*/case3:likai();break;/*退出*/case4:exit(0);break;/*初始化*/}}voidchushi()/*初始化*/{inti,j;for(i=0;ichn[i].neikong=0;/*停车场设置为空*/for(j=0;jchw[i].waikong=0;printf("已初始化");menu();}voidjinru()/*车辆进入函数*/{inti,a;inth=0;printf("请输入该车系序号(从0开始):");scanf("%d",&a);for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}2.#include#include#definenull0#defineERROR0intcounter=0;typedefintTElemType;typedefstructBiTNode{TElemTypedata;structBiTNode*lchild,*rchild;}BiNode,*Bitree;Bitreeroot;//定义根结点insert_data(intx)/*生成二叉排序树*/{Bitreep,q,s;s=(Bitree)malloc(sizeof(BiNode));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intFindLowestCommonAncestor(BiNode*root,intv1,intv2){BiNode*n=root;while(1){if(n->data>v1&&n->data>v2)n=n->lchild;elseif(n->datadatan=n->rchild;elsereturnn->data;}}voidmain()/*先生成二叉排序树*/{BiNode*bt,*p,*q;intx,y,a,b;inti=1;//i记录结点个数,x存放结点值root=NULL;/*千万别忘了赋初值给root!*/printf("请输入数据,-9999表示输入结束\n");do{printf("pleaseinputdata%d:",i);i++;scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNowoutputdatavalue:\n");}elseinsert_data(x);/*调用插入数据元素的函数*/}while(x!=-9999);printf("请任意输入树中存在的两个结点:");scanf("%d,%d",&a,&b);y=FindLowestCommonAncestor(root,a,b);printf("输出%d和%d的最低公共祖先:",a,b);printf("%d\n",y);}3.#include#includetypedefintTElemType;typedefstructNode{TElemTypedata;structNode*lchild,*rchild;}Node,*tree;treeroot,L,t;//定义根结点intn=0;voidinsert_data(intx)/*生成二叉排序树*/{treep,q,s;s=(tree)malloc(sizeof(Node));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intPreOrderTraverse(treeroot){if(root!=NULL){//非空二叉树if(root->lchild==NULL&&root->rchild==NULL){t->rchild=root;t=root;}PreOrderTraverse(root->lchild);//递归遍历左子树PreOrderTraverse(root->rchild);//递归遍历右子树}return(0);}
if(chn[i].neikong==0)/*无车标记*/
if(chn[i].neikong==1)/*有车标记*/
h=h+1;
if(h==N)
printf("停车场内已满!
else
car[a].carstay=h;
chn[h].neikong=1;
printf("该车应该停在停车场内");
printf("请输入该车进停车场时间:
scanf("d%",&car[a].cararr);
离开函数设计:
车辆离开时间,应缴费用,判断便道上是否有车,有则将车停入停车场。
voidlikai()/*车辆离开函数*/
inti,k,choi,time;
doublefee;
printf("请输入离开车辆次序号[]",&i);
scanf("%d",&i);
printf("请输入离开时间:
scanf("%d",&car[i].carlef);
fee=D*(car[i].carlef-car[i].cararr);
time=car[i].carlef-car[i].cararr;
printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);
printf("便道上现在有车么?
(请选择1或2)1.有。
2.没有");
scanf("%d",&choi);
if(choi==2)
if(choi==1)
printf("请让便道上的第一辆车进场");
printf("该车次序号为:
scanf("%d",&car[k].cararr);
退出函数。
5调试分析
i.静态调试:
按求解算法和C语言的语法规则进行检查;
语法上出现一些很小的问题,但也是程序无法运行。
ii.动态调试:
将设计题给出的路径进行运行;
程序无法运行,无法给出结果,修改好后于理想结果产生偏差。
6测试结果
主菜单
初始化
进入
离开
退出
7用户手册
(1)本程序在TC环境下形成xxx.exe的执行文件。
(2)在windows系统界面上运行xxx.exe即可显示运行界面,按提示命令输入需要的服务进行选择。
8改进方案
本程序无法显示停车场所有车辆的信息,需要在有车进入函数和离开函数中添加变量,最后对变量进行输出,即为停车场所有车辆的信息。
2.2.公共祖先
算法思想:
这道题的关键在于每个节点中包含指向父节点的指针,这使得程序可以用一个简单的算法实现。
首先给出p的父节点p->parent,然后将q的所有父节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。
如果没找到相等节点,则将q的所有父节点依次和p->parent->parent作比较......直到p->parent==root。
1.采用二叉链表的存储格式,按先序序列输入右图二叉树节点的值,用*代表虚结点(空指针),对右图输入应为AB*DF*J**G*K**C*EH**IL**M**,先序遍历二叉树,输出节点的值。
前序遍历输出正常
2.输入任意两个子节点的值,输出其最小公共祖先,从二叉树的结构图中可以看出J和H的公共祖先只有根节点,也就是最小公共祖先,故输出A正确。
3.若输入的两个子节点的公共祖先不止一个,则输出两者的所有公共祖先,第一个输出的为最小公共祖先,如输入HM,输出应为:
ECA,E为最小公共祖先
2.2.2调试过程及实验结果
本实验要求掌握二叉树的基本操作,熟悉二叉树的前序、中序、后序遍历操作,并能利用二叉树的基本操作解决相关的程序问题,我选取了《数据结构(C语言版)习题集》上的一道题目:
在二叉树T中求结点*p和*q的共同最小祖先,即LCA问题,作为实验内容进行实验。
如果二叉树结点数据结构中有父指针,那这个问题将变得非常简单,只要分别从两个结点出发向上走到树根,得到两个结点的分支路径,求出这两条路径相互重合部分的最靠下的结点,就是所求的LCA.但实际情况是,通常二叉树结点中并没有父结点指针,如本实验中采用的就是只有左右孩子指针的二叉链表存储形式,这时候就要遍历二叉树找到这两个结点,并找出它们的LCA.实际上,在遍历二叉树的时候,很容易就能够记录下根结点到任何结点的分支路径,只要有了分支路径,就可以对比找出LCA。
采取前序遍历,即NLR的顺序,使用结构体数组来避免递归并且记录完整的分支路径。
将从根节点开始到这两个子结点之间所有经过的结点分别保存到两个数组中,将两个数组的长度均调整为两个数组之中长度较短的一个的长度,因为两者路径中最小公共祖先及其之前的节点(直到根节点)均相同,这样从最后一个元素开始比较这两个数组中的元素,遇到相同的元素输出,则输出的元素即为两个节点的公共祖先,其中第一个输出的元素为最小公共祖先。
根据上述思想,我设计了算法,经过编程调试,输出正常,说明程序没有错误。
虽然上述算法不是最优算法,参阅网上资料可以看到有更好的优化算法,但其综合运用了自己所学的二叉树的建立,遍历,数组结构体等方面的知识,所以对自己巩固所学知识,提高应用能力,还是有很大帮助的。
2.3题目:
1.题目要求
设计一个算法,把二叉树的叶子结点按从左到右的顺序连成一个单链表。
二叉树用二叉链存储,链接时用叶子结点的rchild域存放指针。
2.应用程序功能
程序运行结果如下:
3.输入数据类型、格式和内容限制
输入数据为整型,切勿输入整型以外数据类型,否则程序将进入循环。
4.主要算法模块描述
流程图:
2.4各种排序
一、冒泡排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。
首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。
再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。
再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。
这样处理一轮后,a[n]的值一定是这组数据中最大的。
再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。
再对a[1]~a[n-2]以相同方法处理一轮,以此类推。
共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
二、插入排序
已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。
首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。
b[2]~b[m]用相同方法插入。
(若无数组a,可将b[1]当作n=1的数组a)
优点:
稳定,快;
缺点:
比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
2.3.2调试过程及实验结果
三.课程设计分析与总结
通过本次课程设计,使我对数据结构和算法设计有了新的了解和认识,以前编程只是注重如何编写函数能够完成所要求的功能,只是凭单纯的意识和简单的语句来搭配一段程序,但现在感觉不一样了,在编写一个程序之前,经过仔细考虑,挑选出最适合当前题目的算法。
这样,即使在完整的程序还没有写出来之前,自己心中已经有了清晰的构思了,除此之外,也让我真正理解定义数据类型的好处,这样才能用好这样一种数据结构。
总之,学习它让我觉得受益匪浅!
四.源程序清单
#include
#defineN100/*预设停车场有100个车位*/
#defineM100/*预设便道有100各出位*/
#defineD1.2/*预设车辆停车费为1.2元每小时*/
#defineNUMBER100
voidmenu();
voidchushi();
voidjinru();
voidlikai();
structcar
intcarnum;
intcararr;
intcarlef;
intcarstay;
}car[NUMBER];
structpark
intneikong;
}chn[N-1];
structchangwai
intwaikong;
}chw[M-1];
voidmain()
menu();/*菜单*/
for(i=0;ichn[i].neikong=0;/*停车场设置为空*/for(j=0;jchw[i].waikong=0;printf("已初始化");menu();}voidjinru()/*车辆进入函数*/{inti,a;inth=0;printf("请输入该车系序号(从0开始):");scanf("%d",&a);for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}2.#include#include#definenull0#defineERROR0intcounter=0;typedefintTElemType;typedefstructBiTNode{TElemTypedata;structBiTNode*lchild,*rchild;}BiNode,*Bitree;Bitreeroot;//定义根结点insert_data(intx)/*生成二叉排序树*/{Bitreep,q,s;s=(Bitree)malloc(sizeof(BiNode));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intFindLowestCommonAncestor(BiNode*root,intv1,intv2){BiNode*n=root;while(1){if(n->data>v1&&n->data>v2)n=n->lchild;elseif(n->datadatan=n->rchild;elsereturnn->data;}}voidmain()/*先生成二叉排序树*/{BiNode*bt,*p,*q;intx,y,a,b;inti=1;//i记录结点个数,x存放结点值root=NULL;/*千万别忘了赋初值给root!*/printf("请输入数据,-9999表示输入结束\n");do{printf("pleaseinputdata%d:",i);i++;scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNowoutputdatavalue:\n");}elseinsert_data(x);/*调用插入数据元素的函数*/}while(x!=-9999);printf("请任意输入树中存在的两个结点:");scanf("%d,%d",&a,&b);y=FindLowestCommonAncestor(root,a,b);printf("输出%d和%d的最低公共祖先:",a,b);printf("%d\n",y);}3.#include#includetypedefintTElemType;typedefstructNode{TElemTypedata;structNode*lchild,*rchild;}Node,*tree;treeroot,L,t;//定义根结点intn=0;voidinsert_data(intx)/*生成二叉排序树*/{treep,q,s;s=(tree)malloc(sizeof(Node));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intPreOrderTraverse(treeroot){if(root!=NULL){//非空二叉树if(root->lchild==NULL&&root->rchild==NULL){t->rchild=root;t=root;}PreOrderTraverse(root->lchild);//递归遍历左子树PreOrderTraverse(root->rchild);//递归遍历右子树}return(0);}
for(j=0;jchw[i].waikong=0;printf("已初始化");menu();}voidjinru()/*车辆进入函数*/{inti,a;inth=0;printf("请输入该车系序号(从0开始):");scanf("%d",&a);for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}2.#include#include#definenull0#defineERROR0intcounter=0;typedefintTElemType;typedefstructBiTNode{TElemTypedata;structBiTNode*lchild,*rchild;}BiNode,*Bitree;Bitreeroot;//定义根结点insert_data(intx)/*生成二叉排序树*/{Bitreep,q,s;s=(Bitree)malloc(sizeof(BiNode));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intFindLowestCommonAncestor(BiNode*root,intv1,intv2){BiNode*n=root;while(1){if(n->data>v1&&n->data>v2)n=n->lchild;elseif(n->datadatan=n->rchild;elsereturnn->data;}}voidmain()/*先生成二叉排序树*/{BiNode*bt,*p,*q;intx,y,a,b;inti=1;//i记录结点个数,x存放结点值root=NULL;/*千万别忘了赋初值给root!*/printf("请输入数据,-9999表示输入结束\n");do{printf("pleaseinputdata%d:",i);i++;scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNowoutputdatavalue:\n");}elseinsert_data(x);/*调用插入数据元素的函数*/}while(x!=-9999);printf("请任意输入树中存在的两个结点:");scanf("%d,%d",&a,&b);y=FindLowestCommonAncestor(root,a,b);printf("输出%d和%d的最低公共祖先:",a,b);printf("%d\n",y);}3.#include#includetypedefintTElemType;typedefstructNode{TElemTypedata;structNode*lchild,*rchild;}Node,*tree;treeroot,L,t;//定义根结点intn=0;voidinsert_data(intx)/*生成二叉排序树*/{treep,q,s;s=(tree)malloc(sizeof(Node));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intPreOrderTraverse(treeroot){if(root!=NULL){//非空二叉树if(root->lchild==NULL&&root->rchild==NULL){t->rchild=root;t=root;}PreOrderTraverse(root->lchild);//递归遍历左子树PreOrderTraverse(root->rchild);//递归遍历右子树}return(0);}
for(i=0;i{if(chn[i].neikong==0)/*无车标记*/if(chn[i].neikong==1)/*有车标记*/h=h+1;}if(h==N)printf("停车场内已满!");else{car[a].carstay=h;chn[h].neikong=1;printf("该车应该停在停车场内");printf("请输入该车进停车场时间:");scanf("d%",&car[a].cararr);}menu();}voidlikai()/*车辆离开函数*/{inti,k,choi,time;doublefee;printf("请输入离开车辆次序号[]",&i);scanf("%d",&i);printf("请输入离开时间:");scanf("%d",&car[i].carlef);fee=D*(car[i].carlef-car[i].cararr);time=car[i].carlef-car[i].cararr;printf("次序号为%d的车停时间%d小时,应收费%f元",i,time,fee);printf("便道上现在有车么?(请选择1或2)1.有。2.没有");scanf("%d",&choi);if(choi==2){menu();}if(choi==1){printf("请让便道上的第一辆车进场");printf("该车次序号为:");scanf("%d",&car[k].cararr);menu();}}2.#include#include#definenull0#defineERROR0intcounter=0;typedefintTElemType;typedefstructBiTNode{TElemTypedata;structBiTNode*lchild,*rchild;}BiNode,*Bitree;Bitreeroot;//定义根结点insert_data(intx)/*生成二叉排序树*/{Bitreep,q,s;s=(Bitree)malloc(sizeof(BiNode));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intFindLowestCommonAncestor(BiNode*root,intv1,intv2){BiNode*n=root;while(1){if(n->data>v1&&n->data>v2)n=n->lchild;elseif(n->datadatan=n->rchild;elsereturnn->data;}}voidmain()/*先生成二叉排序树*/{BiNode*bt,*p,*q;intx,y,a,b;inti=1;//i记录结点个数,x存放结点值root=NULL;/*千万别忘了赋初值给root!*/printf("请输入数据,-9999表示输入结束\n");do{printf("pleaseinputdata%d:",i);i++;scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNowoutputdatavalue:\n");}elseinsert_data(x);/*调用插入数据元素的函数*/}while(x!=-9999);printf("请任意输入树中存在的两个结点:");scanf("%d,%d",&a,&b);y=FindLowestCommonAncestor(root,a,b);printf("输出%d和%d的最低公共祖先:",a,b);printf("%d\n",y);}3.#include#includetypedefintTElemType;typedefstructNode{TElemTypedata;structNode*lchild,*rchild;}Node,*tree;treeroot,L,t;//定义根结点intn=0;voidinsert_data(intx)/*生成二叉排序树*/{treep,q,s;s=(tree)malloc(sizeof(Node));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intPreOrderTraverse(treeroot){if(root!=NULL){//非空二叉树if(root->lchild==NULL&&root->rchild==NULL){t->rchild=root;t=root;}PreOrderTraverse(root->lchild);//递归遍历左子树PreOrderTraverse(root->rchild);//递归遍历右子树}return(0);}
2.
#definenull0
#defineERROR0
intcounter=0;
typedefintTElemType;
typedefstructBiTNode
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiNode,*Bitree;
Bitreeroot;//定义根结点
insert_data(intx)/*生成二叉排序树*/
Bitreep,q,s;
s=(Bitree)malloc(sizeof(BiNode));//创建结点
s->data=x;//结点赋值
s->lchild=NULL;
s->rchild=NULL;
if(!
root)
root=s;
p=root;
while(p)/*如何接入二叉排序树的适当位置*/
q=p;
if(p->data==x)//相同结点不能重复插入
printf("dataalreadyexist!
\n");
return;
elseif(xdata)
p=p->lchild;
p=p->rchild;
if(xdata)
q->lchild=s;
q->rchild=s;
intFindLowestCommonAncestor(BiNode*root,intv1,intv2)
BiNode*n=root;
while
(1)
if(n->data>v1&&n->data>v2)
n=n->lchild;
elseif(n->datadatan=n->rchild;elsereturnn->data;}}voidmain()/*先生成二叉排序树*/{BiNode*bt,*p,*q;intx,y,a,b;inti=1;//i记录结点个数,x存放结点值root=NULL;/*千万别忘了赋初值给root!*/printf("请输入数据,-9999表示输入结束\n");do{printf("pleaseinputdata%d:",i);i++;scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNowoutputdatavalue:\n");}elseinsert_data(x);/*调用插入数据元素的函数*/}while(x!=-9999);printf("请任意输入树中存在的两个结点:");scanf("%d,%d",&a,&b);y=FindLowestCommonAncestor(root,a,b);printf("输出%d和%d的最低公共祖先:",a,b);printf("%d\n",y);}3.#include#includetypedefintTElemType;typedefstructNode{TElemTypedata;structNode*lchild,*rchild;}Node,*tree;treeroot,L,t;//定义根结点intn=0;voidinsert_data(intx)/*生成二叉排序树*/{treep,q,s;s=(tree)malloc(sizeof(Node));//创建结点s->data=x;//结点赋值s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}else{p=root;while(p)/*如何接入二叉排序树的适当位置*/{q=p;if(p->data==x)//相同结点不能重复插入{printf("dataalreadyexist!\n");return;}elseif(xdata)p=p->lchild;elsep=p->rchild;}if(xdata)q->lchild=s;elseq->rchild=s;}}intPreOrderTraverse(treeroot){if(root!=NULL){//非空二叉树if(root->lchild==NULL&&root->rchild==NULL){t->rchild=root;t=root;}PreOrderTraverse(root->lchild);//递归遍历左子树PreOrderTraverse(root->rchild);//递归遍历右子树}return(0);}
n=n->rchild;
returnn->data;
voidmain()/*先生成二叉排序树*/
BiNode*bt,*p,*q;
intx,y,a,b;
inti=1;//i记录结点个数,x存放结点值
root=NULL;/*千万别忘了赋初值给root!
*/
printf("请输入数据,-9999表示输入结束\n");
printf("pleaseinputdata%d:
",i);
i++;
scanf("%d",&x);/*从键盘采集数据,以-9999表示输入结束*/
if(x==-9999){
printf("\nNowoutputdatavalue:
insert_data(x);/*调用插入数据元素的函数*/
}while(x!
=-9999);
printf("请任意输入树中存在的两个结点:
scanf("%d,%d",&a,&b);
y=FindLowestCommonAncestor(root,a,b);
printf("输出%d和%d的最低公共祖先:
",a,b);
printf("%d\n",y);
3.#include
typedefstructNode
structNode*lchild,*rchild;
}Node,*tree;
treeroot,L,t;//定义根结点
intn=0;
voidinsert_data(intx)/*生成二叉排序树*/
treep,q,s;
s=(tree)malloc(sizeof(Node));//创建结点
intPreOrderTraverse(treeroot)
{if(root!
=NULL){//非空二叉树
if(root->lchild==NULL&&root->rchild==NULL)
t->rchild=root;
t=root;
PreOrderTraverse(root->lchild);//递归遍历左子树
PreOrderTraverse(root->rchild);//递归遍历右子树
return(0);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1