




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
嚴蔚敏《數(shù)據(jù)結(jié)構(gòu)(c語言版)習(xí)題集》算法設(shè)計題答案[1]嚴蔚敏《數(shù)據(jù)結(jié)構(gòu)(c語言版)習(xí)題集》算法設(shè)計題答案第一章緒論1.16voidprint_descending(intx,inty,intz)//按從大到小順序輸出三個數(shù){scanf("%d,%d,%d",&x,&y,&z);if(x<y)x<->y;//<->為表示交換的雙目運算符,以下同if(y<z)y<->z;if(x<y)x<->y;//冒泡排序printf("%d%d%d",x,y,z);}//print_descending1.17Statusfib(intk,intm,int&f)//求k階斐波那契序列的第m項的值f{inttempd;if(k<2||m<0)returnERROR;if(m<k-1)f=0;elseif(m==k-1)f=1;else{for(i=0;i<=k-2;i++)temp[i]=0;temp[k-1]=1;//初始化for(i=k;i<=m;i++)//求出序列第k至第m個元素的值{sum=0;for(j=i-k;j<i;j++)sum+=temp[j];temp[i]=sum;}f=temp[m];}returnOK;}//fib分析:通過保存已經(jīng)計算出來的結(jié)果,此方法的時間復(fù)雜度僅為O(m^2).如果采用遞歸編程(大多數(shù)人都會首先想到遞歸方法),則時間復(fù)雜度將高達O(k^m).1.18typedefstruct{char*sport;enum{male,female}gender;charschoolname;//校名為'A','B','C','D'或'E'char*result;intscore;}resulttype;typedefstruct{intmalescore;intfemalescore;inttotalscore;}scoretype;voidsummary(resulttyperesult[])//求各校的男女總分和團體總分,假設(shè)結(jié)果已經(jīng)儲存在result[]數(shù)組中{scoretypescore;i=0;while(result[i].sport!=NULL){switch(result[i].schoolname){case'A':score[0].totalscore+=result[i].score;if(result[i].gender==0)score[0].malescore+=result[i].score;elsescore[0].femalescore+=result[i].score;break;case'B':score.totalscore+=result[i].score;if(result[i].gender==0)score.malescore+=result[i].score;elsescore.femalescore+=result[i].score;break;………………}i++;}for(i=0;i<5;i++){printf("School%d:\n",i);printf("Totalscoreofmale:%d\n",score[i].malescore);printf("Totalscoreoffemale:%d\n",score[i].femalescore);printf("Totalscoreofall:%d\n\n",score[i].totalscore);}}//summaryStatusalgo119(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分析:當(dāng)某一項的結(jié)果超過了maxint時,它除以前面一項的商會發(fā)生異常.1.20voidpolyvalue(){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.10StatusDeleteK(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++)//注意循環(huán)結(jié)束的條件a.elem[i+count-1]=a.elem[i+count+k-1];a.length-=k;returnOK;}//DeleteK2.11StatusInsert_SqList(SqList&va,intx)//把x插入遞增有序表va中{if(va.length+1>va.listsize)returnERROR;va.length++;for(i=va.length-1;va.elem[i]>x&&i>=0;i--)va.elem[i+1]=va.elem[i];va.elem[i+1]=x;returnOK;}//Insert_SqList2.12intListComp(SqListA,SqListB)//比較字符表A和B,并用返回值表示結(jié)果,值為正,表示A>B;值為負,表示A<B;值為零,表示A=B{for(i=1;A.elem[i]||B.elem[i];i++)if(A.elem[i]!=B.elem[i])returnA.elem[i]-B.elem[i];return0;}//ListComp2.13LNode*Locate(LinkListL,intx)//鏈表上的元素查找,返回指針{for(p=l->next;p&&p->data!=x;p=p->next);returnp;}//Locate2.14intLength(LinkListL)//求鏈表的長度{for(k=0,p=L;p->next;p=p->next,k++);returnk;}//Length2.15voidListConcat(LinkListha,LinkListhb,LinkList&hc)//把鏈表hb接在ha后面形成鏈表hc{hc=ha;p=ha;while(p->next)p=p->next;p->next=hb;}//ListConcat2.16見書后答案.2.17StatusInsert(LinkList&L,inti,intb)//在無頭結(jié)點鏈表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個元素的位置}}//Insert2.18StatusDelete(LinkList&L,inti)//在無頭結(jié)點鏈表L中刪除第i個元素{if(i==1)L=L->next;//刪除第一個元素else{p=L;while(--i>1)p=p->next;p->next=p->next->next;//刪除第i個元素}}//Delete2.19StatusDelete_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<maxk)q=q->next;//q是第一個不小于maxk的元素p->next=q;}}//Delete_Between2.20StatusDelete_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;//當(dāng)相鄰兩元素不相等時,p,q都向后推一步}else{while(q->data==p->data){free(q);q=q->next;}p->next=q;p=q;q=p->next;//當(dāng)相鄰元素相等時刪除多余元素}//else}//while}//Delete_Equal2.21voidreverse(SqList&A)//順序表的就地逆置{for(i=1,j=A.length;i<j;i++,j--)A.elem[i]<->A.elem[j];}//reverse2.22voidLinkList_reverse(Linklist&L)//鏈表的就地逆置;為簡化算法,假設(shè)表長大于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的當(dāng)前元素q插入新的鏈表頭部,p為新表表頭.2.23voidmerge1(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}//merge12.24voidreverse_merge(LinkList&A,LinkList&B,LinkList&C)//把元素遞增排列的鏈表A和B合并為C,且C中元素遞減排列,使用原空間{pa=A->next;pb=B->next;pre=NULL;//pa和pb分別指向A,B的當(dāng)前元素while(pa||pb){if(pa->data<pb->data||!pb){pc=pa;q=pa->next;pa->next=pre;pa=q;//將A的元素插入新表}else{pc=pb;q=pb->next;pb->next=pre;pb=q;//將B的元素插入新表}pre=pc;}C=A;A->next=pc;//構(gòu)造新表頭}//reverse_merge分析:本算法的思想是,按從小到大的順序依次把A和B的元素插入新表的頭部pc處,最后處理A或B的剩余元素.2.25voidSqList_Intersect(SqListA,SqListB,SqList&C)//求元素遞增排列的線性表A和B的元素的交集并存入C中{i=1;j=1;k=0;while(A.elem[i]&&B.elem[j]){if(A.elem[i]<B.elem[j])i++;if(A.elem[i]>B.elem[j])j++;if(A.elem[i]==B.elem[j]){C.elem[++k]=A.elem[i];//當(dāng)發(fā)現(xiàn)了一個在A,B中都存在的元素,i++;j++;//就添加到C中}}//while}//SqList_Intersect2.26voidLinkList_Intersect(LinkListA,LinkListB,LinkList&C)//在鏈表結(jié)構(gòu)上重做上題{p=A->next;q=B->next;pc=(LNode*)malloc(sizeof(LNode));while(p&&q){if(p->data<q->data)p=p->next;elseif(p->data>q->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_Intersect2.27voidSqList_Intersect_True(SqList&A,SqListB)//求元素遞增排列的線性表A和B的元素的交集并存回A中{i=1;j=1;k=0;while(A.elem[i]&&B.elem[j]){if(A.elem[i]<B.elem[j])i++;elseif(A.elem[i]>B.elem[j])j++;elseif(A.elem[i]!=A.elem[k]){A.elem[++k]=A.elem[i];//當(dāng)發(fā)現(xiàn)了一個在A,B中都存在的元素i++;j++;//且C中沒有,就添加到C中}}//whilewhile(A.elem[k])A.elem[k++]=0;}//SqList_Intersect_True2.28voidLinkList_Intersect_True(LinkList&A,LinkListB)//在鏈表結(jié)構(gòu)上重做上題{p=A->next;q=B->next;pc=A;while(p&&q){if(p->data<q->data)p=p->next;elseif(p->data>q->data)q=q->next;elseif(p->data!=pc->data){pc=pc->next;pc->data=p->data;p=p->next;q=q->next;}}//while}//LinkList_Intersect_True2.29voidSqList_Intersect_Delete(SqList&A,SqListB,SqListC){i=0;j=0;k=0;m=0;//i指示A中元素原來的位置,m為移動后的位置while(i<A.length&&j<B.length&&k<C.length){if(B.elem[j]<C.elem[k])j++;elseif(B.elem[j]>C.elem[k])k++;else{same=B.elem[j];//找到了相同元素samewhile(B.elem[j]==same)j++;while(C.elem[k]==same)k++;//j,k后移到新的元素while(i<A.length&&A.elem[i]<same)A.elem[m++]=A.elem[i++];//需保留的元素移動到新位置while(i<A.length&&A.elem[i]==same)i++;//跳過相同的元素}}//whilewhile(i<A.length)A.elem[m++]=A.elem[i++];//A的剩余元素重新存儲。A.length=m;}//SqList_Intersect_Delete分析:先從B和C中找出共有元素,記為same,再在A中從當(dāng)前位置開始,凡小于same的元素均保留(存到新的位置),等于same的就跳過,到大于same時就再找下一個same.2.30voidLinkList_Intersect_Delete(LinkList&A,LinkListB,LinkListC)//在鏈表結(jié)構(gòu)上重做上題{p=B->next;q=C->next;r=A-next;while(p&&q&&r){if(p->data<q->data)p=p->next;elseif(p->data>q->data)q=q->next;else{u=p->data;//確定待刪除元素uwhile(r->next->data<u)r=r->next;//確定最后一個小于u的元素指針rif(r->next->data==u){s=r->next;while(s->data==u){t=s;s=s->next;free(t);//確定第一個大于u的元素指針s}//whiler->next=s;//刪除r和s之間的元素}//ifwhile(p->data=u)p=p->next;while(q->data=u)q=q->next;}//else}//while}//LinkList_Intersect_Delete2.31StatusDelete_Pre(CiLNode*s)//刪除單循環(huán)鏈表中結(jié)點s的直接前驅(qū){p=s;while(p->next->next!=s)p=p->next;//找到s的前驅(qū)的前驅(qū)pp->next=s;returnOK;}//Delete_Pre2.32StatusDuLNode_Pre(DuLinkList&L)//完成雙向循環(huán)鏈表結(jié)點的pre域{for(p=L;!p->next->pre;p=p->next)p->next->pre=p;returnOK;}//DuLNode_Pre2.33StatusLinkList_Divide(LinkList&L,CiList&A,CiList&B,CiList&C)//把單鏈表L的元素按類型分為三個循環(huán)鏈表.CiList為帶頭結(jié)點的單循環(huán)鏈表類型.{s=L->next;A=(CiList*)malloc(sizeof(CiLNode));p=A;B=(CiList*)malloc(sizeof(CiLNode));q=B;C=(CiList*)malloc(sizeof(CiLNode));r=C;//建立頭結(jié)點while(s){if(isalphabet(s->data)){p->next=s;p=s;}elseif(isdigit(s->data)){q->next=s;q=s;}else{r->next=s;r=s;}}//whilep->next=A;q->next=B;r->next=C;//完成循環(huán)鏈表}//LinkList_Divide2.34voidPrint_XorLinkedList(XorLinkedListL)//從左向右輸出異或鏈表的元素值{p=L.left;pre=NULL;while(p){printf("%d",p->data);q=XorP(p->LRPtr,pre);pre=p;p=q;//任何一個結(jié)點的LRPtr域值與其左結(jié)點指針進行異或運算即得到其右結(jié)點指針}}//Print_XorLinkedList2.35StatusInsert_XorLinkedList(XorLinkedList&L,intx,inti)//在異或鏈表L的第i個元素前插入元素x{p=L.left;pre=NULL;r=(XorNode*)malloc(sizeof(XorNode));r->data=x;if(i==1)//當(dāng)插入點在最左邊的情況{p->LRPtr=XorP(p.LRPtr,r);r->LRPtr=p;L.left=r;returnOK;}j=1;q=p->LRPtr;//當(dāng)插入點在中間的情況while(++j<i&&q){q=XorP(p->LRPtr,pre);pre=p;p=q;}//while//在p,q兩結(jié)點之間插入if(!q)returnINFEASIBLE;//i不可以超過表長p->LRPtr=XorP(XorP(p->LRPtr,q),r);q->LRPtr=XorP(XorP(q->LRPtr,p),r);r->LRPtr=XorP(p,q);//修改指針returnOK;}//Insert_XorLinkedList2.36StatusDelete_XorLinkedList(XorlinkedList&L,inti)//刪除異或鏈表L的第i個元素{p=L.left;pre=NULL;if(i==1)//刪除最左結(jié)點的情況{q=p->LRPtr;q->LRPtr=XorP(q->LRPtr,p);L.left=q;free(p);returnOK;}j=1;q=p->LRPtr;while(++j<i&&q){q=XorP(p->LRPtr,pre);pre=p;p=q;}//while//找到待刪結(jié)點qif(!q)returnINFEASIBLE;//i不可以超過表長if(L.right==q)//q為最右結(jié)點的情況{p->LRPtr=XorP(p->LRPtr,q);L.right=p;free(q);returnOK;}r=XorP(q->LRPtr,p);//q為中間結(jié)點的情況,此時p,r分別為其左右結(jié)點p->LRPtr=XorP(XorP(p->LRPtr,q),r);r->LRPtr=XorP(XorP(r->LRPtr,q),p);//修改指針free(q);returnOK;}//Delete_XorLinkedList2.37voidOEReform(DuLinkedList&L)//按1,3,5,...4,2的順序重排雙向循環(huán)鏈表L中的所有結(jié)點{p=L.next;while(p->next!=L&&p->next->next!=L){p->next=p->next->next;p=p->next;}//此時p指向最后一個奇數(shù)結(jié)點if(p->next==L)p->next=L->pre->pre;elsep->next=l->pre;p=p->next;//此時p指向最后一個偶數(shù)結(jié)點while(p->pre->pre!=L){p->next=p->pre->pre;p=p->next;}p->next=L;//按題目要求調(diào)整了next鏈的結(jié)構(gòu),此時pre鏈仍為原狀for(p=L;p->next!=L;p=p->next)p->next->pre=p;L->pre=p;//調(diào)整pre鏈的結(jié)構(gòu),同2.32方法}//OEReform分析:next鏈和pre鏈的調(diào)整只能分開進行.如同時進行調(diào)整的話,必須使用堆棧保存偶數(shù)結(jié)點的指針,否則將會破壞鏈表結(jié)構(gòu),造成結(jié)點丟失.2.38DuLNode*Locate_DuList(DuLinkedList&L,intx)//帶freq域的雙向循環(huán)鏈表上的查找{p=L.next;while(p.data!=x&&p!=L)p=p->next;if(p==L)returnNULL;//沒找到p->freq++;q=p->pre;while(q->freq<=p->freq)q=q->pre;//查
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津市寧河縣蘆臺五中重點名校2025屆初三下學(xué)期第一次教學(xué)質(zhì)量檢查考試數(shù)學(xué)試題含解析
- 山東省威海市示范名校2024-2025學(xué)年高三月考3語文試題含解析
- 上海海事大學(xué)《特色文化》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇省南通市啟東市2024-2025學(xué)年八年級下學(xué)期期中道德與法治試卷(含答案)
- 云計算服務(wù)模式在航空航天領(lǐng)域的應(yīng)用與技術(shù)創(chuàng)新研究報告
- 海外留學(xué)咨詢行業(yè)在中國的發(fā)展與競爭格局研究報告2025展望
- 智能調(diào)度2025年智慧公交系統(tǒng)車輛調(diào)度優(yōu)化評估報告
- 2025年腫瘤精準醫(yī)療臨床實踐案例集:精準診療技術(shù)新應(yīng)用前景
- 2025屆福建龍海市第二中學(xué)高考沖刺模擬英語試題含解析
- 短視頻平臺內(nèi)容監(jiān)管與未成年人保護研究報告
- 代謝性堿中毒護理課件
- 2024年山東大學(xué)出版社有限公司招聘筆試參考題庫含答案解析
- 提升地方政府行政效能的對策研究
- 船舶防污染基礎(chǔ)知識培訓(xùn)
- 餐廳小院策劃方案
- 氫氧化鈉介紹msds
- 青甘大環(huán)線路線
- 電梯安裝施工計劃書
- 校內(nèi)蜜雪冰城調(diào)查分析報告
- 臍帶、胎盤蛻膜干細胞制備與儲存協(xié)議
- 干冰傳奇-科學(xué)實驗
評論
0/150
提交評論