软件技术基础第二章课后习题答案.docx
《软件技术基础第二章课后习题答案.docx》由会员分享,可在线阅读,更多相关《软件技术基础第二章课后习题答案.docx(25页珍藏版)》请在冰豆网上搜索。
软件技术基础第二章课后习题答案
习题2.1 什么是数据结构?
它对算法有什么影响?
答:
数据结构是指同一数据对象中各数据元素间存在的关系。
数据结构对算法的影响:
算法的实现必须借助程序设计语言中提供的数据
类型及其运算。
一个算法的效率往往与数据的表达形式有关,因此数据结构的选择对数据处理的效率起着至关重要的作用。
它是算法和程序设计的基本部分,它对程序的质量影响很大。
习题2.2 何谓算法?
它与程序有何区别?
答:
广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。
计算机算法是通过计算机能执行的算法语言来表达的。
和程序的区别:
一个程序包括两个方面的内容:
(1)对数据的描述,即数据结构。
(2)对操作的描述,即算法。
所以算法是程序的一个要素。
习题2.3 何谓频度,时间复杂度,空间复杂度?
说明其含义。
答:
频度:
在某个算法中某个语句被重复执行的次数就是此语句的频度。
时间复杂度:
是用来估算一个算法的执行时间的量,以算法中频度最大的语句来度量。
空间复杂度:
指在算法中所需的辅助空间的单元,而不包括问题的原始数据占用的空间。
习题2.4
算法:
A=(a0, a1 ……an)
mul = 1 //
sum=a0
for i=1 to n
mul = mul * x
sum = A[i]*mul + sum //求和
end(i)
程序代码:
#include
#include
#defineN10
doublepolynomail(inta[],inti,doublex,intn);
intmain()
{
doublex;
intn,i;
inta[N];
printf("输入变量的值x:
");
cin>>x;
cout<<"输入多项式的阶次n:
";
cin>>n;
if(n>N-1)exit(0);
cout<<"输入多项式的系数a[0]--a[n]:
";
for(i=0;i<=n;i++)cin>>a[i];
cout<<"Thepolynomailvalueis"<return0;
}
doublepolynomail(inta[],inti,doublex,intn)
{
if(i>0)returna[n-i]+polynomail(a,i-1,x,n)*x;
elsereturna[n];
}
本算法的时间复杂度为O(n)。
习题2.9
boolIsSubSequence(Stringa[],intn,Stringb[],intm)
{
inti=0;
intj=0;
while(i{
if(a[i]==b[j])/**相等时,下标同时向后移动一个位置.*/
{
i++;
j++;
}
else
{
j++;/**不等时,只将b[]数组下标向后移动一个位置.*/
if(j==m)/**当b[]数组找完时,指向了第m+1个不存在的元素,则不符合。
*/
returnfalse;//a[]不是b[]的子序列
}
}
returntrue;//a[]是b[]的子序列
}
上机需要定义main函数别偷懒哦`
习题2.10
voidmgsl(intn,inta[],intm,intb[],intc[])
{
intk=0,i=0,j=0;
while((i{
if(a[i]<=b[j])//复制有序表a中的元素
{c[k]=a[i];i=i+1;}
else
{c[k]=b[j];j=j+1;}
k=k+1;
}
if(i==n)//复制有序表b中剩余元素
for(i=j;i{c[k]=b[i];k=k+1;}
else//复制有序表a中剩余元素
for(j=i;j{c[k]=a[j];k=k+1;}
return;
}
习题2.11
voidinvsl(intn,inta[])
{
intk;
intt;
for(k=1;k<=n/2;k++){
t=a[k-1];
a[k-1]=a[n-k];
a[n-k]=t;
}
return;
}
intmain()
{
inta[10]={1,2,….};
invsl(10,a);
for(inti=0;i<10;i++)
printf(“%d”,a[i]);
return0;
}
习题2.12
intListLength_L(LinkList&L)
{
inti=0;
LinkListp=L;
if(p)p=p-next;
while(p){
p=p->next;
i++;
}
returni;
}
习题2.13
intDeleteElem_L(LinkList&L,intx,intk)
{
inti=1;
LinkListp=L;
while(p&&i!
=k-1){
p=p->next;
i++;
}
p=p->next->next;
}
习题2.14
设待插入的结点值为x,则至少需要考虑下面三种情况:
1.prev->val≤x≤current->val:
插入到prev和current之间。
2.x是链表中最小或者最大的值:
插入x到链表头部的前面。
3.回到起始点:
插入到起始点前面。
第1和2种情况还比较容易考虑到,但是第3种情况往往会被忽略,先给出代码,再根据代码来分析这些情况为什么都需要考虑到。
1.void insert(Node *& aNode, int x) {
2. //链表为空,创建节点返回
3. if (!
aNode) {
4. aNode = new Node(x);
5. aNode->next = aNode;
6. return;
7. }
8.
9. Node *p = aNode;
10. Node *prev = NULL;
11. do {
12. prev = p;
13. p = p->next;
14. if (x <= p->data && x >= prev->data) break; // 情况1,找到正常位置返回,如例子中插入4到链表中
15. if ((prev->data > p->data) && (x < p->data || x > prev->data)) break; // 情况2,x最小或者最大,插入到链表最前面
16. } while (p !
= aNode); // 情况3,回到起始结点,停止.
17.
18. Node *newNode = newNode(x);
19. newNode->next = p;
20. prev->next = newNode;
21.}
1)链表只有一个结点
如果x等于该结点值,则直接在情况1处理。
否则情况3处理。
2)链表包含重复值
如果链表为1-*1-1,起始结点为第二个1,则在其中插入2时,由情况3处理,即最终插入到初始结点前面。
会变成1-2-1-1.循环链表从第二个1开始,照样是有序的。
习题2.15
//将合并后的结果放在C表中,并删除B表
StatusListMerge_L(LinkList&A,LinkList&B,LinkList&C)
{
LinkListpa,pb,qa,qb;
pa=A->next;
pb=B->next;
C=A;
while(pa&&pb){
qa=pa;qb=pb;
pa=pa->next;pb=pb->next;
qb->next=qa->next;
qa->next=qb;
}
if(!
pa)qb->next=pb;
pb=B;
free(pb);
returnOK;
}
习题2.18
//在单循环链表S中删除S的前驱结点
StatusListDelete_CL(LinkList&S)
{
LinkListp,q;
if(S==S->next)returnERROR;
q=S;
p=S->next;
while(p->next!
=S){
q=p;
p=p->next;
}
q->next=p->next;
free(p);
returnOK;
}
习题2.19
//带头结点的单链表的逆置
StatusListOppose_L(LinkList&L)
{
LinkListp,q;
p=L;
p=p->next;
L->next=NULL;
while(p){
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
returnOK;
}
习题2.21 有一铁路交换站如题图(栈),火车从右边开进交换站,然后再开到左边,每节车厢均有编号如1,2,3,…,n。
请问:
(1)当n=3和n=4时有哪几种排序方式?
哪几种排序方式不可能发生?
(2)当n=6时,325641这样的排列是否能发生?
154623的排列是否能发生?
解:
N=3时可能的出栈序列:
123 1S1X2S2X3S3X 132 1S1X2S3S3X2X 213 1S2S2X1X3S3X 231 1S2S2X3S3X1X 312 CAB 321 1S2S3S3X2X1X
N=4,不可能的排列:
4312 4213 4231 4123 4132
3124 3142 3412 1423 2413
N=6时,325641可能 154623不可能
习题2.24
双向栈(a[],m,top1,top2,x)
{
top1=m;
top2=1;
if(top1==top2)then{printf(“上溢”),returnERROR}
while(top1!
=top2)
{
if(x%2==0)
{
a[top2]=x;
top2++;
}
else{
a[top1]=x;
top1--;
}
}
}
习题2.26
用三元组和带行辅助向量形式表示下列稀疏矩阵:
(1):
(2):
(1):
三元组带行辅助向量
行
列
值
1
1
15
1
4
22
1
6
-15
2
2
11
2
3
3
3
4
-6
5
1
91
6
3
28
(2):
三元组带行辅助向量
i
1
2
3
4
5