数据结构习题集答案c版清华大学严蔚敏学习资料.docx
- 文档编号:1190340
- 上传时间:2022-10-18
- 格式:DOCX
- 页数:92
- 大小:57.83KB
数据结构习题集答案c版清华大学严蔚敏学习资料.docx
《数据结构习题集答案c版清华大学严蔚敏学习资料.docx》由会员分享,可在线阅读,更多相关《数据结构习题集答案c版清华大学严蔚敏学习资料.docx(92页珍藏版)》请在冰豆网上搜索。
数据结构习题集答案c版清华大学严蔚敏学习资料
1.16
voidprint_descending(intx,inty,intz)//按从大到小顺序输出三个数
{
scanf("%d,%d,%d",&x,&y,&z);
if(x
if(y
if(x
printf("%d%d%d",x,y,z);
}//print_descending
1.17
Statusfib(intk,intm,int&f)//求k阶斐波那契序列的第m项的值f
{
inttempd;
if(k<2||m<0)returnERROR;
if(m elseif(m==k-1)f=1; else { for(i=0;i<=k-2;i++)temp=0; temp[k-1]=1;//初始化 for(i=k;i<=m;i++)//求出序列第k至第m个元素的值 { sum=0; for(j=i-k;j temp=sum; } f=temp[m]; } returnOK; }//fib 分析: 通过保存已经计算出来的结果,此方法的时间复杂度仅为O(m^2).如果采用递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达O(k^m). 1.18 typedefstruct{ char*sport; enum{male,female}gender; charschoolname;//校名为'A','B','C','D'或'E' char*result; intscore; }resulttype; typedefstruct{ intmalescore; intfemalescore; inttotalscore; }scoretype; voidsummary(resulttyperesult[])//求各校的男女总分和团体总分,假设结果已经储存在result[]数组中 { scoretypescore; i=0; while(result.sport! =NULL) { switch(result.schoolname) { case'A': score[0].totalscore+=result.score; if(result.gender==0)score[0].malescore+=result.score; elsescore[0].femalescore+=result.score; break; case'B': score.totalscore+=result.score; if(result.gender==0)score.malescore+=result.score; elsescore.femalescore+=result.score; break; ……? ……? …… } i++; } for(i=0;i<5;i++) { printf("School%d: \n",i); printf("Totalscoreofmale: %d\n",score.malescore); printf("Totalscoreoffemale: %d\n",score.femalescore); printf("Totalscoreofall: %d\n\n",score.totalscore); } }//summary 1.19 Statusalgo119(inta[ARRSIZE])//求i! *2^i序列的值且不超过maxint { last=1; for(i=1;i<=ARRSIZE;i++) { a[i-1]=last*2*i; if((a[i-1]/last)! =(2*i))reurnOVERFLOW; last=a[i-1]; returnOK; } }//algo119 分析: 当某一项的结果超过了maxint时,它除以前面一项的商会发生异常. 1.20 voidpolyvalue() { floatad; float*p=a; printf("Inputnumberofterms: "); scanf("%d",&n); printf("Inputthe%dcoefficientsfroma0toa%d: \n",n,n); for(i=0;i<=n;i++)scanf("%f",p++); printf("Inputvalueofx: "); scanf("%f",&x); p=a;xp=1;sum=0;//xp用于存放x的i次方 for(i=0;i<=n;i++) { sum+=xp*(*p++); xp*=x; } printf("Valueis: %f",sum); }//polyvalue 2.10 StatusDeleteK(SqList&a,inti,intk)//删除线性表a中第i个元素起的k个元素 { if(i<1||k<0||i+k-1>a.length)returnINFEASIBLE; for(count=1;i+count-1<=a.length-k;count++)//注意循环结束的条件 a.elem[i+count-1]=a.elem[i+count+k-1]; a.length-=k; returnOK; }//DeleteK 2.11 StatusInsert_SqList(SqList&va,intx)//把x插入递增有序表va中 { if(va.length+1>va.listsize)returnERROR; va.length++; for(i=va.length-1;va.elem>x&&i>=0;i--) va.elem[i+1]=va.elem; va.elem[i+1]=x; returnOK; }//Insert_SqList 2.12 intListComp(SqListA,SqListB)//比较字符表A和B,并用返回值表示结果,值为正,表示A>B;值为负,表示A { for(i=1;A.elem||B.elem;i++) if(A.elem! =B.elem)returnA.elem-B.elem; return0; }//ListComp 2.13 LNode*Locate(LinkListL,intx)//链表上的元素查找,返回指针 { for(p=l->next;p&&p->data! =x;p=p->next); returnp; }//Locate 2.14 intLength(LinkListL)//求链表的长度 { for(k=0,p=L;p->next;p=p->next,k++); returnk; }//Length 2.15 voidListConcat(LinkListha,LinkListhb,LinkList&hc)//把链表hb接在ha后面形成链表hc { hc=ha;p=ha; while(p->next)p=p->next; p->next=hb; }//ListConcat 2.16 见书后答案. 2.17 StatusInsert(LinkList&L,inti,intb)//在无头结点链表L的第i个元素之前插入元素b { p=L;q=(LinkList*)malloc(sizeof(LNode)); q.data=b; if(i==1) { q.next=p;L=q;//插入在链表头部 } else { while(--i>1)p=p->next; q->next=p->next;p->next=q;//插入在第i个元素的位置 } }//Insert 2.18 StatusDelete(LinkList&L,inti)//在无头结点链表L中删除第i个元素 { if(i==1)L=L->next;//删除第一个元素 else { p=L; while(--i>1)p=p->next; p->next=p->next->next;//删除第i个元素 } }//Delete 2.19 StatusDelete_Between(Linklist&L,intmink,intmaxk)//删除元素递增排列的链表L中值大于mink且小于maxk的所有元素 { p=L; while(p->next->data<=mink)p=p->next;//p是最后一个不大于mink的元素 if(p->next)//如果还有比mink更大的元素 { q=p->next; while(q->data p->next=q; } }//Delete_Between 2.20 StatusDelete_Equal(Linklist&L)//删除元素递增排列的链表L中所有值相同的元素 { p=L->next;q=p->next;//p,q指向相邻两元素 while(p->next) { if(p->data! =q->data) { p=p->next;q=p->next;//当相邻两元素不相等时,p,q都向后推一步 } else { while(q->data==p->data) { free(q); q=q->next; } p->next=q;p=q;q=p->next;//当相邻元素相等时删除多余元素 }//else }//while }//Delete_Equal 2.21 voidreverse(SqList&A)//顺序表的就地逆置 { for(i=1,j=A.length;i A.elem<->A.elem[j]; }//reverse 2.22 voidLinkList_reverse(Linklist&L)//链表的就地逆置;为简化算法,假设表长大于2 { p=L->next;q=p->next;s=q->next;p->next=NULL; while(s->next) { q->next=p;p=q; q=s;s=s->next;//把L的元素逐个插入新表表头 } q->next=p;s->next=q;L->next=s; }//LinkList_reverse 分析: 本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头. 2.23 voidmerge1(LinkList&A,LinkList&B,LinkList&C)//把链表A和B合并为C,A和B的元素间隔排列,且使用原存储空间 { p=A->next;q=B->next;C=A; while(p&&q) { s=p->next;p->next=q;//将B的元素插入 if(s) { t=q->next;q->next=s;//如A非空,将A的元素插入 } p=s;q=t; }//while }//merge1 2.24 voidrever
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题集 答案 清华大学 严蔚敏 学习 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)