软件技术基础第二章课后习题答案.docx

上传人:b****3 文档编号:2173156 上传时间:2022-10-27 格式:DOCX 页数:25 大小:3.53MB
下载 相关 举报
软件技术基础第二章课后习题答案.docx_第1页
第1页 / 共25页
软件技术基础第二章课后习题答案.docx_第2页
第2页 / 共25页
软件技术基础第二章课后习题答案.docx_第3页
第3页 / 共25页
软件技术基础第二章课后习题答案.docx_第4页
第4页 / 共25页
软件技术基础第二章课后习题答案.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

软件技术基础第二章课后习题答案.docx

《软件技术基础第二章课后习题答案.docx》由会员分享,可在线阅读,更多相关《软件技术基础第二章课后习题答案.docx(25页珍藏版)》请在冰豆网上搜索。

软件技术基础第二章课后习题答案.docx

软件技术基础第二章课后习题答案

习题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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1