1、1软件技术基础习题答案习题3四、1intcompare(SeqList*La,SeqList*Lb) inti;i=1;while(ilastif(ilast/ABif(iLa-last/ALa-last/A=B四、2(1)顺序表intinvert(SeqList*L)2inti=1;datatypetemp;while(ilast/2) temp=L-datai;L-datai=L-dataL-last-i+1;L-dataL-last-i+1=temp;(2)链表voidinvert(linklist*head) linklist*p,*q,*r;p=head-next;q=p-next;
2、while(q!=NULL) r=q-next;q-next=p;p=q;q=r;3head-next-next=NULL;head-next=p;四、5voidmergelist(Linear_list*La,Linear_list*Lb,Linear_list* /产生C表的头结点 头插法Lc-next=NULL;while(La-next!=NULLLa-next=La-next-next;insert(Lc,p);else p=Lb-next;Lb-next=Lb-next-next;insert(Lc,p);4while(La-next!=NULL) p=La-next;La-nex
3、t=La-next-next;insert(Lc,p);while(Lb-next!=NULL)p=Lb-next;Lb-next=Lb-next-next;insert(Lc,p);/O(Length(La)+Length(Lb)voidinsert(Linear_list*Lc,Linear_list*p) p-next=Lc-next;Lc-next=p;/O(1)四、8voiddeleteFront(Link*s)5 Link*p=s,*q;while(p-next-next!=s)p=p-next;q=p-next;p-next=s;free(q);习题4四、1intsymmetry
4、(linklist*head,stack*s)/具有头结点的单链表中存放有一个字符串,每个结点的数据域存放一个字符。/head为单链表的头指针,s为栈的结构体指针 intn=length(head)/2;linklist*p=head-next;datatypex;for(inti=0;idata);p=p-next;6if(length(head)%2=1) p=p-next;while(p!=NULL)x=pop(s);if(x=p-data) p=p-next;elsereturn0;return1;四、3voiddelete(Stack*s) Stack*temp;datatypex;
5、InitS(temp);while(!EmptyS(s) x=Pop(s);if(x!=m)Push(temp,x);while(!Empty(temp)Push(s,Pop(temp);7四、4intcorrect(char*exp) InitStack(S);intflag=1;i=0;while(expi!=0 /遇左括号入栈if(expi=)if(Pop(S)!=()flag=0;if(expi=)if(Pop(S)!=)flag=0;if(expi=)if(Pop(S)!=)flag=0;/遇右括号出栈,若栈顶不是左括号,则括号不配对i+;if(!Empty(S)flag=0; /若
6、栈非空,则括号不配对return flag;四、6循环队列的结构类型定义:constintm=5;8typedefintdatatype;typedefstruct datatypesequm;int rear,quelen;qu;说明:队满条件:sq-quelen=m 队空条件:sq-quelen=0(注意:不需要空出一个位置)入队:voidenqueue(qu*sq,datatypex) if(sq-quelen=m) printf(“queueisfull“);elsesq-quelen+;sq-rear=(sq-rear+1)%m; /修改队尾指针sq-sequsq-rear=x;出队
7、:int dequeue(qu*sq,datatype return0;else sq-quelen-;x=sq-sequ(sq-rear-sq-quelen+m)%m;return1;9习题5四、3(1)顺序串int Equal(SeqString*S,SeqString*T)/比较顺序串S、T是否相等 i=0;while(S-chi = = T-chi )if(i=S-length)elsereturn0;(2)链串int Equal(LinkString*S,LinkString*T)/比较链串S、T是否相等p=S-next;q=T-next;while(S-data = T-data
8、)q=q-next;if(p=NULL)elsereturn0;四、7voidstrDelete(char*S,inti,intm)chartemp80;intk;k=i-1;if(i=strlen(S)return;else strncpy(temp,S,k);if(k+m=strlen(S)strcpy(temp+k,“0“);elsestrcpy(temp+k,S+k+m);strcpy(S,temp);或者:voidstrDelete(seqstring*S,inti,intm)11/字符串中字符的序号从1开始,数组元素从下标0开始使用 chartempmaxsize;if(ilen)
9、strncpy(temp,S-str,i-1);/将S-str中第i个字符之前的i-1个字符复制到temp中strcpy(temp+i-1,S-str+i+m-1);/将S-str中第i+m个字符开始的字符连接到temp之后strcpy(S-str,temp);/将temp复制到S-str中if(ilen)if(i+m-1len)S-len=S-len-m; /删除了字符串中间的部分字符elseS-len=i-1; /删除了字符串中从第i个字符开始的全部字符四、9voidcreate(Spmatrix*a) scanf(“%d,%d,%d“,for(ano=0;anot;ano+)12scan
10、f(“%d,%d,%d“,四、11voidminmax(array*p)/找马鞍点 int i,j,have=0;for(i=0;imini=p-Ai0;for(j=1;jAijmini)p-mini=p-Aij;/分别找出m行的最小值for(j=0;jmaxj=p-A0j;for(i=1;iAijp-maxj)p-maxj=p-Aij;/分别找出n列的最大值for(i=0;imini=p-maxj)/若相等,则是一个马鞍点 coutAijlchild);t2=swap(p-rchild);p-lchild=t2;p-rchild=t1;returnp;12、已知结点序列21,18,37,42
11、,65,24,19,26,45,25,画出相应的二叉排序树,并画出删除结点37后的二叉排序树。有问题(1) (2)删除结点37后14某密码电文由8个字母组成,每个字母在电文中的出现频率分别是7、19、2、6、32、3、21、10,试为这8个字母设计相应的哈夫曼编码。15解:这8个字母可用A、B、C、D、E、F、G、H表示组成的哈夫曼编码如下所示。A:1001 B:101 C:0010 D:1000E:11 F:0011 G:01 H:000设计的哈夫曼树如下:哈夫曼树第七章四、4、邻接表:1 2 6 null2 1 3 6 null3 2 4 null4 3 5 null5 4 7 null6
12、 1 2 7 null7 5 6 null16DFS:1234576 BFS:1263745(不唯一)或16273545、按顺序输入后的邻接表:1 2 6 4 3 5 null2 1 6 null3 1 4 5 null4 1 6 3 5 null5 6 4 1 3 null6 1 2 4 5 null6、从顶点4开始:DFS:4 1 2 6 5 3 (有多种)BFS:4 1 3 5 6 2 (不唯一)7最小生成树:7 61 52 43第八章174、查找58612 3 4 5 6 7 8 9 10 11 1213 1415 16687155188150465505508511586656670
13、700766897908Low=1high=16mid=(1+16)/2=8 R8508586Low=9 high=12-1=11 mid=(9+11)/2=10R10=586586=R10 查找成功5线性探查 13HT 0 1 2 3 4 5 6 7 8 9 10 11 1252 26 15 120 43 11 84 70 99 92 37 25H(key) 0 0 2 3 4 11 6 2 8 4 11 12比较 1 2 1 1 1 8 1 6 1 6 1 1拉链0 52,2612 15,703 120184 43,8256 8478 9991011 37,1112 25给定关键字序列为(
14、105,50,30,25,85,40,100,12,10,28,分别写出直接插入排序、希尔排序、起泡排序、直接选择排序、快速排序和归并排序的每一趟运行结果。直接插入排序:初始关键字序列:105,50,30,25,85,40,100,12,10,28第一趟直接插入排序:【50,105】第二趟直接插入排序:【30,50,105】第三趟直接插入排序:【25,30,50,105】第四趟直接插入排序:【25,30,50,85,105】第五趟直接插入排序:【25,30,40,50,85,105】第六趟直接插入排序:【25,30,40,50,85,100,105】第七趟直接插入排序:【12,25,30,40
15、,50,85,100,105】19第八趟直接插入排序:【10,12,25,30,40,50,85,100,105】第九趟直接插入排序:【10,12,25,28,30,40,50,85,100,105】希尔排序(增量为5,3,1):初始关键字序列:105,50,30,25,85,40,100,12,10,28第一趟希尔排序:40,50,12,10,28,105,100,30,25,85第二趟希尔排序:10,28,12,40,30,25,85,50,105,100第三趟希尔排序:10,12,25,28,30,40,50,85,100,105起泡排序:初始关键字序列:105,50,30,25,85,
16、40,100,12,10,28第一趟起泡排序:10,105,50,30,25,85,40,100,12,28第二趟起泡排序:10,12,105,50,30,25,85,40,100,28第三趟起泡排序:10,12,25,105,50,30,85,40,100,28第四趟起泡排序:10,12,25,28,105,50,30,85,40,100第五趟起泡排序:10,12,25,28,30,105,50,85,40,100第六趟起泡排序:10,12,25,28,30,40,105,50,85,10020第七趟起泡排序:10,12,25,28,30,40,50,105,85,100第八趟起泡排序:10
17、,12,25,28,30,40,50,85,105,100第九趟起泡排序:10,12,25,28,30,40,50,85,100,105直接选择排序:初始关键字序列:105,50,30,25,85,40,100,12,10,28第一趟选择排序:10,50,30,25,85,40,100,12,105,28第二趟选择排序:10,12,30,25,85,40,100,50,105,28第三趟选择排序:10,12,25,30,85,40,100,50,105,28第四趟选择排序:10,12,25,28,85,40,100,50,105,30第五趟选择排序:10,12,25,28,30,40,100,
18、50,105,85第六趟选择排序:10,12,25,28,30,40,50,100,105,85第七趟选择排序:10,12,25,28,30,40,50,85,100,105(完成)第八趟选择排序:10,12,25,28,30,40,50,85,100,105第九趟选择排序:10,12,25,28,30,40,50,85,100,10521快速排序:初始关键字序列:105,50,30,25,85,40,100,12,10,28第一趟快速排序:(28,50,30,25,85,40,100,12,10),105第二趟快速排序:(10,12,25),28,(85,40,100,30,50),105第
19、三趟快速排序:10,12,25,28,(50,40,30),85,(100),105第四趟快速排序:10,12,25,28,(30,40),50,85,100,105第五趟快速排序:10,12,25,28,(30,40),50,85,100,105归并排序:初始关键字序列:105,50,30,25,85,40,100,12,10,28第一趟归并排序:50,105,25,30,40,85,12,100,10,28第二趟归并排序:25,30,50,105,12,40,85,100,10,28第三趟归并排序:10,12,25,28,30,40,50,85,100,105设待排序的关键字序列为(15,
20、21,6,30,23,6,20,17),22试分别写出使用以下排序方法每趟排序后的结果。并说明做了多少次比较。(1) 直接插入排序 (2) 希尔排序(增量为5,2,1) (3) 起泡排序(4) 快速排序 (5) 直接选择排序 (6) 锦标赛排序(7) 堆排序 (8) 二路归并排序 (9) 基数排序【解答】 (2) 希尔排序(增量为5,2,1)初始关键字序列: 15,21,6,30,23,6,20,17第一趟希尔排序: 6,20,6,30,23,15,21,17第二趟希尔排序: 6,15,6,17,21,20,23,30第三趟希尔排序: 6,6,15,17,20,21,23,30(3) 起泡排序
21、初始关键字序列:15,21,6,30,23,6,20,17第一趟起泡排序:15,6,21,23,6,20,17,30第二趟起泡排序:6,15,21,6,20,17,23,30第三趟起泡排序:6,15,6,20,17,21,23,30第四趟起泡排序:6,6,15,17,20,21,30,23第五趟起泡排序:6,6,15,17,20,21,30,23(4) 快速排序初始关键字序列: 15,21,6,30,23,6,20,17第一趟快速排序: 【6,6】15【30,23,21,20,17】23第二趟快速排序: 6,6, 15【17,23,21,20】30第三趟快速排序: 6,6, 15,17【23,
22、21,20】30第四趟快速排序: 6,6, 15,17,【20,21】23,30第五趟快速排序: 6,6,15,17,20,21,30,23(5) 直接选择排序初始关键字序列: 15,21,6,30,23,6,20,17第一趟直接选择排序: 6,21,15,30,23,6,20,17第二趟直接选择排序: 6,6,15,30,23,21,20,17第三趟直接选择排序: 6,6,15,30,23,21,20,17第四趟直接选择排序: 6,6,15,17,23,21,20,30第五趟直接选择排序: 6,6,15,17,20,21,23,30第六趟直接选择排序: 6,6,15,17,20,21,23,
23、30第七趟直接选择排序: 6,6,15,17,20,21,23,30(6) 锦标赛排序初始关键字序列: 15,21,6,30,23,6,20,17(此题答案的格式不对,我删去了)锦标赛排序的基本思想是:首先对n个待排序记录的关键字进行两两比较,从中选出n/2个较小者再两两比较,直到选出关键字最小的记录为止,此为一趟排序。我们将一趟选出的关键字最小的记录称为“冠军”,而“亚军”是从与“冠军”比较失败的记录中找出,具体做法为:输出“冠军”后,将(冠军)叶子结点关键字改为最大,继续进行锦标赛排序,直到选出关键字次小的记录为止,如此循环直到24输出全部有序序列。上面给出了排在前三个的记录,详细过程略。
24、(7) 堆排序初始关键字序列:15,21,6,30,23,6,20,17初始堆: 6,17,6,21,23,15,20,30第一次调堆: 6,17,15, 21,23,30,20,【6】第二次调堆: 15,17,20,21,23,30,【6,6】第三次调堆: 17,21,20,30,23,【15,6,6】第四次调堆: 20,21,23,30,【17,15,6,6】第五次调堆: 21,30,23,【20,17,15,6,6】第六次调堆: 23,30,【21,20,17,15,6,6】第七次调堆: 30,【23,21,20,17,15,6,6】堆排序结果调堆:【30,23,21,20,17,15,
25、6,6】(8) 二路归并排序初始关键字序列: 15,21,6,30,23,6,20,17二路归并排序结果:15,17,20,21,23,30,6,6final first(9) 基数排序初始关键字序列:p15216302362017第一次分配得到:B0.f3020B0.eB1.f21B1.eB3.f23B3.e25B5.f15B5.eB6.f66B6.eB7.f17B7.e第一次收集得到:p30202123156617第二次分配得到B0.f66B0.eB1.f1517B1.eB2.f202123B5.eB3.f30B3.e第二次收集得到p66151720212330基数排序结果:6,6,15,17,20,21,23,30