作业参考答案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

}
三、算法设计 1. 编写一个程序将单链表中值重复的结点删去,使所得的该表中各结点值均不相同的算法
算法:令p指针指向所建单链表的第一个结点,令q指向p的后继结点,q沿着链表向右(向后)扫描,若 找到与p所指结点值相同的结点,则将其删除,继续处理,直到q为空;然后令p移到下一个结点 (即直接后继结点),q依然指向p的后继结点,重复同样的处理
解答:(1)平均查找长度不相同。在有序的 顺序表中查找时,在n+1(1~n+1)个位置均可 能失败;查找无序的顺序表时,查找失败 都是在第n+1个位置,其平均查找长度是 n+1。 (2)平均查找长度相同。在n个位置上均 可能成功。 (3)平均查找长度不相同。前者在某个位 置上(1<=i<=n)查找成功时,和关键字K相等 的记录是连续的,而后者要查找完顺序表 的全部记录。
2、求顺序表(或单链表)的逆序算法
void invert(SqList &A)//顺序表的就地逆置 { for(i=1,j=A.length;i<j;i++,j--) A.elem[i]<->A.elem[j]; }//invert LinkedList invert(LinkedList head) ∥逆置单链表 { p=head->next; ∥p为工作指针,指向第一个元素 head->next=NULL; ∥置空链表 while(p!=NULL) ∥将原链表的元素按头插法插入 {r=p->next; ∥暂存p的后继 p->next=head->next;∥逆置(头插法插入) head->next=p; ∥头结点的指针域指向新插入的结点 p=r; ∥恢复待处理结点 } return(head); }∥invert
6.以下为直接插入排序的算法。请分析算法,并在________上填充适当 的语句。 void straightsort(list r); {for(i= 1 ;i<=n;i++) { r[0]=r[i];j=i-1; while(r[0].key<r[j].key){r[j+1]=_r[j]_ ;j--;} r[j+1]= r[0]__; } } 7.对快速排序来讲,其最好情况下的时间复杂度是_O(nlog2n),其最坏 情况下的时间复杂度是_O(n2)。 8.分别采用堆排序、快速排序、插入排序和归并排序算法对初始状态为 递增序列的表按递增顺序进行排序,最省时间的是__插入排序算法, 最费时间的是快速排序算法。
二、单项选择 1. 以下说法错误的是 ( ) ①直接插入排序的空间复杂度为O(1)。 ②快速排序附加存储开销为O(log2n)。 ③堆排序的空间复杂度为O(n)。 ④二路归并排序的空间复杂度为O(n),需要附加两倍的存储开销。 2. 以下不稳定的排序方法是 ( ) ①直接插入排序 ②冒泡排序 ③直接选择排序 ④二路归并排 序 3. 以下稳定的排序方法是 ( ) ①快速排序 ②冒泡排序 ③直接选择排序 ④ 堆排序 4. 以下时间复杂性不是O(n2)的排序方法是 ( ) ①直接插入排序 ②二路归并排序 ③冒泡排序 ④直接选择排序 5. 以下时间复杂性不是O(nlog2n)的排序方法是 ( ) ①堆排序 ② 直接插入排序 ③二路归并排序 ④快速排序 6. 在文件局部有序或文件长度较小的情况下,最佳的排序方法 是 ( ) ①直接插入排序 ② 冒泡排序 ③ 直接选择排序 ④归并排序

