西电 C++ 面向对象程序设计 软件技术基础 课后答案Word下载.docx
《西电 C++ 面向对象程序设计 软件技术基础 课后答案Word下载.docx》由会员分享,可在线阅读,更多相关《西电 C++ 面向对象程序设计 软件技术基础 课后答案Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
q->
next=p;
p=q;
q=r;
head->
next->
next=NULL;
四、5
voidmergelist(Linear_list*La,Linear_list*Lb,Linear_list*&
Lc)
{
Lc=(Linear_list*)malloc(sizeof(Linear_list));
//产生C表的头结点头插法
Lc->
while(La->
next!
=NULL&
=NULL)//La、Lb均非空
if(La->
data<
data)
{
p=La->
La->
next=La->
insert(Lc,p);
else
p=Lb->
Lb->
next=Lb->
p=La->
insert(Lc,p);
while(Lb->
p=Lb->
Lb->
}//O(Length(La)+Length(Lb))
voidinsert(Linear_list*Lc,Linear_list*p)
p->
next=Lc->
}//O
(1)
四、8
voiddeleteFront(Link*s)
Link*p=s,*q;
while(p->
=s)p=p->
next=s;
free(q);
习题4四、1
intsymmetry(linklist*head,stack*s)
//具有头结点的单链表中存放有一个字符串,每个结点的数据域存放一个字符。
//head为单链表的头指针,s为栈的结构体指针
intn=length(head)/2;
linklist*p=head->
next;
datatypex;
for(inti=0;
n;
i++){
push(s,p->
data);
p=p->
if(length(head)%2==1)p=p->
while(p!
=NULL){
x=pop(s);
if(x==p->
data)p=p->
elsereturn0;
return1;
四、3
voiddelete(Stack*s)
Stack*temp;
InitS(temp);
while(!
EmptyS(s))
x=Pop(s);
if(x!
=m)Push(temp,x);
Empty(temp))
Push(s,Pop(temp));
四、4
intcorrect(char*exp)
InitStack(S);
intflag=1;
i=0;
while(exp[i]!
='
\0'
flag)
if(exp[i]=='
('
||exp[i]=='
['
{'
)Push(S,exp[i]);
//遇左括号入栈
)'
)if(Pop(S)!
)flag=0;
]'
}'
//遇右括号出栈,若栈顶不是左括号,则括号不配对
if(!
Empty(S))flag=0;
//若栈非空,则括号不配对
returnflag;
四、6
循环队列的结构类型定义:
constintm=5;
typedefintdatatype;
typedefstruct
{datatypesequ[m];
intrear,quelen;
}qu;
说明:
队满条件:
sq->
quelen==m队空条件:
quelen==0(注意:
不需要空出一个位置)
入队:
voidenqueue(qu*sq,datatypex)
{if(sq->
quelen==m)printf("
queueisfull"
);
else{sq->
quelen++;
sq->
rear=(sq->
rear+1)%m;
//修改队尾指针
sequ[sq->
rear]=x;
出队:
intdequeue(qu*sq,datatype&
x)
quelen==0)
{printf("
queueisempty"
return0;
quelen--;
x=sq->
sequ[(sq->
rear-sq->
quelen+m)%m];
习题5四、3
(1)顺序串
intEqual(SeqString*S,SeqString*T)
//比较顺序串S、T是否相等
{i=0;
while((S->
ch[i]==T->
ch[i])&
(i<
S->
length)&
T->
length))i++;
if((i==S->
(i==T->
length))return1;
elsereturn0;
(2)链串
intEqual(LinkString*S,LinkString*T)
//比较链串S、T是否相等
p=S->
next;
q=T->
while((S->
data==T->
data)&
(p!
=NULL)&
(q!
=NULL))
q=q->
if((p==NULL)&
(q==NULL))return1;
elsereturn0;
四、7
voidstrDelete(char*S,inti,intm)
chartemp[80];
intk;
k=i-1;
=strlen(S))return;
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)
//字符串中字符的序号从1开始,数组元素从下标0开始使用
chartemp[maxsize];
=S->
len){
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(i<
len)
if(i+m-1<
len)S->
len=S->
len-m;
//删除了字符串中间的部分字符
elseS->
len=i-1;
//删除了字符串中从第i个字符开始的全部字符
四、9
voidcreate(Spmatrix*a)
scanf("
%d,%d,%d"
&
a->
m,&
n,&
t);
for(ano=0;
ano<
t;
ano++)
scanf("
data[ano].i,&
data[ano].j,&
data[ano].v);
四、11
voidminmax(array*p)
//找马鞍点
{inti,j,have=0;
for(i=0;
m;
i++)
{p->
min[i]=p->
A[i][0];
for(j=1;
j++)
if(p->
A[i][j]<
p->
min[i])p->
A[i][j];
}//分别找出m行的最小值
for(j=0;
max[j]=p->
A[0][j];
for(i=1;
A[i][j]>
max[j])p->
}//分别找出n列的最大值
for(j=0;
min[i]==p->
max[j])//若相等,则是一个马鞍点
{cout<
<
"
"
endl;
//输出马鞍点
have=1;
}
have)cout<
矩阵中没有马鞍点!
\n"
;
第六章四4、知二叉树的后序序列DECBGIHFA和中序序列为DCEBAFHGI,画出这棵二叉树。
A
BF
C H
DEI
G
7、右交换子树算法(在上机答案)
//交换左右子树
bitree*swap(bitree*p)
{bitree*t1,*t2;
if(p!
{1=swap(p->
lchild);
t2=swap(p->
rchild);
p->
lchild=t2;
rchild=t1;
returnp;
12、已知结点序列{21,18,37,42,65,24,19,26,45,25},画出相应的二叉排序树,并画出删除结点37后的二叉排序树。
有问题
(1)
(2)删除结点37后
14某密码电文由8个字母组成,每个字母在电文中的出现频率分别是7、19、2、6、32、3、21、10,试为这8个字母设计相应的哈夫曼编码。
解:
这8个字母可用A、B、C、D、E、F、G、H表示
组成的哈夫曼编码如下所示。
A:
1001B:
101C:
0010D:
1000
E:
11F:
0011G:
01H:
000
设计的哈夫曼树如下:
哈夫曼树
第七章四、4、邻接表:
126null
2136null
324null
435null
547null
6127null
756null
DFS:
1234576BFS:
1263745(不唯一)或1627354
5、按顺序输入后的邻接表:
126435null
216null
3145null
41635null
56413null
61245null
6、从顶点4开始:
412653(有多种)
BFS:
413562(不唯一)
7最小生成树:
7
6
1
5
24
3
第八章4、查找586
12345678910111213141516
687155188150465505508511586656670700766897908
Low=1high=16mid=(1+16)/2=8R[8]=508<
586
Low=mid+1=9high=16mid=(9+16)/2=12R[12]=670>
Low=9high=12-1=11mid=(9+11)/2=10R[10]=586
586=R[10]查找成功
5线性探查13
HT
1
2
3
4
5
6
7
8
9
10
11
12
52
26
15
120
43
84
70
99
92
37
25
H(key)
比较
拉链
52,26
15,70
43,82
37,11
给定关键字序列为(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,50,85,100,105】
第八趟直接插入排序:
【10,12,25,30,40,50,85,100,105】
第九趟直接插入排序:
【10,12,25,28,30,40,50,85,100,105】
希尔排序(增量为5,3,1):
第一趟希尔排序:
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
起泡排序:
第一趟起泡排序:
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,100
第七趟起泡排序:
10,12,25,28,30,40,50,105,85,100
第八趟起泡排序:
10,12,25,28,30,40,50,85,105,100
第九趟起泡排序:
直接选择排序:
第一趟选择排序:
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,50,105,85
第六趟选择排序:
10,12,25,28,30,40,50,100,105,85
第七趟选择排序:
10,12,25,28,30,40,50,85,100,105(完成)
第八趟选择排序:
第九趟选择排序:
快速排序:
第一趟快速排序:
(28,50,30,25,85,40,100,12,10),105
第二趟快速排序:
(10,12,25),28,(85,40,100,30,50),105
第三趟快速排序:
10,12,25,28,(50,40,30),85,(100),105
第四趟快速排序:
10,12,25,28,(30,40),50,85,100,105
第五趟快速排序:
归并排序:
第一趟归并排序:
50,105,25,30,40,85,12,100,10,28
第二趟归并排序:
25,30,50,105,12,40,85,100,10,28
第三趟归并排序:
设待排序的关键字序列为(15,21,6,30,23,6′,20,17),试分别写出使用以下排序方法每趟排序后的结果。
并说明做了多少次比较。
(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)起泡排序
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
(4)快速排序
【6′,6】15【30,23,21,20,17】
6′,6,15【17,23,21,20】30
6′,6,15,17【23,21,20】30
6′,6,15,17,【20,21】23,30
6,6′,15,17,20,21,30,23
(5)直接选择排序
第一趟直接选择排序:
6,21,15,30,23,6′,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)锦标赛排序
15,21,6,30,23,6′,20,17(此题答案的格式不对,我删去了)
锦标赛排序的基本思想是:
首先对n个待排序记录的关键字进行两两比较,从中选出n/2个较小者再两两比较,直到选出关键字最小的记录为止,此为一趟排序。
我们将一趟选出的关键字最小的记录称为“冠军”,而“亚军”是从与“冠军”比较失败的记录中找出,具体做法为:
输出“冠军”后,将(冠军)叶子结点关键字改为最大,继续进行锦标赛排序,直到选出关键字次小的记录为止,如此循环直到输出全部有序序列。
上面给出了排在前三个的记录,详细过程略。
(7)堆排序
初始堆:
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】