2010山东省数据简介入门_第1页
2010山东省数据简介入门_第2页
2010山东省数据简介入门_第3页
2010山东省数据简介入门_第4页
2010山东省数据简介入门_第5页
全文预览已结束

下载本文档

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

文档简介

1、本题要求建立有序的循环链表。从头到尾扫描数组A,取出A[i](0<=i<n),然后到链表中去查找值为A[i]的结点,若查找失败,则插入。LinkedListcreat(ElemTypeA[],intn)//由含n个数据的数组A生成循环链表,要求链表有序并且无值重复结点{LinkedListh;h=(LinkedList)malloc(sizeof(LNode));//申请结点h->next=h;//形成空循环链表for(i=0;i<n;i++){pre=h;p=h->next;while(p!=h&&p->data<A[i]){pre=p;p=p->next;}//查找A[i]的插入位置if(p==h||p->data!=A[i])//重复数据不再输入{s=(LinkedList)malloc(sizeof(LNode));s->data=A[i];pre->next=s;s->next=p;//将结点s链入链表中}}//forreturn(h);}算法结束2、给定n个村庄之间的交通图,若村庄i和j之间有道路,则将顶点i和j用边连接,边上的Wij表示这条道路的长度,现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?试设计一个解答上述问题的算法,并应用该算法解答如图所示的实例。20分voidHospital(AdjMatrixw,intn)//在以邻接带权矩阵表示的n个村庄中,求医院建在何处,使离医院最远的村庄到医院的路径最短。{for(k=1;k<=n;k++)//求任意两顶点间的最短路径for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(w[i][k]+w[k][j]<w[i][j])w[i][j]=w[i][k]+w[k][j];m=MAXINT;//设定m为机器内最大整数。for(i=1;i<=n;i++)//求最长路径中最短的一条。{s=0;for(j=1;j<=n;j++)//求从某村庄i(1<=i<=n)到其它村庄的最长路径。if(w[i][j]>s)s=w[i][j];if(s<=m){m=s;k=i;}//在最长路径中,取最短的一条。m记最长路径,k记出发顶点的下标。Printf(“医院应建在%d村庄,到医院距离为%d\n”,i,m);}//for}//算法结束对以上实例模拟的过程略。各行中最大数依次是9,9,6,7,9,9。这几个最大数中最小者为6,故医院应建在第三个村庄中,离医院最远的村庄到医院的距离是6。1、对图1所示的连通网G,请用Prim算法构造其最小生成树(每选取一条边画一个图)。3、给定n个村庄之间的交通图,若村庄i和j之间有道路,则将顶点i和j用边连接,边上的Wij表示这条道路的长度,现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?试设计一个解答上述问题的算法,并应用该算法解答如图所示的实例。(20分)4、给定n个村庄之间的交通图,若村庄i和j之间有道路,则将顶点i和j用边连接,边上的Wij表示这条道路的长度,现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?试设计一个解答上述问题的算法,并应用该算法解答如图所示的实例。(20分)5、根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。若非二叉排序树,则置flag为false。#definetrue1#definefalse0typedefstructnode{datatypedata;structnode*llink,*rlink;}*BTree;voidJudgeBST(BTreet,intflag)//判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论。{if(t!=null&&flag){Judgebst(t->llink,flag);//中序遍历左子树if(pre==null)pre=t;//中序遍历的第一个结点不必判断elseif(pre->data<t->data)pre=t;//前驱指针指向当前结点else{flag=flase;}//不是完全二叉树Judgebst(t->rlink,flag);//中序遍历右子树}//JudgeBST算法结束6、二部图(bipartitegraph)G=(V,E)是一个能将其结点集V分为两不相交子集V1和V2=V-V1的无向图,使得:V1中的任何两个结点在图G中均不相邻,V2中的任何结点在图G中也均不相邻。(1).请各举一个结点个数为5的二部图和非二部图的例子。(2).请用C或PASCAL编写一个函数BIPARTITE判断一个连通无向图G是否是二部图,并分析程序的时间复杂度。设G用二维数组A来表示,大小为n*n(n为结点个数)。请在程序中加必要的注释。若有必要可直接利用堆栈或队列操作。【7、在有向图G中,如果r到G中的每个结点都有路径可达,则称结点r为G的根结点。编写一个算法完成下列功能:(1).建立有向图G的邻接表存储结构;(2).判断有向图G是否有根,若有,则打印出所有根结点的值。8、两棵空二叉树或仅有根结点的二叉树相似;对非空二叉树,可判左右子树是否相似,采用递归算法。intSimilar(BiTreep,q)//判断二叉树p和q是否相似上权值之和最小的生成树。故可按权值从大到小对边进行排序,然后从大到小将边删除。每删除一条当前权值最大的边后,就去测试图是否仍连通,若不再连通,则将该边恢复。若仍连通,继续向下删;直到剩n-1条边为止。voidSpnTree(AdjListg)//用“破圈法”求解带权连通无向图的一棵最小代价生成树。{typedefstruct{inti,j,w}node;//设顶点信息就是顶点编号,权是整型数nodeedge[];scanf("%d%d",&e,&n);//输入边数和顶点数。for(i=1;i<=e;i++)//输入e条边:顶点,权值。scanf("%d%d%d",&edge[i].i,&edge[i].j,&edge[i].w);for(i=2;i<=e;i++)//按边上的权值大小,对边进行逆序排序。{edge[0]=edge[i];j=i-1;while(edge[j].w<edge[0].w)edge[j+1]=edge[j--];edge[j+1]=edge[0];}//fork=1;eg=e;while(eg>=n)//破圈,直到边数e=n-1.{if(connect(k))//删除第k

温馨提示

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

评论

0/150

提交评论