anyview数据结构题目与答案.docx
- 文档编号:7086937
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:88
- 大小:38.77KB
anyview数据结构题目与答案.docx
《anyview数据结构题目与答案.docx》由会员分享,可在线阅读,更多相关《anyview数据结构题目与答案.docx(88页珍藏版)》请在冰豆网上搜索。
anyview数据结构题目与答案
感谢欧浩宇提供答案,仅供学习参考。
第一章
1.【题目】试写一算法,如果三个整数a,b和c的值
不是依次非递增的,则通过交换,令其为非递增。
***********/
voidDescend(int&a,int&b,int&c)
/*通过交换,令a>=b>=c*/
{intt;
if(a
{t=b,b=a,a=t;}
if(a {t=c,c=a,a=t;} if(b {t=b,b=c,c=t;} } 2./********** 【题目】试编写算法求一元多项式 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[n];//一次 for(inti=n-1;i>=0;i--)//n次 p=a[i]+x*p; returnp;//时间复杂度T(n)=O(n) } 3./********** 【题目】已知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*/ { inti; longtemp; inta[1000]; if(k<=1||m<0){returnERROR;} for(i=0;i a[i]=1; a[k]=1; for(temp=1,i=k+1;i<=m;++i){ if(temp>MAXINT)returnERROR; temp=temp-a[i-k-1]+a[i-1]; a[i]=temp; } f=a[m]; returnOK; } 4./********** 【题目】试编写算法,计算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*/ {intx=0; for(inti=0;i {intJC=1,SUM=1; for(intj=i+1;j>0;j--) { JC*=j;SUM*=2; } a[i]=JC*SUM; if(a[i]>MAXINT){ returnOVERFLOW;x++;} } if(x==0)returnOK; } 5./********** 【题目】假设有A、B、C、D、E五个高等院校进行田径对抗赛, 各院校的单项成绩均以存入计算机并构成一张表,表中每一行 的形式为: 项目名称性别校名成绩得分 编写算法,处理上述表格,以统计各院校的男、女总分和团体 总分,并输出。 **********/ voidScores(ResultType*result,ScoreType*score) /*求各校的男、女总分和团体总分,并依次存入数组score*/ /*假设比赛结果已经储存在result[]数组中,*/ /*并以特殊记录{"",male,'',"",0}(域scorce=0)*/ /*表示结束*/ { inti=0; while(result[i].sport) { switch(result[i].schoolname) {case'A': score[0].totalscore+=result[i].score; if(result[i].gender==female) score[0].femalescore+=result[i].score; else score[0].malescore+=result[i].score; break; case'B': score[1].totalscore+=result[i].score; if(result[i].gender==female) score[1].femalescore+=result[i].score; else score[1].malescore+=result[i].score; break; case'C': score[2].totalscore+=result[i].score; if(result[i].gender==female) score[2].femalescore+=result[i].score; else score[2].malescore+=result[i].score; break; case'D': score[3].totalscore+=result[i].score; if(result[i].gender==female) score[3].femalescore+=result[i].score; else score[3].malescore+=result[i].score; break; case'E': score[4].totalscore+=result[i].score; if(result[i].gender==female) score[4].femalescore+=result[i].score; else score[4].malescore+=result[i].score; break; } i++; } } 6./********** 【题目】试写一算法,对序列S的第i个元素赋以值e。 序列的类型定义为: typedefstruct{ ElemType*elem; intlength; }Sequence; ***********/ StatusAssign(Sequence&S,inti,ElemTypee) /*对序列S的第i个元素赋以值e,并返回OK。 */ /*若S或i不合法,则赋值失败,返回ERROR*/ {if(i<0||S.length S.elem[i])returnERROR; else{ S.elem[i]=e; } returnOK; } 7./********** 【题目】试写一算法,由长度为n的一维数组a构建一个序列S。 序列的类型定义为: typedefstruct{ ElemType*elem; intlength; }Sequence; ***********/ StatusCreateSequence(Sequence&S,intn,ElemType*a) /*由长度为n的一维数组a构建一个序列S,并返回OK。 */ /*若构建失败,则返回ERROR*/ { if(n<=0)returnERROR; S.elem=(ElemType*)malloc(n*sizeof(ElemType)); S.elem=a; S.length=n; returnOK; } 8./********** 【题目】链表的结点和指针类型定义如下 typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*LinkList; 试写一函数,构建一个值为x的结点。 ***********/ LinkListMakeNode(ElemTypex) /*构建一个值为x的结点,并返回其指针。 */ /*若构建失败,则返回NULL。 */ {LNodenew; new.next=NULL; new.data=x; return&new; } 9./********** 【题目】链表的结点和指针类型定义如下 typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*LinkList; 试写一函数,构建一个值为x的结点。 ***********/ LinkListMakeNode(ElemTypex) /*构建一个值为x的结点,并返回其指针。 */ /*若构建失败,则返回NULL。 */ {LNodenew; new.next=NULL; new.data=x; return&new; } 10./********** 【题目】链表的结点和指针类型定义如下 typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*LinkList; 试写一函数,构建长度为2的升序链表,两个结点的值 分别为x和y,但应小的在前,大的在后。 **********/ LinkListMakeNode(ElemTypeM){ LNode*k; k=(LNode*)malloc(sizeof(LNode)); k->data=M; k->next=NULL; returnk; } LinkListCreateOrdLList(ElemTypex,ElemTypey) /*构建长度为2的升序链表。 */ /*若构建失败,则返回NULL。 */ {LNode*p; if(x else{p=MakeNode(y);p->next=MakeNode(x);} returnp; } 第二章 /********** 【题目】试写一算法,实现顺序栈的判空操作 StackEmpty_Sq(SqStackS)。 顺序栈的类型定义为: typedefstruct{ ElemType*elem;//存储空间的基址 inttop;//栈顶元素的下一个位置,简称栈顶位标 intsize;//当前分配的存储容量 intincrement;//扩容时,增加的存储容量 }SqStack;//顺序栈 ***********/ StatusStackEmpty_Sq(SqStackS) /*对顺序栈S判空。 */ /*若S是空栈,则返回TRUE;否则返回FALSE*/ { if(S.top==0)returnTRUE; elsereturnFALSE; } /********** 【题目】试写一算法,实现顺序栈的取栈顶元素操作 GetTop_Sq(SqStackS,ElemType&e)。 顺序栈的类型定义为: typedefstruct{ ElemType*elem;//存储空间的基址 inttop;//栈顶元素的下一个位置,简称栈顶位标 intsize;//当前分配的存储容量 intincrement;//扩容时,增加的存储容量 }SqStack;//顺序栈 ***********/ StatusGetTop_Sq(SqStackS,ElemType&e) /*取顺序栈S的栈顶元素到e,并返回OK;*/ /*若失败,则返回ERROR。 */ { if(0==S.top)returnERROR; else{ e=S.elem[S.top-1]; returnOK; }} /********** 【题目】试写一算法,实现顺序栈的出栈操作 Pop_Sq(SqStack&S,ElemType&e)。 顺序栈的类型定义为: typedefstruct{ ElemType*elem;//存储空间的基址 inttop;//栈顶元素的下一个位置,简称栈顶位标 intsize;//当前分配的存储容量 intincrement;//扩容时,增加的存储容量 }SqStack;//顺序栈 ***********/ StatusPop_Sq(SqStack&S,ElemType&e) /*顺序栈S的栈顶元素出栈到e,并返回OK;*/ /*若失败,则返回ERROR。 */ { if(0==S.top)returnERROR; else{ e=S.elem[S.top-1]; S.top--; returnOK; } } /********** 【题目】若顺序栈的类型重新定义如下。 试编写算法, 构建初始容量和扩容增量分别为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; }} /********** 【题目】若顺序栈的类型重新定义如下。 试编写算法, 实现顺序栈的判空操作。 typedefstruct{ ElemType*elem;//存储空间的基址 ElemType*top;//栈顶元素的下一个位置 intsize;//当前分配的存储容量 intincrement;//扩容时,增加的存储容量 }SqStack2; ***********/ StatusStackEmpty_Sq2(SqStack2S) /*对顺序栈S判空。 */ /*若S是空栈,则返回TRUE;否则返回FALSE*/ {if(S.top==S.elem)returnTRUE; elsereturnFALSE; } /********** 【题目】若顺序栈的类型重新定义如下。 试编写算法, 实现顺序栈的入栈操作。 typedefstruct{ ElemType*elem;//存储空间的基址 ElemType*top;//栈顶元素的下一个位置 intsize;//当前分配的存储容量 intincrement;//扩容时,增加的存储容量 }SqStack2; ***********/ StatusPush_Sq2(SqStack2&S,ElemTypee) /*若顺序栈S是满的,则扩容,若失败则返回ERROR。 */ /*将e压入S,返回OK。 */ {ElemType*newbase; if(S.top-S.elem>=S.size) S.size+=S.increment; *S.top++=e; returnOK; } /********** 【题目】若顺序栈的类型重新定义如下。 试编写算法, 实现顺序栈的出栈操作。 typedefstruct{ ElemType*elem;//存储空间的基址 ElemType*top;//栈顶元素的下一个位置 intsize;//当前分配的存储容量 intincrement;//扩容时,增加的存储容量 }SqStack2; ***********/ StatusPop_Sq2(SqStack2&S,ElemType&e) /*若顺序栈S是空的,则返回ERROR;*/ /*否则将S的栈顶元素出栈到e,返回OK。 */ { if(S.top==S.elem)returnERROR; else{ e=*(S.top-1); S.top--; returnOK; } } /** 【题目】试写一算法,借助辅助栈,复制顺序栈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。 */ {SqStackS; ElemTypee; InitStack_Sq(S,S1.size,S1.increment); InitStack_Sq(S2,S1.size,S1.increment); while(! StackEmpty_Sq(S1)) { Pop_Sq(S1,e); Push_Sq(S,e); } while(! StackEmpty_Sq(S)) { Pop_Sq(S,e); Push_Sq(S2,e); } DestroyStack_Sq(S); returnTRUE; } /********** 【题目】试写一算法,求循环队列的长度。 循环队列的类型定义为: typedefstruct{ ElemType*base;//存储空间的基址 intfront;//队头位标 intrear;//队尾位标,指示队尾元素的下一位置 intmaxSize;//最大长度 }SqQueue; ***********/ intQueueLength_Sq(SqQueueQ) /*返回队列Q中元素个数,即队列的长度。 */ { return(Q.rear-Q.front+Q.maxSize)%Q.maxSize; } /********** 【题目】如果希望循环队列中的元素都能得到利用, 则可设置一个标志域tag,并以tag值为0或1来区分尾 指针和头指针值相同时的队列状态是"空"还是"满"。 试编写与此结构相应的入队列和出队列的算法。 本题的循环队列CTagQueue的类型定义如下: typedefstruct{ ElemTypeelem[MAXQSIZE]; inttag; intfront; intrear; }CTagQueue; **********/ StatusEnCQueue(CTagQueue&Q,ElemTypex) /*将元素x加入队列Q,并返回OK;*/ /*若失败,则返回ERROR。 */ { if((Q.rear-Q.front+MAXSIZE)%MAXSIZE) Q.elem[Q.rear++%MAXSIZE]=x; else { if(Q.tag==0) Q.elem[Q.rear++%MAXSIZE]=x; elsereturnERROR; } if((Q.rear-Q.front+MAXSIZE)%MAXSIZE==0) Q.tag=1; returnOK; } StatusDeCQueue(CTagQueue&Q,ElemType&x) /*将队列Q的队头元素退队到x,并返回OK;*/ /*若失败,则返回ERROR。 */ { if((Q.rear-Q.front+MAXSIZE)%MAXSIZE) x=Q.elem[Q.front++%MAXSIZE]; else{ if(Q.tag==1) x=Q.elem[Q.front++%MAXSIZE]; else returnERROR; } if((Q.rear-Q.front+MAXSIZE)%MAXSIZE==0) Q.tag=0; returnOK; } /********** 【题目】假设将循环队列定义为: 以域变量rear 和length分别指示循环队列中队尾元素的位置和内 含元素的个数。 试给出此循环队列的队满条件,并 写出相应的入队列和出队列的算法(在出队列的算 法中要返回队头元素)。 本题的循环队列CLenQueue的类型定义如下: typedefstruct{ ElemTypeelem[MAXQSIZE]; intlength; intrear; }CLenQueue; **********/ StatusEnCQueue(CLenQueue&Q,ElemTypex) /*将元素x加
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- anyview 数据结构 题目 答案