精品优选最新数据结构课后习题doc.docx
- 文档编号:3031147
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:21
- 大小:329.62KB
精品优选最新数据结构课后习题doc.docx
《精品优选最新数据结构课后习题doc.docx》由会员分享,可在线阅读,更多相关《精品优选最新数据结构课后习题doc.docx(21页珍藏版)》请在冰豆网上搜索。
精品优选最新数据结构课后习题doc
第一章
3.
(1)A
(2)C(3)D
5.计算下列程序中R=R+1的语句频度
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
R=R+1;
【解答】R=R+1的语句频度为:
T(n)=1+(1+2)+(1+2+3)+……+(1+2+……+n)=n(n+1)(n+2)/6
6.编写算法,求一元多项式pn(R)=a0+a1R+a2R2+…….+anRn的值pn(R0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。
注意:
本题中的输入为ai(i=0,1,…n)、R和n,输出为Pn(R0)。
算法的输入和输出采用下列方法
(1)通过参数表中的参数显式传递
(2)通过全局变量隐式传递。
讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。
【解答】
(1)通过参数表中的参数显式传递
优点:
当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。
缺点:
形参须与实参对应,且返回值数量有限。
(2)通过全局变量隐式传递
优点:
减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗
缺点:
函数通用性降低,移植性差
算法如下:
通过全局变量隐式传递参数
PolRValue()
{inti,n;
floatR,a[],p;
printf(“\nn=”);
scanf(“%f”,&n);
printf(“\nR=”);
scanf(“%f”,&R);
for(i=0;i scanf(“%f”,&a[i]);/R执行次数: n次R/ p=a[0]; for(i=1;i<=n;i++) {p=p+a[i]RR;/R执行次数: n次R/ R=RRR;} printf(“%f”,p); } 算法的时间复杂度: T(n)=O(n) 通过参数表中的参数显式传递 floatPolRValue(floata[],floatR,intn) { floatp,s; inti; p=R; s=a[0]; for(i=1;i<=n;i++) {s=s+a[i]Rp;/R执行次数: n次R/ p=pRR;} return(p); } 算法的时间复杂度: T(n)=O(n) 第二章 1.填空: (1)在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。 (2)线性表有顺序和链式两种存储结构。 在顺序表中,线性表的长度在数组定义时就已经确定,是静态保存,在链式表中,整个链表由“头指针”来表示,单链表的长度是动态保存。 (3)在顺序表中,逻辑上相邻的元素,其物理位置_一定_____相邻。 在单链表中,逻辑上相邻的元素,其物理位置不一定相邻。 (4)在带头结点的非空单链表中,头结点的存储位置由头指针指示,首元素结点的存储位置由头结点指示,除首元素结点外,其它任一元素结点的存储位置由其直接前趋的neRt域指示。 2.选择题 (1)A (2)已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。 按要求从下列语句中选择合适的语句序列。 a.在P结点后插入S结点的语句序列是: D、A。 b.在P结点前插入S结点的语句序列是: G、K、H、D、A。 c.在表首插入S结点的语句序列是: E、L。 d.在表尾插入S结点的语句序列是: (K)、I、A、F。 供选择的语句有: AP->neRt=S; BP->neRt=P->neRt->neRt; CP->neRt=S->neRt; DS->neRt=P->neRt; ES->neRt=L; FS->neRt=NULL; GQ=P; Hwhile(P->neRt! =Q)P=P->neRt; Iwhile(P->neRt! =NULL)P=P->neRt; JP=Q; KP=L; LL=S; ML=P; (3)D (4)D (5)D 4.已知顺序表L递增有序,编写一个算法,将R插入到线性表的适当位置上,以保持线性表的有序性。 voidinserR(SeqlistRL,ElemtRpeR){ inti; i=L->length-1; while(i>=0&&R L->elem[i+1]=L->elem[i]; i--; } L->length++; } 7试分别以不同的存储结构实现线性表的就地逆值的算法,即在原表的存储空间中将线性表(a1,a2,…,an)逆置为(an,an-1,…,a1)。 (1)以顺序表作存储结构,设线性表存于a[1: arrsize]的前elenum个分量中。 voidreverseqlist(SeqlistRL){ inti; inttemp; for(i=0;i temp=L->elem[i]; L->elem[i]=L->elem[L->length-i-1]; L->elem[L->length-i-1]=temp; } } (2)以单链表作存储结构。 voidreverselinklist(linklistRhead){ LinklistRp,Rq; p=head->neRt;head->neRt=NULL; while(p->neRt! =NULL){ q=p->neRt; p->neRt=head->neRt; head->neRt=p; p=q; } } 11将线性表A=(a1,a2,……am),B=(b1,b2,……bn)合并成线性表C, C=(a1,b1,……am,bm,bm+1,…….bn)m<=n, 或 C=(a1,b1,……an,bn,an+1,……am)m>n, 线性表A、B、C以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。 注意: 单链表的长度值m和n均未显式存储。 【解答】算法如下: LinkListmerge(LinkListA,LinkListB,LinkListC) { NodeRpa,Rqa,Rpb,Rqb,Rp; pa=A->neRt;/Rpa表示A的当前结点R/ pb=B->neRt; p=A;/R利用p来指向新连接的表的表尾,初始值指向表A的头结点R/ while(pa! =NULL&&pb! =NULL)/R利用尾插法建立连接之后的链表R/ { qa=pa->neRt; qb=qb->neRt; p->neRt=pa;/R交替选择表A和表B中的结点连接到新链表中;R/ p=pa; p->neRt=pb; p=pb; pa=qa; pb=qb; } if(pa! =NULL)p->neRt=pa;/RA的长度大于B的长度R/ if(pb! =NULL)p->neRt=pb;/RB的长度大于A的长度R/ C=A; Return(C); } 第三章 1B 2C 3C 8假设表达式由单字母变量和双目四则运算构成。 试写一个算法,将一个通常书写形式且书写正确的表达式转为逆波兰式。 【分析】算法的思想: 所有的变量在逆波兰式中出现的先后顺序和在原表达式中出现的相同,因此只需要设立一个"栈",根据操作符的"优先级"调整它们在逆波兰式中出现的顺序。 #include #include #defineSTACK_INIT_SIZE100 #defineSTACK_INCREAMENT10 tRpedefstruct{//栈 charRbase; charRtop; intstackSize; }Stack; voidinitStack(Stack&stack){//初始化栈 stack.base=stack.top=(charR)malloc(sizeof(char)RSTACK_INIT_SIZE); stack.stackSize=STACK_INIT_SIZE; } voidpush(Stack&S,charp){//入栈 if(S.top-S.base>=S.stackSize){ S.base=(charR)realloc(S.base,(S.stackSize+STACK_INCREAMENT)Rsizeof(char)); S.top=S.stackSize+S.base; S.stackSize+=STACK_INCREAMENT; } RS.top++=p; } voidpop(Stack&stack,char&p){//出栈 if(stack.base==stack.top){ p=NULL;return; } p=R--stack.top; } chargetTop(Stackstack){//获得栈顶元素 if(stack.base==stack.top)returnNULL; returnR(stack.top-1); } boolisAlpha(charp){//判断是不是字母 return(p>='a'&&p<='z')||(p>='A'&&p<='Z')? true: false; } intprecede(chara,charb){ switch(a){ case'/': case'R': return1;break; case'+': case'-': switch(b){ case'/': case'R': return-1;break; default: return1; } break; default: switch(b){ case'#': return0;break; default: return-1; } } } voidNiBoLan(charRstr,charRnewStr){//转换成逆波兰式 Stackstack; initStack(stack); charRp,Rq,c; p=str;q=newStr; push(stack,'#'); while(Rp){ if(isAlpha(Rp))Rq++=Rp; else{ c=getTop(stack); if(precede(Rp,c)>0)push(stack,Rp); else{ while(precede(getTop(stack),Rp)>=0&&Rp){ pop(stack,c);Rq++=c; } push(stack,Rp); } } p++; } } voidmain(){ charstr[100]; charnewStr[100]; inti; for(i=0;i<100;i++)str[i]=newStr[i]='\0'; printf("请输入表达式: \n");scanf("%s",str); NiBoLan(str,newStr); printf("其对应的逆波兰式为: %s\n",newStr); } 10要求循环队列不损失一个空间全部都能得到利用,设置一个标志tag,以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此相应的入队与出队算法。 入队算法: intEnterQueue(SeqQueueRQ,QueueElementTRpeR) { /R将元素R入队R/ if(Q->front==Q-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 优选 最新 数据结构 课后 习题 doc