9.已知二叉树的 后序序列 DMFBHELGCA 请构造该二叉树。
中序序列 DBMFAHECGL
第五章作业
一、填空
1.若待排序的序列中存在多个记录具有相同的键值,经过排 序,这些记录的相对次序仍然保持不变,则称这种排序方 法是 稳定 的,否则称为不稳定 的。 2.按照排序过程涉及的存储设备的不同,排序可分为内部 排 序和_外部 排序。 3.按排序过程中依据的不同原则对内部排序方法进行分类, 主要有:插入排序、交换排序、选择排序、归并排序等四 类。 4.在排序算法中,分析算法的时间复杂性时,通常以关键字 比较和移动为标准操作。评价排序的另一个主要标准是执 行算法所需要的辅助空间。 5.常用的插入排序方法有__直接插入排序、折半插入排序、 二路 插入排序和 希尔 插入排序。
linklist *deletesamenode(linklist *h) { linklist *p,*q,*s; p=h->next; s=p; while(p!=NULL) { q=p->next; while(q!=NULL) { if(q->data!=p->data) {s=q; // s为q的直接前趋指针,即s紧跟着q向右移动。 q=q->next; } else { s->next=q->next; //此时q所指向的结点为待删除结点 free(q); q=s->next; //q指向后继结点,继续寻找与p所指结点值相同的结点。 } } //内while循环结束 p=p->next;
2.假定有n个关键字,它们具有相同的哈希函 数值,用线性探测方法把这n个关键字存入 到哈希表中要做多少次探测?
解答:n个关键字都是同义词,因此,用线性探测法将第一个 关键字存入时不会发生冲突,对其余关键字存入时都会发 生冲突,所以探测的次数应为1+2+3+...+ n=n(n+1)/2次。
3.设有一组关键字{9,01,23,14,55,20, 84,27},采用哈希函数:H(key)=key % 7 ,表长为10,用开放地址法的二次探测再 散列方法Hi=(H(key)+di) % 10(di=1^2,2^2, 3^2,…,)解决冲突。要求:对该关键字序 列构造哈希表,并计算查找成功的平均查 找长度。
第六章作业
1 若对长度均为n的有序的顺序表和无序的顺序表分 别进行顺序查找,试在下列三种情况下分别讨论 二者在等概率情况下平均查找长度是否相同? (1)查找不成功,即表中没有和关键字K相等的记 录; (2)查找成功,且表中只有一个和关键字K相等的 记录; (3)查找成功,且表中有多个和关键字K相等的记 录,要求计算有多少个和关键字K相等的记录。
答案:把线性表L中的元 素由小到大排序
2. 若x为给定的值,读下列程序后,说明该序的主要功 能是什么?
calculate (stuct sNode *HL, elemtype &x) { int n=0; listnode sNode *p=HL; 答案:统计链表HL中值等于 while (p!=null) { X的结点个数 if(p→data = =x) n++; p =p →next; } return n; }
6.向一个栈顶指针为Top的链中插入一个s所指 结点时,其操作步骤为 ( ) A. Top->next=s B. s->next=Top->next;Top->next=s C. s->next=Top;Top=s D. s->next=Top;Top=Top->next
7.循环队列的优点是什么?如何判断“队空”、 “队满”?
作业参考答案
第二章作业
二、读下列程序后,说明该程序有些什么主要的功能 1. 若线性表L是无序的,问下列程序的功能是什么?
Void sortlist ( struct List &L ) { int i, j; elemtype x; for( i=1;i<L.size;i++) { //把无序表的第一个元素暂存于x x=L.list[i] //向前顺序进行比较和移动 for( j=i-1;j>=0;j--) if (x<L.list[j]) L.list[j+1]=L.list[j]; else break; //把x写到已空出的j+1位置 L.list[j+1]=x; } }
42,54,63,72,87,95)进行折半查 找,试回答下列问题:(1) 若查找元素 54,需依次与哪些元素比较?(2) 若查 找元素90,需依次与哪些元素比较?(3) 假定每个元素的查找概率相等,求查 找成功时的平均查找长度。
第四章作业
1.有关二叉树下列说法正确的是( ) A.二叉树的度为2 B.一棵二叉树的度可以小于2 C.二叉树中至少有一个结点的度为2 2. 已知一棵完全二叉树的第6层(设根是第1层)有wenku.baidu.com个叶结点,则该完 全二叉树的结点个数最多是( ) A. 39 B. 52 C. 111 D. 119 3. 已知一棵完全二叉树中共有626个结点,叶子结点的个数应为( )。 A. 311 B. 312 C. 313 D. 314 E. 其它 4. 一棵树高为K的完全二叉树至少有( )个结点 A. 2k –1 B. 2k-1 –1 C. 2k-1 D. 2k 5.设无向图的顶点个数为n,则该图最多有( )条边。 A.n-1 B.n(n-1)/2 C.n(n+1)/2 D.0 E.N2
循环队列解决了常规用的数组表示队列时出现的“假溢出” (即队列未满但不能入队)。在循环队列中,仍用队头指 针等于队尾指针表示队空,而用牺牲一个单元的办法表示 队满:即当队尾指针加1(取模)等于队头指针时,表示 队列满。也有使用全部单元,通过设标记来解决“空”和 “满”的。第三种办法是一个队头(或队尾)指针加上队 列中元素个数来区分队列的“空”和“满”的。
平均查找长度: ASLsucc=(1+1+1+2+3+4+1+2)/8=15/8 以关键字27为例:H(27)=27%7=6(冲突) H1=(6+1)%10=7(冲突) H2=(6+2^2)%10=0(冲突) H3=(6+3^3)%10=5 所 以比较了4次。
4.假定对有序表:(3,4,5,7,24,30,
6.要连通具有n个顶点的有向图,至少需要()条边。 A.n-l B.n C.n+l D.2n 7.一个有n个结点的图,最少有( B )个连通分量,最多有( D )个连通分量。 A.0 B.1 C.n-1 D.n
8.用邻接表存储图所用的空间大小 A. 与图的顶点数和边数都有关 B. 只与图的边数有关 C. 只与图的顶点数有关 D. 与边数的平方有关
3.下列程序的主要功能是什么?
m( struct sNode *HL)
{
答案:查找链表HL中 最大元素所在的位置
if( HL= = null) return null; struct sNode *pmax = HL, p = HL→link; while (P!=null) { if ( p→data>pmax→data) pmax = p; p =p→link; } return pmax;
5.循环队列的人队操作应为 ( ) A.sq.rear=sq.rear+1 sq.data[sq.rear]=x B. sq.data[sq.rear]=x sq.rear=sq.rear+1 C. sq.rear=(sq.rear+1)% maxsize sq.data[sq.rear]=x D. sq.data[sq.rear]=x sq.rear=(sq.rear+1)% maxsize
作 业
1. 为解决计算机主机与打印机之间速度不匹 配问题,通常设置一个打印数据缓冲区, 主机将要输出的数据依次写入该缓冲区, 而打印机则依次从该缓冲区中取出数据。 该缓冲区的逻辑结构应该是 A. 栈 B. 队列 C. 树 D. 图
2. 设栈S和队列Q的初始状态均为空,元素 a,b,c,d,e,f,g依次进入栈S。若每个元素出栈 后立即进入队列Q,且7个元素出队的顺序 是b,d,c,f,e,a,g,则栈S的容量至少是 A. 1 B. 2 C. 3 D. 4
3.顺序队列的入队操作应为 ( ) A.sq.rear=sq.rear+1 sq.data[sq.rear]=x B. sq.data[sq.rear]=x sq.rear=sq.rear+1 C. sq.rear=(sq.rear+1)% maxsize; sq.data[sq.rear]=x D. sq.data[sqrear]=x sq.rear=(sq.rear+1)% maxsize
相关文档
最新文档