- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构复习03907
9、某个地区的通讯网如下图所示,边及边上的权表示两城市间如果架设通讯线路要花费的代价。如何选择能沟通每个城市且总代价最省的n-1条线路。?? 求该图的最小生成树,例如采用Kruskal算法: 算法题 设一单链表,其结点结构为data link,试编写算法将所有数据域中内容为奇数的结点移动至所有数据域中内容为偶数的结点之前。设链表带辅助的头结点。顺序考察链表结点,让P指向当前考察结点的前驱结点。当发现当前考察结点是奇数时将它移至链表的首结点之前,当发现是偶数时就略过这个结点。void oddEvenList(Node *h){ Node *t, *p = h; while(p- link != NULL){ if(p- link -data%2 == 1){ t = p- link; p- link = t- link; t- link = h- link; h - link = t; }else p=p- link;} 2、试编写算法,将数组int A[n]中的所有偶数移到所有奇数之前,同时使奇数与偶数子序列分别按从小到大递增的次序排列。借用插入排序的算法,当发现是偶数时在前面的偶数段插,否则在后面的奇数段插。设当前正准备考察i号元素,已经发现了even个偶数,则偶数段是0—even-1,奇数段是even-j-1。void insertEOSort(int a[ ], int n){ int i, j, temp, even ; even = a[0]%2==0 ? 1 : 0; //由第一个数的奇偶性确定even的初值 for(i = 1; i n; i++) { temp = a[i]; if(a[i]%2 == 0){//是偶数 for(j = i-1; j = even; j--) a[j+1] = a[j]; //奇数段后移 for(; j = 0 a[j] temp; j--) a[j+1] = a[j];//找插入位置 a[j+1] = temp; }else {//是奇数 for(j = i-1; j = even a[j] temp; j--) a[j+1] = a[j];//找插入位置 a[j+1] = temp; } } } 3、用递归的方法判断两棵二叉树是否完全相同(完全相同的意思是结点上的数据域相同且左右子结点相同),二叉树每个结点的格式为:leftchild data rightchild。int *equalTreeCopy(BTree *t1, Btree *t2){ int p; if (t1 == t2) return 1;//都为空相同 if(t1==NULL || t2 == NULL) return 0;//一个为空,另一个不为空,则不同 if(t1-data != t2-data) return 0;//根结点值不等,则不同 if(equalTreeCopy(t1-leftchild, t2-leftchild) == 0) return 0;//左子树不同,则不同 return equalTreeCopy(t1-rightchild, t2-rightchild); //由右子树是否相同确定} 4、试设计算法将数组A[n]中的元素循环左移k位,并要求只用一个元素大小的辅助存储空间,保证算法的时间复杂度为O(n)。上述移动存在若干个传递环,一个传递环可以通过一个循环实现。这样,每个元素只移动一次,就能保证算法的时间复杂度为O(n) 。从0号元素开始,逐个对同一个传递环上的元素进行循环传递。每当一个传递环开始时,为了确定a[i]是否已经被传递过,可由它引起的传递环上的元素是否能产生下标比i更小的元素来确定,如果会产生比i更小的下标,说明该元素是早先已经传递过的;否则,就会回到i,则应由a[i]开始一个新的传递环。void loopMove(int a[], int n, int k){ int i, p, q, t; for(i= 0; i k; i++){ q = (i+k)%n; while(q i) q = (q+k)%n; if
文档评论(0)