广工数据结构AV 答案最新版.docx

上传人:b****1 文档编号:3289380 上传时间:2023-05-05 格式:DOCX 页数:96 大小:34.40KB
下载 相关 举报
广工数据结构AV 答案最新版.docx_第1页
第1页 / 共96页
广工数据结构AV 答案最新版.docx_第2页
第2页 / 共96页
广工数据结构AV 答案最新版.docx_第3页
第3页 / 共96页
广工数据结构AV 答案最新版.docx_第4页
第4页 / 共96页
广工数据结构AV 答案最新版.docx_第5页
第5页 / 共96页
广工数据结构AV 答案最新版.docx_第6页
第6页 / 共96页
广工数据结构AV 答案最新版.docx_第7页
第7页 / 共96页
广工数据结构AV 答案最新版.docx_第8页
第8页 / 共96页
广工数据结构AV 答案最新版.docx_第9页
第9页 / 共96页
广工数据结构AV 答案最新版.docx_第10页
第10页 / 共96页
广工数据结构AV 答案最新版.docx_第11页
第11页 / 共96页
广工数据结构AV 答案最新版.docx_第12页
第12页 / 共96页
广工数据结构AV 答案最新版.docx_第13页
第13页 / 共96页
广工数据结构AV 答案最新版.docx_第14页
第14页 / 共96页
广工数据结构AV 答案最新版.docx_第15页
第15页 / 共96页
广工数据结构AV 答案最新版.docx_第16页
第16页 / 共96页
广工数据结构AV 答案最新版.docx_第17页
第17页 / 共96页
广工数据结构AV 答案最新版.docx_第18页
第18页 / 共96页
广工数据结构AV 答案最新版.docx_第19页
第19页 / 共96页
广工数据结构AV 答案最新版.docx_第20页
第20页 / 共96页
亲,该文档总共96页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

广工数据结构AV 答案最新版.docx

《广工数据结构AV 答案最新版.docx》由会员分享,可在线阅读,更多相关《广工数据结构AV 答案最新版.docx(96页珍藏版)》请在冰点文库上搜索。

广工数据结构AV 答案最新版.docx

广工数据结构AV答案最新版

1-6

/**********

【题目】试写一算法,如果三个整数a,b和c的值

不是依次非递增的,则通过交换,令其为非递增。

***********/

voidDescend(int&a,int&b,int&c)

/*通过交换,令a>=b>=c*/

