Advertisement

数据结构,第9章:anyview作业系统答案。

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
9.25实现下列函数:int Search(SSTable s, KeyType k);/* Index the element which key is k *//* in StaticSearchTable s. *//* Return 0 if x is not found. */ 静态查找表的类型SSTable定义如下:typedef struct { KeyType key; ... ... // 其他数据域} ElemType; typedef struct { ElemType *elem; int length;} SSTable;int Search(SSTable a, KeyType k)/* Index the element which key is k */ /* in StaticSearchTable s. *//* Return 0 if x is not found. */{ int i; if(a.length==0) return ERROR; //先判断a是否为空 a.elem[a.length+1].key=k; for(i=1;a.elem[i].key>k;i++) if(i>=a.length||a.elem[i].keyk;i++) if(i>a.length||a.elem[i].keyk) return BinSearch(s,low,high-1,k); } return 0;} /* { int mid; if(low<=high) { mid=(low+high)/2; if(s.elem[mid].keylchild || t->rchild ) )//空树和叶子不用判断 { if( t->lchild && ( t->data.key < t->lchild->data.key ) )//左孩子不空,左孩子的key比本身的大 return FALSE; else if( t->rchild && ( t->data.key > t->rchild->data.key ) )//右孩子不空,右孩子的key比本身的大 return FALSE; else if( !IsBSTree( t->lchild ) )//判断左子树 return FALSE; else if( !IsBSTree( t->rchild ) )//判断右子树 return FALSE; } return TRUE;} /*{ if(!t) return OK; if(t&&!t->lchild&&!t->rchild) return OK; else { if(t->lchild->data.keydata.key) IsBSTree(t->lchild); if(t->lchild->data.key>=t->data.key) return ERROR; if(t->rchild->data.key>t->data.key) IsBSTree(t->rchild); else return ERROR; return OK; } } */ 9.33③ 编写递归算法,从大到小输出给定二叉排序树中所有关键字不小于x的数据元素。要求你的算法的时间复杂度为O(log2n+m),其中n为排序树中所含结点数,m为输出的关键字个数。 实现下列函数:void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType));/* Output is to use visit(t->data); */ 二叉树的类型BiTree定义如下:typedef struct { KeyType key; ... ... // 其他数据域} ElemType; typedef struct BiTNode { ElemType data; BiTNode *lchild,*rchild;}BiTNode, *BiTree;void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType))/* Output is to use visit(t->data); */ { if(t->rchild) OrderOut(t->rchild,x,visit); if(t->data.key>=x) visit(t->data); if(t->lchild)OrderOut(t->lchild,x,visit); } /*{ if(t->rchild) OrderOut(t->rchild,x); if(t->datalchild)OrderOut(t->lchild,x); } */ 9.44④ 已知某哈希表的装载因子小于1,哈希函数H(key)为关键字(标识符)的第一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法。 实现下列函数:void PrintKeys(HashTable ht, void(*print)(StrKeyType));/* 依题意用print输出关键字 */ 哈希表的类型HashTable定义如下:#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1typedef char StrKeyType[4];typedef struct { StrKeyType key; void *any;} HElemType; int hashsize[] = { 7,11,17,23,29,37,47 };typedef struct { HElemType elem[MAXLEN]; int count; int sizeindex;} HashTable;int H(char *s)//求Hash函数{ if( s[0] ) return s[0]-A+1; //求关键字第一个字母的字母序号(小写) else return 0;} void PrintKeys(HashTable ht, void(*print)(StrKeyType))/* 依题意用print输出关键字 */{ int i,j; for( i = 1; i <= 26; i++ ) { for( j = (i-1)%hashsize[ht.sizeindex]; ht.elem[j].key[0]; ) { if( H ( ht.elem[j].key ) == i ) print(ht.elem[j].key); j = (j+1)%hashsize[ht.sizeindex]; } }} /*void PrintKeys(HashTable ht, void(*print)(StrKeyType))/* 依题意用print输出关键字 { int i,j; for(i=1;i<=26;i++) for(j=i;ht.elem[j].key;j=(j+1)%MAXLEN) if(H(ht.elem[j].key)==i) print(ht);} int H(char *s){if(s) return s[0]-96;else return 0;} */9.45③ 假设哈希表长为m,哈希函数为H(x),用链地址法处理冲突。试编写输入一组关键字并建造哈希表的算法。 实现下列函数:int BuildHashTab(ChainHashTab &H, int n, HKeyType es[]) /* 直接调用下列函数 *//* 哈希函数: *//* int Hash(ChainHashTab H, HKeyType k); *//* 冲突处理函数: *//* int Collision(ChainHashTab H, HLink &p); */{ int i = 0,l,flag; HLink p,node; while( es[i] ) { l = Hash( H, es[i] ); node = ( HLink )malloc( sizeof( HNode ) ); node->data = es[i]; node->next = NULL; i++; if( !H.elem[l] ) H.elem[l] = node; else { flag = 0; p = H.elem[l]; if( p->data == node->data ) flag = 1; while( Collision( H, p ) ) if( p->data == node->data ) { flag = 1; break; } if( !flag ) { p = H.elem[l]; node->next = p; H.elem[l] = node; } } } } +userLink+; $(miniAd).show(); } }, onFailure: function(){} }}); } showMiniAd();

全部评论 (0)

还没有任何评论哟~
客服
客服
  • 排序与解析(
    优质
    本章聚焦于数据结构中的作业排序问题,涵盖多种算法如冒泡、插入和快速排序,并提供详细的解题思路及答案解析。 排序作业选择题(每题2分,共22分): 1. 若表R在排序前已按键值递增顺序排列,则哪种算法的比较次数最少? A.直接插入排序 B.快速排序 C.归并排序 D.选择排序 2. 对各种内部排序方法来说,以下哪个陈述正确? A.快速排序时间性能最佳 B.归并排序是稳定的排序方法 C.快速排序是一种选择排序 D.堆排序所用的辅助空间比较大 3. 排序算法的稳定性是指: A.经过排序之后,能使值相同的数据保持原顺序中的相对位置不变。 B.经过排序之后,能使值相同的数据保持原顺序中的绝对位置不变。 C.排序算法的性能与被排序元素的数量关系不大 D.排序算法的性能与被排序元素的数量关系密切 4. 下列序列中哪一个是大顶堆? A. {4,5,3,2,1} B. {5,3,4,1,2} C. {1,2,3,4,5} D. {1,2,3,5,4} 5.若将{3,2,5,4,1}排为升序,则实施快速排序一趟后的结果是? A. {1,2,3,4,5} B. {1,2,4,5,3} C. {1,3,5,4,2} D.{2,5,4,1,3} 6.若将{1,2,3,4,5,6,7,9,8}排为升序,则哪种排序方法的“比较记录”次数最少? A. 快速排序 B. 简单选择排序 C. 直接插入排序 D. 冒泡排序 7.若将{5,4,3,2,1}排为升序,则哪一种排序方法的“移动记录”次数最多? A.快速排序 B.冒泡排序 C.直接插入排序 D.简单选择排序 8. 用简单选择排序将顺序表{2,3,1 ,3,2}(表示重复元素)排为升序,实施排序第一趟后结果是{1 ,3,2 ,3,2}, 则第三趟后的结果是什么? A. {1 ,2,3 ,3′,2′} B.{ 1 , 2 , 2′, 3 , 3′} C.{1, 2, 2 , 3 , 3} D.{1, 2, 2, 3, 3} 9. 下列排序算法中,在某趟结束后不一定选出一个元素放到其最终位置上的排序方法是? A.选择 B.冒泡 C.归并 D.堆 10.下列哪种排序算法是稳定的? A.堆排序 B.直接插入排序 C.快速排序 D.希尔排序 11. 堆排序的时间复杂度为: A.O(n*n) B.O(n*log n) C.O(n) D.O(log n) 填空题(每空4分,共4分): 对n个元素进行归并排序时的空间复杂度是? 综合题(总24分) 1. (12分)有一组待排序的关键字如下:(54, 38, 96, 23, 15, 72, 60, 45,83) 分别写出希尔排序(d=5),快速排序,堆排序和归并排序第一趟升序后的结果。(每种方法各占3分) - 希尔排序: - 快速排序: - 堆排序: - 归并排序: 2. (12分)已知数据序列是(12, 5,9,20,6,31,24),对该项数据进行升序排列。写出直接插入排序、简单选择排序、快速排序、堆排序和二路归并的第一次结果。(每种方法各占两分) - 直接插入排序: - 简单选择排序: - 快速排序: - 堆排序: - 二路归并排 - 基数排序:(注释:原文中基数排序未给出具体序列,故此处保留原样)
  • C语言参考
    优质
    本资料提供了C语言数据结构课程第五章作业的答案和解析,旨在帮助学生理解和掌握相关知识点与解题技巧。 1.两个串相等的充要条件是( )。A.串长度相等 B.串长度任意 C.串中各位置字符任意 D.串中各位置字符均对应相等 2. 对称矩阵的压缩存储:以行序为主序存储下三角中的元素,包括对角线上的元素。二维下标为( i, j ), 存储空间的一维下标为k,给出k与 i, j (i
  • C语言参考
    优质
    本资源提供了C语言数据结构课程第一章习题的标准解答与解析,帮助学生理解和掌握基本概念和编程技巧。 第一章 绪论作业答案(共50分) 一、分析如下程序中 (1)~ (10)各语句的频度。(每个1分,共10分) ```c Ex( ){ int i , j , t ; (1) for(i=1 ; i<10 ; i++) //n = (2) printf(\n %d , i ); //n = (3) for(i=1; i<=2; i++) //n = (4) printf(\n); //n = (5) for(i=1; i<=9; i++) //n = { (6) for(j=1; j <= i ; j++) //n = { (7) t = i * j ; //n = (8) printf(],t); //n = } (9) for(j=1; j<3 ; j++) //n = (10) printf(\n); //n = } } ``` 二、分析如下程序段中指定语句的执行次数(共6分)。 有如下程序段: ```c x = 91 ; y = 100 ; while(y > 0){ if(x > 100) { x -= 10 ; y -- ; } else x ++ ; } ``` 问if语句执行了多少次?(2分) `y--` 执行了多少次? (2分) `x++` 执行了多少次? (2分) 三、回答问题(共25分) 书中16页的起泡排序如下: ```c void bubble_sort(int a[],int n){ //将a中整数序列重新排列成自小至大有序的整数序列。 for(i=n-1,change=TRUE;i>=1&&change;--i){ change=FALSE; for(j=0;ja[j+1]){ a[j] <--> a[j+1]; change = TRUE; } } }//bubble_sort ``` 1.(共15分)分析该算法的最佳情况、最坏情况和平均情况下各自的时间复杂度。(给出分析思路与过程) (1) 最佳情况的时间复杂度分析: (5分) (2) 最坏情况的时间复杂度分析: (5分) (3) 平均情况的时间复杂度分析:(5分) 2.(共10分)比较与C语言书中的起泡排序异同,并从时空效率角度说明谁更优。 四、完成如下选择题(每小题3分,共9分)。 1.设f为原操作,则如下算法的时间复杂度是( ) ```c for (i = 1; i*i<= n; i++) f; ``` A. O(n) B. O(log2n ) C.O(n/2) D. 都不对 2.算法的时间复杂度与( )有关。 A.问题的规模 B.计算机硬件性能 C.编译程序的质量 D.程序设计语言 3.有如下程序段: ```c for(i=n-1;i>=1;i--) for(j=1;j<=i;j++) if(A[j]>A[j+1]) A[j]与A[j+1]对换; ``` 其中n为正整数,则算法在最坏情况下的时间复杂度为( )。 A.O(n) B. O(nlog2n) C.O(n3 ) D. O(n2),
  • C语言参考
    优质
    本资源提供了针对C语言数据结构课程第二章习题的答案和解析,旨在帮助学生理解和掌握相关知识点,提高编程能力。 1. 顺序存储结构中的数据元素之间的逻辑关系是由(C)表示的;链接存储结构中的数据元素之间逻辑关系则是通过(D)来体现。 2. 线性表被定义为一种有限序列,其中可能存在空的情况,即选项A正确描述了线性表的特点:可以为空但并非必须如此。 3. 若已知一维数组采用顺序存储方式,并且每个成员占用4个字节的内存空间。假设第9位元素地址是144,则根据计算公式推断出第一个元素的位置应为(D)即112,因为该位置可以通过减去8*4得到。 4. 在单链表中删除指针p所指向节点之后的那个结点时,正确的操作步骤应该是选项A:将p->next指向当前的下一个结点的下一个结点(p->next->next)来完成跳过目标节点的效果。 5. 如果频繁的操作是在一个单向列表末尾添加或移除元素,则采用(C)带头指针的双循环链表结构可以最有效地节省时间,因为它提供了快速访问两端的能力而无需遍历整个结构。 6.对于二维数组A[7][8]以列为主序存储方式下计算出A[5][3]所在的一维索引值为(D)29。此题考查对多维度数据在内存中如何线性化处理的理解,通过公式推导得出结果。 二、填空题答案如下: 1.顺序表插入新元素的代码片段展示了当需要扩展存储空间时会使用realloc函数来增加数组容量,并且会在指定位置i前进行后移操作以确保新的数据e能被正确放置。最后更新长度并返回成功状态。 2. 删除双向链表节点的操作涉及修改前后指针指向,使它们跳过要删除的结点p;之后释放该结点内存空间从而完成整个过程。 三、编程题: 1. 集合求差集算法的设计目标是在不使用额外存储的情况下从一个集合中移除另一个集合中的所有元素。具体而言,先遍历B找到与A共有的值并标记为特定字符(如##);然后再次扫描A,将未被标记的元素向前移动以填补空缺位置,并更新长度。 2. 删除单向循环链表内指定数值e的所有节点可以通过从头结点开始逐个检查每个后续节点的数据来实现。如果找到匹配项,则通过修改指针关系和释放内存完成删除操作;否则继续前进直到回到起点为止。此算法的时间复杂度为O(n),其中n代表列表长度,因需要最多遍历整个链表一次才能确定所有待移除的元素位置。 以上是关于数据结构中几个关键概念与实践应用题目的详细解析和解答策略说明。
  • C语言参考
    优质
    本资料提供了C语言数据结构课程第三章作业的答案和解析,帮助学生理解并掌握相关概念与算法实现。 1. 经过以下栈运算后,x的值是(A)。InitStack(s); Push(s,a); Push(s,b); Pop(s,x); Gettop(s,x); 2.循环队列存储在数组A[0..m]中,则入队时的操作为(C)。 3. 栈和队列的共同点是(C)。 4. 若用一个大小为6的数组来实现循环队列,且当rear 和 front 的值分别为 0 和 3。当从队列中删除一个元素,再插入两个元素后,rear 和 front 的值分别为:(B)。 5.程序填顺序循环队列的类型定义如下: typedef int ET; typedef struct{ ET *base; int Front; int Rear; int Size; }Queue; Queue Q; 队列Q是否“满”的条件判断为(C)。 6. 若进栈序列为1,2,3,4,进栈过程中可以出栈,则(C)不可能是一个出栈序列。 7.向顺序存储的循环队列Q中插入新元素的过程分为三步:(B)。 8. 关于栈和队列,说法不妥的是(D)。 9. 若用数组S[0..m]作为两个栈S1和S2的共同存储结构,对任何一个栈,只有当S全满时才不能作入栈操作。为这两个栈分配空间的最佳方案是(A)。 二、程序填空题(没特别标注分数的空的为3分,共 23 分)。 1. 下面的算法是将一个整数e压入堆栈S,请在空格处填上适当的语句实现该操作: typedef struct{ int *base; int *top; int stacksize; }SqStack; int Push(SqStack S,int e) { if ( S.top- S.base>= S.stacksize ) { S.base=(int *) realloc(S.base,(S.stacksize+1)*sizeof(int)); if( !S.base ) { printf(Not Enough Memory!\n); return(0); } S.top= S.base+ S.stacksize ; S.stacksize= S.stacksize+1 ; } *S.top++=e; return 1; } 2. 在表达式:6+5+3*7/(4+9/3-2)求值过程中,处理到2时刻,运算符栈的状态为: + / ( - ,操作数栈的内容为11,21,7,2。 3.递调用时,处理参数及返回地址,要用一种称为 栈 的数据结构。 4. 设循环队列中数组的下标范围是1-n,其头尾指针分别为f和r,则其元素个数为(r-f+n) mod n。
  • 广东工大学anyview代码
    优质
    本资源为广东工业大学《数据结构》课程第八章的教学与学习辅助材料,包含AnyView平台上的相关代码示例,旨在帮助学生更好地理解和实践数据结构中的关键概念和算法。 内容涉及广东工业大学数据结构anyview的第二章相关练习题。由于能力有限,这里仅提供一个参考答案供大家参考。
  • 广东工大学anyview代码
    优质
    本资料为广东工业大学《数据结构》课程第六章的学习资源,包含AnyView平台上的实验指导与相关代码示例,旨在帮助学生理解和掌握章节内容。 内容包括广东工业大学数据结构anyview的相关练习第二章,能力有限给大家一个参考。
  • 广东工大学anyview代码
    优质
    本资源为广东工业大学《数据结构》课程中第二章节的相关代码集锦,使用AnyView平台展示,包含链表、栈和队列等基础数据结构实现。适合学习与参考。 内容包括广东工业大学数据结构anyview的相关练习第二章,能力有限给大家一个参考。
  • 广东工大学anyview代码
    优质
    本资源为广东工业大学数据结构课程第七章的教学与学习材料,包含AnyView平台上的配套代码,旨在帮助学生更好地理解和实践相关知识点。 内容包括广东工业大学数据结构anyview的相关练习第二章,能力有限给大家一个参考。