计算机软件技术基础 习题一解答(15页).doc
《计算机软件技术基础 习题一解答(15页).doc》由会员分享,可在线阅读,更多相关《计算机软件技术基础 习题一解答(15页).doc(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-第 1 页计算机软件技术基础 习题一解答-第 2 页n1in1j3n1kn1习题解答3.设n为正整数,分析下列各程序段中加下划线的语句的执行次数。(1)for(int i=1;i=n;i+)for(int j=1;j=n;j+)cij=0.0;for(int k=1;k=n;k+)cij=cij+aik*bkj;(2)x=0;y=0;for(int i=1;i=n;i+)for(int j=1;j=i;j+)for(int k=1;k=j;k+)x=x+y;(3)int i=1,j=1;while(i=n&j=n)i=i+1;j=j+i;(4)*int i=1;dofor(int j=1;j
2、=n;j+)i=i+j;while(iarraySize 或者对于某一个 k(0 k n),使得 k!*2k maxInt 时,应按出错处理。可有如下三种不同的出错处理方式:(1)用 printf 显示错误信息及 exit(1)语句来终止执行并报告错误;(2)用返回整数函数值 0,1 来实现算法,以区别是正常返回还是错误返回;(3)在函数的参数表设置一个引用型的整型变量来区别是正常返回还是某种错误返回。试讨论这三种方法各自的优缺点,并以你认为是最好的方式实现它。【解答】#include const int arraySize=100;const int MaxInt=0 x7fffffff;i
3、nt calc(int T,int n)int i,value=1;T0=1;if(n!=0)int edge=MaxInt/n/2;for(i=1;i edge)return 0;value*=n*2;Tn=value;printf(A%d=%dn”,n,Tn);return 1;void main()int AarraySize;int i;for(i=0;i length;for(int i=0;i datai;A-datai=A-datan-i-1;A-datan-i-1=tmp;时间复杂度:需进行 n/2 次循环,因此时间复杂度为 O(n);空间复杂度:使用一个整形辅助存储单元 tm
4、p,因此空间复杂度为 O(1)。6.顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下,对有 127个元素的顺序表进行插入,平均需要移动多少个元素?删除一个元素,又平均需要移动多少个元素?【解答】若设顺序表中已有 n 个元素。又设插入或删除表中各个元素的概率相等,则在插入时因有 n+1 个插入位置(可以在表中最后一个表项后面追加),每个元素位置插入的概率为1/(n+1),但在删除时只能在已有n个表项范围内删除,所以每个元素位置删除的概率为1/n。插入时平均移动元素个数 AMN(Averagy Moving Number)为删除时平均移动元素个数 AMN 为7.利用顺序表的操作,
5、实现以下的函数。并分析你所编制的函数的时间复杂度,并分析(2)与(3)的时间复杂度出现差异的原因。(1)从顺序表中删除具有给定值 x 的所有元素。(2)从顺序表中删除其值在给定值 s 与 t 之间(要求 s 小于 t)的所有元素。(3)从有序顺序表中删除其值在给定值 s 与 t 之间(要求 s 小于 t)的所有元素。(4)将两个有序顺序表 la,lb 合并成一个新的有序顺序表 lc。(5)从顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。【解答】(1)从顺序表中删除具有给定值 x 的所有元素。void DelValue(listtype*L,int x)int i=0,j;whil
6、e(i length)/*循环,寻找具有值 x 的元素并删除它*/if(L-datai=x)/*删除具有值 x 的元素,后续元素前移*/for(j=i;j length-1;j+)L-dataj=L-dataj+1;L-length-;/*表长减 1*/else i+;(2)实现删除其值在给定值 s 与 t 之间(要求 s 小于 t)的所有元素的函数如下:void DelValue_s_to_t(listtype*L,int s,int t)int i,j;if(L-length=0|s=t)printf(“List is empty or parameters are illegal!n”)
7、;exit(1);i=0;while(i length)/*循环,寻找具有值 x 的元素并删除它*/if(L-datai=s&L-datai=t)/*删除满足条件的元素,后续元素前移*/for(j=i;j length-1;j+)L-dataj=L-dataj+1;-第 5 页L-length-;/*表长减 1*/else i+;(3)实现从有序顺序表中删除其值在给定值 s 与 t 之间的所有元素的函数如下:void DelValue_s_to_t_1(listtype*L,int s int t)int i,j,k;if(L-length=0|s=t)printf(“List is empt
8、y or parameters are illegal!n”);exit(1);for(i=0;i length;i+)/*循环,寻找值 s 的第一个元素*/if(L-datai=s)break;/*退出循环时,i 指向该元素*/if(i length)for(j=1;i+j length;j+)/*循环,寻找值 t 的第一个元素*/if(L-datai+j t)break;/*退出循环时,i+j 指向该元素*/for(k=i+j;k length;k+)/*删除满足条件的元素,后续元素前移*/L-datak-j=L-datak;L-length-=j;/*表长减 j*/(4)实现将两个有序顺
9、序表合并成一个新的有序顺序表的函数如下:listtype*Merge(listtype*LA,listtype*LB)/*合并有序顺序表 LA 与 LB 成为一个新的有序顺序表并由函数返回listtype*LC;int value1,value2;int i,j,k;initiatelist(LC);if(LA-length+LB-length MAXSIZE)printf(“表上溢/n”;exit(1);i=0,j=0,k=0;value1=LA-datai;value2=LB-dataj;while(i length&j length)/*循环,两两比较,小者存入结果表*/if(value
10、1 datak=value1;i+;value1=LA-datai;else LC-datak=value2;j+;value2=LB-dataj;k+;while(i length)/*当 LA 表未检测完,继续向结果表传送*/LC-datak=value1;i+;k+;value1=LA-datai;while(j length)/*当 LB 表未检测完,继续向结果表传送*/LC-datak=value2;j+;k+;value2=LB-dataj;LC-length=k;return LC;(5)实现从表中删除所有其值重复的元素的函数如下:void DelDouble(listtype*
11、L)int i,j,k;int tmp;-第 6 页if(L-length=0)printf(“表空n”;exit(1);i=0;while(i length)/*循环检测*/j=i+1;tmp=L-datai;while(j length)/*对于每一个 i,重复检测一遍后续元素*/if(tmp=L-dataj)/*如果相等,删除此结点,后续元素前移*/for(k=j+1;k length;k+)L-datak-1=L-datak;L-length-;/*表最后元素位置减 1*/else j+;i+;/*检测完 L-datai,检测下一个*/8.线性表可用顺序表或链表存储。试问:(1)两种存
12、储表示各有哪些主要优缺点?(2)如果有 n 个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用哪种存储表示?为什么?(3)若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时,应采用哪种存储表示?为什么?【解答】(1)顺序存储表示是将数据元素存放于一个连续的存储空间中,实现顺序存取或(按下标)直接存取。它的存储效率高,存取速度快。但它的空间大小一经定义,在程序整个运行期间不会发生改变,因此,不易扩充。同时,由于在插入或删除时,为保持原有次序,平均需要移动一半(或近一半)元素,修改效率不高。链接存储表示的存储空间一般在程
13、序的运行过程中动态分配和释放,且只要存储器中还有空间,就不会产生存储溢出的问题。同时在插入和删除时不需要保持数据元素原来的物理顺序,只需要保持原来的逻辑顺序,因此不必移动数据,只需修改它们的链接指针,修改效率较高。但存取表中的数据元素时,只能循链顺序访问,因此存取效率不高。(2)如果有 n 个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用链接存储表示。如果采用顺序存储表示,必须在一个连续的可用空间中为这 n 个表分配空间。初始时因不知道哪个表增长得快,必须平均分配空间。在程序运行过程中,有的表占用的空间增长得快,有的表占用的空间增长得慢;有的表
14、很快就用完了分配给它的空间,有的表才用了少量的空间,在进行元素的插入时就必须成片地移动其他的表的空间,以空出位置进行插入;在元素删除时,为填补空白,也可能移动许多元素。这个处理过程极其繁琐和低效。如果采用链接存储表示,一个表的存储空间可以连续,可以不连续。表的增长通过动态存储分配解决,只要存储器未满,就不会有表溢出的问题;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储申请要求,非常灵活方便。对于 n 个表(包括表的总数可能变化)共存的情形,处理十分简便和快捷。所以选用链接存储表示较好。(3)应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数
15、基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。/*-链表结构的定义.为简化起见,表元素我们使用整型数据-此链表带头结点-*/typedef struct mynode-第 7 页int data;/*数据域:整型*/struct mynode*next;/*指针域*/node,linklisttype;9.试写出计算线性链表长度的算法。int lengthsl(linklisttype*L)linklisttype*p;int len;if(L=NULL)return 1;p=L-next;/*p 指向链表 L 的头结点*/len=0;while(
16、p!=NULL)len+;p=p-next;return len;10.设有一个表头指针为 h 的单链表。试设计一个算法,通过遍历一趟链表,将链表中所有结点的链接方向逆转,如下图所示。要求逆转结果链表的表头指针 h 指向原链表的最后一个结点。【解答】void LinkListInverse(linklisttype*L)linklisttype*p,*pre,*next;if(L=NULL|L-next=NULL)return;/*表未初始化,或为空表*/p=L-next;pre=L;while(p!=NULL)/*循环修改链表中所有结点的后继指针的指向*/next=p-next;/*取当前结
17、点的后继指针*/p-next=pre;/*当前结点的后继改为指向其原来的前驱*/pre=p,p=next;/*指针后移*/L-next-next=NULL;/*原第一个结点改为最后一个结点*/L-next=pre;/*链表的头结点指向原最后一个结点*/11.设有一线性链表,其结点值均为整数。试将该线性链表分解为两个线性链表,其中一链表中的结点值均为负整数,而另一链表中结点的值均为正整数,并删除结点值为零的结点。【解答】void LinkListDispose(linklisttype*L,linklisttype*LA,linklisttype*LB)将链表 L 分解为 LA、LB 两个链表,
18、其中 LA 中结点值均为正,LB 中结点值均为负,并删除结点值为零的结点,最后释放 L 的头结点。linklisttype*p,*pt,*pa,*pb;LA=initiatesl();pa=LA;/*指向 LA 中的最后一个结点*/LB=initiatesl();pb=LB;/*指向 LB 中的最后一个结点*/If(L=NULL|L-next=NUUL)return;/*L 为空指针或 L 为空表*/p=L-next;/*p 指向链表 L 的第一个结点*/while(p!=NULL)/*遍历链表 L*/if(p-data 0)/*将 p 链入链表 LA 的 pa 后*/-第 8 页pa-nex
19、t=p;pa=p;p=p-next;elseif(p-data next=p;pb=p;p=p-next;else/*删除值为 0 的结点*/pt=p-next;/*记录当前结点的后继,以便删除当前结点*/free(p);p=pt;pa-next=NULL;pb-next=NULL;free(L);12设 ha 和 hb 分别是两个带表头结点的非递减有序单链表的表头指针,试设计一个算法,将这两个有序链表合并成一个非递减有序的单链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间。表中允许有重复的数据。【解答】void linklistMerge(linklisttype*L
20、A,linklisttype*LB)/*合并有序链表 LA 与 LB,结果存入 LA 中,并释放 LB 的头结点*/linklisttype*pa,*pb,*pre,*pn;if(LA=NULL|LB=NULL|)return;if(LA-next=NULL)/*LA 为空表,则直接将 LB 链入 LA 即可*/LA-next=LB-next;free(LB);retrun;if(LB-next=NULL)return;/*LB 为空表,则直接返回即可*/pa=LA-next,pb=LB-next,pre=LA;while(pa!=NULL&pb!=NULL)/*循环,两两比较,小者存入结果表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件技术基础 习题一解答15页 计算机软件 技术 基础 习题 解答 15
限制150内