数据结构题集(C语言版)算法设计题答案.docx
《数据结构题集(C语言版)算法设计题答案.docx》由会员分享,可在线阅读,更多相关《数据结构题集(C语言版)算法设计题答案.docx(101页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章绪论1.16void print_descending(int x,int yjnt z)/按从大到小顺序输出三个数 (scanf(%d,%d,%d”,&x,&y,&z);if(xy) xy; 。为表示交换的双目运算符,以下同if(yz) yz;if(xy) 冒泡排序printf(%d %d %d,x/y/z);/print_descending1.17Status fib(intk,intm,int&f)求k阶斐波那契序列的第m项的值f(int tempd;if(k211 m0) return ERROR;if(mk-l) f=0;else if (m=k-l) f=l;else(fo
2、r(i=0;i=k-2;i+) tempi=0;初始化for(i=k;i=m;i+) 求出序列第k至第m个元素的值 (sum=O;for(j=i-k;ji;j+) sum+=tempj;tempi=sum;)f=tempm;)return OK;/fib分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为0(m9).如果采用递归编程(大多数人都会首先 想到递归方法),则时间复杂度将高达O(Hm).1.18typedef structchar * sport;enumfmalejemalegender;char schoolname; 校名为A,或Echar *result;int scor
3、e; resulttype;typedef structint malescore;int femalescore;int totalscore; scoretype;void summary(resulttype result)求各校的男女总分和团体总分,假设结果已经储存在result数组中 scoretype score ;i=0;while(resulti.sport!=NULL)switch(resulti.schoolname)(case A:score 0 .totalscore+=resulti.score;if(resulti.gender=O) score 0 .malesc
4、ore+=resulti.score;else score 0 .femalescore+=resulti.score;break;case B: score.totalscore+=resulti.score;if(resulti.gender=O) score.malescore+=resulti.score;else score.femalescore+=resulti.score;break;i+;)for(i=0;i5;i+)(printf(School %d:n”,i);printf(Total score of male:%dn”,scorei.malescore);printf
5、(HTotal score of female:%dn”,scorei.femalescore);printf(Total score of all:%dnnzscorei.totalscore);)/summary1.19Status algoll9(int aARRSIZE)/ i!*2Ai 序列的值且不超过 maxint(last=l;for(i=l;i=ARRSIZE;i+)(ai-l=last*2*i;if(ai-l/last)!=(2*i) reurn OVERFLOW;last=ai-l;return OK;)/algoll9分析:当某一项的结果超过了 maxint时,它除以前面
6、一项的商会发生异常. 1.20void polyvalue()(float ad;float *p=a;printf(lnput number of terms:);scanf(”d”,&n);printf(lnput the %d coefficients from aO to a%d:n/nzn);for(i=0;i=n;i+) scanf(H%f/p+);printf(lnput value of x:);scanf(”f*&x);p=a;xp=l;sum=O; /xp用于存放x的i次方for(i=0;i=n;i+)(sum+=xp*(*p+);xp*=x;printf(Value is
7、:%f,sum);/poly value第二章线性表2.10Status DeleteK(SqList &ajnt ijnt k)删除线性表a中第i个元素起的k个元素(if(il| |ka.length) return INFEASIBLE;for(count=l;i+countlva.listsize) return ERROR;va.length+;for(i=va.length-l;va.elemix&i=0;i-)va.elemi+l=va.elemi;va.elemi+l=x;return OK;/lnsert_SqList2.12int ListComp(SqList A,SqLi
8、st B)比较字符表A和B,并用返回值表示结果,值为正,表示AB;值为负,表示Anext;p&p-data!=x;p=p-next);return p;/Locate2.14int Length(LinkList L)求链表的长度 (for(k=0/p=L;p-next;p=p-next/k+);return k;/Length2.15void ListConcat(LinkList hazLinkList hb,LinkList &hc)把链表 hb 接在 ha 后面形成链表 he hc=ha;p=ha;while(p-next) p=p-next;p-next=hb;/ListConcat
9、2.16见书后答案.2.17Status lnsert(LinkList&L,inti,int b) 在无头结点链表L的第i个元素之前插入元素b (p=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=l)(q.next=p;L=q; 插入在链表头部) else (while(il) p=p-next;q-next=p-next;pnext=q; 插入在第i个元素的位置)/lnsert2.18Status Delete(LinkList &L,int i)在无头结点链表L中删除第i个元素 (if(i=l) L=Lnext; 删除第一个元素 el
10、se(P=L;while(-il) p=p-next;p-next=p-next-next; 删除第 i 个元素)/Delete 2.19Status Delete_Between(Linklist &LJnt minkjnt maxk)删除元素递增排列的链表L中值大于mink且小于 maxk的所有元素 (P=L;while(p-next-datanext; /p 是最后一个不大于 mink 的元素if(p-next)如果还有比mink更大的元素q=p-next;while(q-datanext; q 是第一个不小于 maxk 的元素 p-next=q;)/Delete_Between2.20
11、Status Delete_Equal(Linklist&L)删除元素递增排列的链表L中所有值相同的元素p=L-next;q=p-next; /pzq 指向相邻两元素while(p-next)(if(p-data!=q-data)(p=p-next;q=p-next; 当相邻两元素不相等时,p,q都向后推一步)elsewhile(q-data=p-data)free(q);q=q-next;)pnex匕q;p=q;q=pnext; 当相邻元素相等时删除多余元素/else/while/Delete_Equal2.21void reverse(SqList &A)顺序表的就地逆置for(i=lj=
12、A.length;ij;i+J-)A.elemiA.elemj;/reverse2.22void LinkListeverse(Linklist &L)链表的就地逆置;为简化算法,假设表长大于2p=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;/UnkList_reverse分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.2.23void mergel(LinkList &AzL
13、inkList &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; /W B 的元素插入 if(t=q-next;q-next=s; /$ll A 非空,将 A 的元素插入)P=s;q=t;/while/mergel2.24void reverse_merge(LinkList &A,LinkList &B,LinkList &C)把元素递增排列的链表 A 和 B 合并为 C,且 C 中元素 递减排列,使用原空间(pa=A-next;pb=B-next
14、;pre=NULL; /pa 和 pb 分别指向 A,B 的当前元素while(pa| |pb)(if(pa-datadata| |!pb)(pc=pa;q=pa-next;pa-next=pre;pa=q; / A 的元素插入新表)else(pc=pb;q=pb-next;pb-next=pre;pb=q; /W B 的元素插入新表pre=pc;)C = A;A-next二pc; 构造新表头/reve rse_m e rge分析:本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的 剩余元素.2.25void SqListntersect(SqList A
15、,SqList B,SqList &C)求元素递增排列的线性表A和B的元素的交集并存入C中i=l;j=l;k=O;while(A.elemi&B.elemj)(if(A.elemiB.elemj) j+;if(A.elemi=B.elemj)C.elem+k=当发现了一个在AZB中都存在的元素,i+;j+; 就添力口至IJ C中)/while/SqList_lntersect2.26void LinkList_lntersect(LinkList A,LinkList BzLinkList &C)在链表结构上重做上题(p=A-next;q=B-next;pc=(LNode*)malloc(si
16、zeof(LNode);while(p&q)(if(p-datadata) p=p-next;else if(p-dataq-data) q=q-next;else(s=(LNode*)malloc(sizeof(LNode);s-data=p-data;pc-next=s;pc=s;p=p-next;q=q-next;)/whileC=pc;/LinkList_lntersect2.27void SqListntersect_True(SqList &A,SqList B)求元素递增排列的线性表A和B的元素的交集并存回A中 (i=l;j=l;k=O;while(A.elemi&B.elemj
17、)if(A.elemiB.elemj) j+;else if(A.elemi!=A.elemk)(A.elem+k=当发现了一个在AZB中都存在的元素i+;j+; 且C中没有,就添加到C中)/whilewhile(A.elemk) A.elemk+=0;/SqList_lntersect_True2.28void LinkList_lntersect_True(LinkList &A,LinkList B)在链表结构上重做上题(p=A-next;q=B-next;pc=A;while(p&q)(if(p-datadata) p=p-next;else if(p-dataq-data) q=q-
18、next;else if(p-data!=pc-data)(pc=pc-next;pc-data=p-data;p=p-next;q=q-next;) /while /LinkList_lntersect_True 2.29 void SqListJntersect_Delete(SqList &A,SqList B,SqList C) i=0;j=0;k=0;m=0; /i指示A中元素原来的位置,m为移动后的位置 while(iA.length&jB.length& kC.length) (if(B.elemjC.elemk) k+; else (same=B.elemj;找到了相同元素 s
19、amewhile(B.elemj=same) j+; while(C.elemk=same) k+; j,k 后移到新的元素 while(iA.length&A.elemisame) A.elemm+=A.elemi+; 需保留的元素移动到新位置 while(iA.length&A.elemi=same) i+; 跳过相同的元素 /while while(inext;q=C-next;r=A-next; while(p&q&r) ( if(p-datadata) p=p-next; else if(p-dataq-data) q=q-next; else ( u=p-data; 确定待删除元素
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 算法 设计 答案
限制150内