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;ia[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;elsescore[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;elsescore[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;elsescore[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;elsescore[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;elsescore[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.lengthS.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(xnext=MakeNode(y);}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);//初始化顺序栈SStatusDestroyStack_Sq(SqStack&S);//销毁顺序栈SStatusStackEmpty_Sq(SqStackS);//栈S判空,若空则返回TRUE,否则FALSEStatusPush_Sq(SqStack&S,ElemTypee);//将元素e压入栈SStatusPop_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];elsereturnERROR;}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加
{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;ia[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;elsescore[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;elsescore[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;elsescore[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;elsescore[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;elsescore[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.lengthS.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(xnext=MakeNode(y);}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);//初始化顺序栈SStatusDestroyStack_Sq(SqStack&S);//销毁顺序栈SStatusStackEmpty_Sq(SqStackS);//栈S判空,若空则返回TRUE,否则FALSEStatusPush_Sq(SqStack&S,ElemTypee);//将元素e压入栈SStatusPop_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];elsereturnERROR;}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加
{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;ia[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;elsescore[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;elsescore[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;elsescore[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;elsescore[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;elsescore[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.lengthS.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(xnext=MakeNode(y);}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);//初始化顺序栈SStatusDestroyStack_Sq(SqStack&S);//销毁顺序栈SStatusStackEmpty_Sq(SqStackS);//栈S判空,若空则返回TRUE,否则FALSEStatusPush_Sq(SqStack&S,ElemTypee);//将元素e压入栈SStatusPop_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];elsereturnERROR;}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加
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;elsescore[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;elsescore[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;elsescore[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;elsescore[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;elsescore[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.lengthS.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(xnext=MakeNode(y);}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);//初始化顺序栈SStatusDestroyStack_Sq(SqStack&S);//销毁顺序栈SStatusStackEmpty_Sq(SqStackS);//栈S判空,若空则返回TRUE,否则FALSEStatusPush_Sq(SqStack&S,ElemTypee);//将元素e压入栈SStatusPop_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];elsereturnERROR;}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加
{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;
score[1].femalescore+=result[i].score;
score[1].malescore+=result[i].score;
case'C':
score[2].totalscore+=result[i].score;
score[2].femalescore+=result[i].score;
score[2].malescore+=result[i].score;
case'D':
score[3].totalscore+=result[i].score;
score[3].femalescore+=result[i].score;
score[3].malescore+=result[i].score;
case'E':
score[4].totalscore+=result[i].score;
score[4].femalescore+=result[i].score;
score[4].malescore+=result[i].score;
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;
7./**********
【题目】试写一算法,由长度为n的一维数组a构建一个序列S。
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;
8./**********
【题目】链表的结点和指针类型定义如下
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
试写一函数,构建一个值为x的结点。
LinkListMakeNode(ElemTypex)
/*构建一个值为x的结点,并返回其指针。
/*若构建失败,则返回NULL。
{LNodenew;
new.next=NULL;
new.data=x;
return&new;
9./**********
10./**********
试写一函数,构建长度为2的升序链表,两个结点的值
分别为x和y,但应小的在前,大的在后。
LinkListMakeNode(ElemTypeM){
LNode*k;
k=(LNode*)malloc(sizeof(LNode));
k->data=M;
k->next=NULL;
returnk;
LinkListCreateOrdLList(ElemTypex,ElemTypey)
/*构建长度为2的升序链表。
{LNode*p;
if(xnext=MakeNode(y);}
else{p=MakeNode(y);p->next=MakeNode(x);}
returnp;
第二章
/**********
【题目】试写一算法,实现顺序栈的判空操作
StackEmpty_Sq(SqStackS)。
顺序栈的类型定义为:
ElemType*elem;//存储空间的基址
inttop;//栈顶元素的下一个位置,简称栈顶位标
intsize;//当前分配的存储容量
intincrement;//扩容时,增加的存储容量
}SqStack;//顺序栈
StatusStackEmpty_Sq(SqStackS)
/*对顺序栈S判空。
/*若S是空栈,则返回TRUE;否则返回FALSE*/
if(S.top==0)returnTRUE;
elsereturnFALSE;
【题目】试写一算法,实现顺序栈的取栈顶元素操作
GetTop_Sq(SqStackS,ElemType&e)。
StatusGetTop_Sq(SqStackS,ElemType&e)
/*取顺序栈S的栈顶元素到e,并返回OK;*/
/*若失败,则返回ERROR。
if(0==S.top)returnERROR;
e=S.elem[S.top-1];
}}
【题目】试写一算法,实现顺序栈的出栈操作
Pop_Sq(SqStack&S,ElemType&e)。
StatusPop_Sq(SqStack&S,ElemType&e)
/*顺序栈S的栈顶元素出栈到e,并返回OK;*/
S.top--;
【题目】若顺序栈的类型重新定义如下。
试编写算法,
构建初始容量和扩容增量分别为size和inc的空顺序栈S。
ElemType*top;//栈顶元素的下一个位置
}SqStack2;
StatusInitStack_Sq2(SqStack2&S,intsize,intinc)
/*构建初始容量和扩容增量分别为size和inc的空顺序栈S。
/*若成功,则返回OK;否则返回ERROR。
if(size<=0||inc<=0)returnERROR;
S.top=++S.elem;
S.size=size;
S.increment=inc;
实现顺序栈的判空操作。
StatusStackEmpty_Sq2(SqStack2S)
{if(S.top==S.elem)returnTRUE;
实现顺序栈的入栈操作。
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;
实现顺序栈的出栈操作。
StatusPop_Sq2(SqStack2&S,ElemType&e)
/*若顺序栈S是空的,则返回ERROR;*/
/*否则将S的栈顶元素出栈到e,返回OK。
if(S.top==S.elem)returnERROR;
e=*(S.top-1);
/**
【题目】试写一算法,借助辅助栈,复制顺序栈S1得到S2。
可调用顺序栈接口中下列函数:
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);
StackEmpty_Sq(S))
Pop_Sq(S,e);
Push_Sq(S2,e);
DestroyStack_Sq(S);
returnTRUE;
【题目】试写一算法,求循环队列的长度。
循环队列的类型定义为:
ElemType*base;//存储空间的基址
intfront;//队头位标
intrear;//队尾位标,指示队尾元素的下一位置
intmaxSize;//最大长度
}SqQueue;
intQueueLength_Sq(SqQueueQ)
/*返回队列Q中元素个数,即队列的长度。
return(Q.rear-Q.front+Q.maxSize)%Q.maxSize;
【题目】如果希望循环队列中的元素都能得到利用,
则可设置一个标志域tag,并以tag值为0或1来区分尾
指针和头指针值相同时的队列状态是"空"还是"满"。
试编写与此结构相应的入队列和出队列的算法。
本题的循环队列CTagQueue的类型定义如下:
ElemTypeelem[MAXQSIZE];
inttag;
intfront;
intrear;
}CTagQueue;
StatusEnCQueue(CTagQueue&Q,ElemTypex)
/*将元素x加入队列Q,并返回OK;*/
if((Q.rear-Q.front+MAXSIZE)%MAXSIZE)
Q.elem[Q.rear++%MAXSIZE]=x;
if(Q.tag==0)
elsereturnERROR;
if((Q.rear-Q.front+MAXSIZE)%MAXSIZE==0)
Q.tag=1;
StatusDeCQueue(CTagQueue&Q,ElemType&x)
/*将队列Q的队头元素退队到x,并返回OK;*/
x=Q.elem[Q.front++%MAXSIZE];
if(Q.tag==1)
returnERROR;
Q.tag=0;
【题目】假设将循环队列定义为:
以域变量rear
和length分别指示循环队列中队尾元素的位置和内
含元素的个数。
试给出此循环队列的队满条件,并
写出相应的入队列和出队列的算法(在出队列的算
法中要返回队头元素)。
本题的循环队列CLenQueue的类型定义如下:
}CLenQueue;
StatusEnCQueue(CLenQueue&Q,ElemTypex)
/*将元素x加
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1