{

if(a

{

a=a^b;

b=a^b;

a=a^b;

}

if(b

{

b=b^c;

c=b^c;

b=b^c;

}

if(a

{

a=a^b;

b=a^b;

a=a^b;

}

}

 

1-8

/**********

【题目】试编写算法求一元多项式

P(x)=a0+a1x+a2x^2+...+anx^n

的值P(x0),并确定算法中每一语句的执行次数和整个算法

的时间复杂度。

**********/

floatPolynomial(intn,inta[],floatx)

/*求一元多项式的值P(x)。

*/

/*数组a的元素a[i]为i次项的系数,i=0,...,n*/

{

floatp=a[0];

floattemp=1;

for(inti=0;i

{

temp*=x;

p+=a[i+1]*temp;

}

returnp;

}

 

1-11

/**********

【题目】已知k阶裴波那契序列的定义为

f(0)=0,f

(1)=0,...,f(k-2)=0,f(k-1)=1;

f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,...

试编写求k阶裴波那契序列的第m项值的函数算法,

k和m均以值调用的形式在函数参数表中出现。

**********/

StatusFibonacci(intk,intm,int&f)

/*求k阶斐波那契序列的第m项的值f*/

{

intfibo[100];

inti;

if(k<2||m<0)

returnERROR;

if(m<=k)

{

if(m<=k-2)

f=0;

else

f=1;

}

else

{

for(i=0;i

fibo[i]=0;

fibo[k-1]=fibo[k]=1;

for(i=k+1;i<=m;i++)

fibo[i]=2*fibo[i-1]-fibo[i-k-1];

f=fibo[m];

}

returnOK;

}

 

1-18

/**********

【题目】试编写算法,计算i!

×2^i的值并存入数组

a[0..n-1]的第i-1个分量中(i=1,2,…,n)。

假设计

算机中允许的整数最大值为MAXINT,则当对某个k

(1≤k≤n)使k!

×2^k>MAXINT时,应按出错处理。

注意

选择你认为较好的出错处理方法。

**********/

StatusSeries(inta[],intn)

/*求i!

*2^i序列的值并依次存入长度为n的数组a;*/

/*若所有值均不超过MAXINT,则返回OK,否则OVERFLOW*/

{

intpartOne=1;

intpartTwo=1;

for(inti=0;i

{

partOne*=i+1;

partTwo*=2;

inttemp=partOne*partTwo;

if(temp>MAXINT)

returnOVERFLOW;

a[i]=temp;

}

returnOK;

}

 

1-23

/**********

【题目】假设有A、B、C、D、E五个高等院校进行田径对抗赛,

各院校的单项成绩均以存入计算机并构成一张表,表中每一行

的形式为:

项目名称性别校名成绩得分

编写算法,处理上述表格,以统计各院校的男、女总分和团体

总分,并输出。

**********/

voidScores(ResultType*result,ScoreType*score)

/*求各校的男、女总分和团体总分,并依次存入数组score*/

/*假设比赛结果已经储存在result[]数组中,*/

/*并以特殊记录{"",male,'',"",0}(域scorce=0)*/

/*表示结束*/

{

for(inti=0;result[i].score;++i)

{

intindex=0;

switch(result[i].schoolname)

{

case'A':

index=0;break;

case'B':

index=1;break;

case'C':

index=2;break;

case'D':

index=3;break;

case'E':

index=4;break;

default:

break;

}

switch(result[i].gender)

{

casemale:

score[index].malescore+=result[i].score;break;

casefemale:

score[index].femalescore+=result[i].score;break;

default:

break;

}

}

for(intj=0;j<5;++j)

score[j].totalscore=score[j].malescore+score[j].femalescore;

}

 

2-6

/**********

【题目】试写一算法,对序列S的第i个元素赋以值e。

序列的类型定义为:

typedefstruct{

ElemType*elem;

intlength;

}Sequence;

***********/

StatusAssign(Sequence&S,inti,ElemTypee)

/*对序列S的第i个元素赋以值e,并返回OK。

*/

/*若S或i不合法,则赋值失败,返回ERROR*/

{

if(!

S.length||i>=S.length)

returnERROR;

else

{

S.elem[i]=e;

returnOK;

}

}

 

2-9

/**********

【题目】试写一算法,由长度为n的一维数组a构建一个序列S。

序列的类型定义为:

typedefstruct{

ElemType*elem;

intlength;

}Sequence;

***********/

StatusCreateSequence(Sequence&S,intn,ElemType*a)

/*由长度为n的一维数组a构建一个序列S,并返回OK。

*/

/*若构建失败,则返回ERROR*/

{

if(n<=0)

returnERROR;

else

{

S.length=n;

for(inti=0;i

S.elem[i]=*a;

returnOK;

}

}

 

2-21

/**********

【题目】链表的结点和指针类型定义如下

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

试写一函数,构建一个值为x的结点。

***********/

LinkListMakeNode(ElemTypex)

/*构建一个值为x的结点,并返回其指针。

*/

/*若构建失败,则返回NULL。

*/

{

LNodetemp={x,null};

LNode*node=&temp;

returnnode;

}

 

2-23

/**********

【题目】链表的结点和指针类型定义如下

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

试写一函数,构建长度为2且两个结点的值依次为x和y的链表。

**********/

LinkListCreateLinkList(ElemTypex,ElemTypey)

/*构建其两个结点的值依次为x和y的链表。

*/

/*若构建失败,则返回NULL。

*/

{

LNodenode2={y,null},node1={x,&node2};

LinkListlist=&node1;

returnlist;

}

 

2-25

/**********

【题目】链表的结点和指针类型定义如下

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

试写一函数,构建长度为2的升序链表,两个结点的值

分别为x和y,但应小的在前,大的在后。

**********/

LinkListCreateOrdLList(ElemTypex,ElemTypey)

/*构建长度为2的升序链表。

*/

/*若构建失败,则返回NULL。

*/

{

LNodenode2={x<=y?

y:

x,null};

LNodenode1={x<=y?

x:

y,&node2};

LinkListlist=&node1;

returnlist;

}

 

3-3

/**********

【题目】试写一算法,实现顺序栈的判空操作

StackEmpty_Sq(SqStackS)。

顺序栈的类型定义为:

typedefstruct{

ElemType*elem;//存储空间的基址

inttop;//栈顶元素的下一个位置,简称栈顶位标

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack;//顺序栈

***********/

StatusStackEmpty_Sq(SqStackS)

/*对顺序栈S判空。

*/

/*若S是空栈,则返回TRUE;否则返回FALSE*/

{

if(!

*S.elem)

returnTRUE;

else

returnFALSE;

}

 

3-5

/**********

【题目】试写一算法,实现顺序栈的取栈顶元素操作

GetTop_Sq(SqStackS,ElemType&e)。

顺序栈的类型定义为:

typedefstruct{

ElemType*elem;//存储空间的基址

inttop;//栈顶元素的下一个位置,简称栈顶位标

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack;//顺序栈

***********/

StatusGetTop_Sq(SqStackS,ElemType&e)

/*取顺序栈S的栈顶元素到e,并返回OK;*/

/*若失败,则返回ERROR。

*/

{

if(!

*S.elem)

returnERROR;

else

{

e=*(S.elem+S.top-1);

returnOK;

}

}

 

3-7

/**********

【题目】试写一算法,实现顺序栈的出栈操作

Pop_Sq(SqStack&S,ElemType&e)。

顺序栈的类型定义为:

typedefstruct{

ElemType*elem;//存储空间的基址

inttop;//栈顶元素的下一个位置,简称栈顶位标

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack;//顺序栈

***********/

StatusPop_Sq(SqStack&S,ElemType&e)

/*顺序栈S的栈顶元素出栈到e,并返回OK;*/

/*若失败,则返回ERROR。

*/

{

if(!

*S.elem)

returnERROR;

else

{

e=*(S.elem+S.top-1);

--S.top;

returnOK;

}

}

 

3-11

/**********

【题目】若顺序栈的类型重新定义如下。

试编写算法,

构建初始容量和扩容增量分别为size和inc的空顺序栈S。

typedefstruct{

ElemType*elem;//存储空间的基址

ElemType*top;//栈顶元素的下一个位置

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack2;

**********/

StatusInitStack_Sq2(SqStack2&S,intsize,intinc)

/*构建初始容量和扩容增量分别为size和inc的空顺序栈S。

*/

/*若成功,则返回OK;否则返回ERROR。

*/

{

if(size<=0||inc<=0)

returnERROR;

else

{

S.top=++S.elem;

S.size=size;

S.increment=inc;

returnOK;

}

}

 

3-13

/**********

【题目】若顺序栈的类型重新定义如下。

试编写算法,

实现顺序栈的判空操作。

typedefstruct{

ElemType*elem;//存储空间的基址

ElemType*top;//栈顶元素的下一个位置

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack2;

***********/

StatusStackEmpty_Sq2(SqStack2S)

/*对顺序栈S判空。

*/

/*若S是空栈,则返回TRUE;否则返回FALSE*/

{

if(!

*S.elem)

returnTRUE;

returnFALSE;

}

 

3-15

/**********

【题目】若顺序栈的类型重新定义如下。

试编写算法,

实现顺序栈的入栈操作。

typedefstruct{

ElemType*elem;//存储空间的基址

ElemType*top;//栈顶元素的下一个位置

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack2;

***********/

StatusPush_Sq2(SqStack2&S,ElemTypee)

/*若顺序栈S是满的,则扩容,若失败则返回ERROR。

*/

/*将e压入S,返回OK。

*/

{

if(S.top-S.elem>=S.size)

{

S.size+=S.increment;

}

*S.top=e;

++S.top;

returnOK;

}

 

3-17

/**********

【题目】若顺序栈的类型重新定义如下。

试编写算法,

实现顺序栈的出栈操作。

typedefstruct{

ElemType*elem;//存储空间的基址

ElemType*top;//栈顶元素的下一个位置

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack2;

***********/

StatusPop_Sq2(SqStack2&S,ElemType&e)

/*若顺序栈S是空的,则返回ERROR;*/

/*否则将S的栈顶元素出栈到e,返回OK。

*/

{

if(!

*(S.top-1))

returnERROR;

else

{

e=*(S.top-1);

--S.top;

returnOK;

}

}

 

3-22

/**********

【题目】试写一算法,借助辅助栈,复制顺序栈S1得到S2。

顺序栈的类型定义为:

typedefstruct{

ElemType*elem;//存储空间的基址

inttop;//栈顶元素的下一个位置,简称栈顶位标

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack;//顺序栈

可调用顺序栈接口中下列函数:

StatusInitStack_Sq(SqStack&S,intsize,intinc);//初始化顺序栈S

StatusDestroyStack_Sq(SqStack&S);//销毁顺序栈S

StatusStackEmpty_Sq(SqStackS);//栈S判空,若空则返回TRUE,否则FALSE

StatusPush_Sq(SqStack&S,ElemTypee);//将元素e压入栈S

StatusPop_Sq(SqStack&S,ElemType&e);//栈S的栈顶元素出栈到e

***********/

StatusCopyStack_Sq(SqStackS1,SqStack&S2)

/*借助辅助栈,复制顺序栈S1得到S2。

*/

/*若复制成功,则返回TRUE;否则FALSE。

*/

{

ElemTypetemp;

SqStackS3;

InitStack_Sq(S2,S1.size,S1.increment);

InitStack_Sq(S3,S1.size,S1.increment);

while(!

StackEmpty_Sq(S1))

{

Pop_Sq(S1,temp);

Push_Sq(S3,temp);

}

while(!

StackEmpty_Sq(S3))

{

Pop_Sq(S3,temp);

Push_Sq(S2,temp);

}

DestroyStack_Sq(S3);

returnTRUE;

}

 

3-33

/**********

【题目】试写一算法,求循环队列的长度。

循环队列的类型定义为:

typedefstruct{

ElemType*base;//存储空间的基址

intfront;   //队头位标

intrear;   //队尾位标,指示队尾元素的下一位置

intmaxSize;//最大长度

}SqQueue;

***********/

intQueueLength_Sq(SqQueueQ)

/*返回队列Q中元素个数,即队列的长度。

*/

{

return(Q.rear-Q.front+Q.maxSize)%Q.maxSize;

}

 

3-35

/**********

【题目】如果希望循环队列中的元素都能得到利用,

则可设置一个标志域tag,并以tag值为0或1来区分尾

指针和头指针值相同时的队列状态是"空"还是"满"。

试编写与此结构相应的入队列和出队列的算法。

本题的循环队列CTagQueue的类型定义如下:

typedefstruct{

ElemTypeelem[MAXQSIZE];

inttag;

intfront;

intrear;

}CTagQueue;

**********/

StatusEnCQueue(CTagQueue&Q,ElemTypex)

/*将元素x加入队列Q,并返回OK;*/

/*若失败,则返回ERROR。

*/

{

if((Q.rear+MAXSIZE-Q.front)%MAXSIZE)

Q.elem[Q.rear++%MAXSIZE]=x;

else

{

if(Q.tag==0)

Q.elem[Q.rear++%MAXSIZE]=x;

else

returnERROR;

}

if((Q.rear+MAXSIZE-Q.front)%MAXSIZE==0)

Q.tag=1;

returnOK;

}

StatusDeCQueue(CTagQueue&Q,ElemType&x)

/*将队列Q的队头元素退队到x,并返回OK;*/

/*若失败,则返回ERROR。

*/

{

if((Q.rear+MAXSIZE-Q.front)%MAXSIZE)

x=Q.elem[Q.front++%MAXSIZE];

else

{

if(Q.tag==1)

x=Q.elem[Q.front++%MAXSIZE];

else

returnERROR;

}

if((Q.rear+MAXSIZE-Q.front)%MAXSIZE==0)

Q.tag=0;

returnOK;

}

 

3-37

/**********

【题目】假设将循环队列定义为:

以域变量rear

和length分别指示循环队列中队尾元素的位置和内

含元素的个数。

试给出此循环队列的队满条件,并

写出相应的入队列和出队列的算法(在出队列的算

法中要返回队头元素)。

本题的循环队列CLenQueue的类型定义如下:

typedefstruct{

ElemTypeelem[MAXQSIZE];

intlength;

intrear;

}CLenQueue;

**********/

Status

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2