![《數(shù)據(jù)結(jié)構(gòu)》嚴(yán)蔚敏版課后習(xí)題答案_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/a2a74e6c-0d87-43cc-8bbd-b7b117c59c17/a2a74e6c-0d87-43cc-8bbd-b7b117c59c171.gif)
![《數(shù)據(jù)結(jié)構(gòu)》嚴(yán)蔚敏版課后習(xí)題答案_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/a2a74e6c-0d87-43cc-8bbd-b7b117c59c17/a2a74e6c-0d87-43cc-8bbd-b7b117c59c172.gif)
![《數(shù)據(jù)結(jié)構(gòu)》嚴(yán)蔚敏版課后習(xí)題答案_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/a2a74e6c-0d87-43cc-8bbd-b7b117c59c17/a2a74e6c-0d87-43cc-8bbd-b7b117c59c173.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第 1 章 緒論1.1 簡述以下術(shù)語:數(shù)據(jù),數(shù)據(jù)元素、數(shù)據(jù)對象、數(shù)據(jù)結(jié)構(gòu)、存儲結(jié) 構(gòu)、數(shù)據(jù)類型和抽象數(shù)據(jù)類型。解:數(shù)據(jù) 是對客觀事物的符號表示。 在計(jì)算機(jī)科學(xué)中是指所有能輸入 到計(jì)算機(jī)中并被計(jì)算機(jī)程序處理的符號的總稱。數(shù)據(jù)元素 是數(shù)據(jù)的根本單位, 在計(jì)算機(jī)程序中通常作為一個(gè)整體 進(jìn)行考慮和處理。數(shù)據(jù)對象 是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。數(shù)據(jù)結(jié)構(gòu) 是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集 合。存儲結(jié)構(gòu) 是數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)中的表示。數(shù)據(jù)類型 是一個(gè)值的集合和定義在這個(gè)值集上的一組操作的總 稱。抽象數(shù)據(jù)類型 是指一個(gè)數(shù)學(xué)模型以及定義在該模型上的一組操 作。是對一般數(shù)據(jù)類型的擴(kuò)展。
2、1.2 試描述數(shù)據(jù)結(jié)構(gòu)和抽象數(shù)據(jù)類型的概念與程序設(shè)計(jì)語言中數(shù)據(jù) 類型概念的區(qū)別。解:抽象數(shù)據(jù)類型包含一般數(shù)據(jù)類型的概念, 但含義比一般數(shù)據(jù) 類型更廣、更抽象。一般數(shù)據(jù)類型由具體語言系統(tǒng)內(nèi)部定義,直接提 供給編程者定義用戶數(shù)據(jù), 因此稱它們?yōu)轭A(yù)定義數(shù)據(jù)類型。 抽象數(shù)據(jù)類型通常由編程者定義,包括定義它所使用的數(shù)據(jù)和在這些數(shù)據(jù)上所 進(jìn)行的操作。在定義抽象數(shù)據(jù)類型中的數(shù)據(jù)局部和操作局部時(shí),要求只定義到數(shù)據(jù)的邏輯結(jié)構(gòu)和操作說明,不考慮數(shù)據(jù)的存儲結(jié)構(gòu)和操作 的具體實(shí)現(xiàn),這樣抽象層次更高,更能為其他用戶提供良好的使用接 口。1.3設(shè)有數(shù)據(jù)結(jié)構(gòu)D,R,其中, R r, r d1,d2 , d2,d3 , d3
3、,d4試按圖論中圖的畫法慣例畫出其邏輯結(jié)構(gòu)圖。解:1.4試仿照三元組的抽象數(shù)據(jù)類型分別寫出抽象數(shù)據(jù)類型復(fù)數(shù)和有 理數(shù)的定義有理數(shù)是其分子、分母均為自然數(shù)且分母不為零的分 數(shù)。解:ADT Complex數(shù)據(jù)對象:D=r.i|r.i為實(shí)數(shù)數(shù)據(jù)關(guān)系:R=<r.i>根本操作:Ini tComplex&C,re,im操作結(jié)果:構(gòu)造一個(gè)復(fù)數(shù)C,其實(shí)部和虛局部別為re和imDestroyCmoplex(&C)操作結(jié)果:銷毀復(fù)數(shù) CGet(C,k,&e)操作結(jié)果:用e返回復(fù)數(shù)C的第k元的值Put(&C,k,e)操作結(jié)果:改變復(fù)數(shù)C的第k元的值為eIsAscendin
4、g(C)操作結(jié)果:如果復(fù)數(shù)C的兩個(gè)元素按升序排列,那么返回1,否那么返回 0IsDescending(C)操作結(jié)果:如果復(fù)數(shù)C的兩個(gè)元素按降序排列,那么返回 1,否那么返回 0Max(C,&e)操作結(jié)果:用e返回復(fù)數(shù)C的兩個(gè)元素中值較大的一個(gè)Min(C,&e)操作結(jié)果:用e返回復(fù)數(shù)C的兩個(gè)元素中值較小的一個(gè)ADT ComplexADT RationalNumber數(shù)據(jù)對象:D=s,m|s,m為自然數(shù),且m不為0 數(shù)據(jù)關(guān)系: R=<s,m>根本操作:InitRationalNumber(&R,s,m)操作結(jié)果:構(gòu)造一個(gè)有理數(shù)R,其分子和分母分別為s和mDest
5、royRationalNumber(&R)操作結(jié)果:銷毀有理數(shù) RGet(R,k,&e)操作結(jié)果:用e返回有理數(shù)R的第k兀的值Put(&R,k,e)操作結(jié)果:改變有理數(shù)R的第k兀的值為eIsAscending(R)操作結(jié)果:假設(shè)有理數(shù)R的兩個(gè)元素按升序排列,那么返回1,否那么返回 0IsDescending(R)操作結(jié)果:假設(shè)有理數(shù)R的兩個(gè)兀素按降序排列,那么返回1,否那么返回 0Max(R,&e)操作結(jié)果:用e返回有理數(shù)R的兩個(gè)兀素中值較大的一個(gè)Min(R,&e)操作結(jié)果:用e返回有理數(shù)R的兩個(gè)元素中值較小的一個(gè)ADT RationalNumber1.
6、5 試畫出與以下程序段等價(jià)的框圖(1) product=1; i=1;while(i<=n)product *= i;i+;(2) i=0;do i+; while(i!=n) && (ai!=x);(3) switch case x<y: z=y-x; break;case x=y: z=abs(x*y); break;default: z=(x-y)/abs(x)*abs(y);1.6 在程序設(shè)計(jì)中,常用以下三種不同的出錯(cuò)處理方式:(1) 用 exit 語句終止執(zhí)行并報(bào)告錯(cuò)誤;(2) 以函數(shù)的返回值區(qū)別正確返回或錯(cuò)誤返回;(3) 設(shè)置一個(gè)整型變量的函數(shù)參數(shù)以區(qū)別
7、正確返回或某種錯(cuò)誤返 回。試討論這三種方法各自的優(yōu)缺點(diǎn)。解:(1)exit常用于異常錯(cuò)誤處理,它可以強(qiáng)行中斷程序的執(zhí)行, 返回操作系統(tǒng)(2) 以函數(shù)的返回值判斷正確與否常用于子程序的測試,便于實(shí) 現(xiàn)程序的局部控制。(3) 用整型函數(shù)進(jìn)行錯(cuò)誤處理的優(yōu)點(diǎn)是可以給出錯(cuò)誤類型,便于 迅速確定錯(cuò)誤。1.7 在程序設(shè)計(jì)中,可采用以下三種方法實(shí)現(xiàn)輸出和輸入:(1) 通過 scanf 和 printf 語句;(2) 通過函數(shù)的參數(shù)顯式傳遞;(3) 通過全局變量隱式傳遞。試討論這三種方法的優(yōu)缺點(diǎn)。解:(1) 用 scanf 和 printf 直接進(jìn)行輸入輸出的好處是形象、 直 觀,但缺點(diǎn)是需要對其進(jìn)行格式控制,
8、較為煩瑣,如果出現(xiàn)錯(cuò)誤,那么 會(huì)引起整個(gè)系統(tǒng)的崩潰。(2) 通過函數(shù)的參數(shù)傳遞進(jìn)行輸入輸出,便于實(shí)現(xiàn)信息的隱蔽, 減少出錯(cuò)的可能。(3) 通過全局變量的隱式傳遞進(jìn)行輸入輸出最為方便,只需修改 變量的值即可,但過多的全局變量使程序的維護(hù)較為困難。1.8 設(shè) n 為正整數(shù)。試確定以下各程序段中前置以記號 的語句的頻 度:(1) i=1; k=0;while(i<=n-1) k += 10*i;i+;(2) i=1; k=0;do k += 10*i;i+; while(i<=n-1);(3) i=1; k=0;while (i<=n-1) i+; k += 10*i;(4) k=
9、0;for(i=1; i<=n; i+) for(j=i; j<=n; j+) k+;(5) for(i=1; i<=n; i+) for(j=1; j<=i; j+) for(k=1; k<=j; k+) x += delta;(6) i=1; j=0;while(i+j v=n) if(i>j) j+;else i+;(7) x二n; y=0;/ n是不小于1的常數(shù)while(x>=(y+1)*(y+1) y+;(8) x=91; y=100;while(y>0) if(x>100) x -= 10; y-; else x+;解:(1)
10、 n-1(2) n-1(3) n-1(4) n+(n-1)+( n-2)+.+1 =n(n 1)2(5) 1+(1+2)+(1+2+3)+(1+2+3+.+n)=n i(i 1)i 121) t (i2 i)2 i 11 n .2 1i2 i 12 i 11)(2 n 1)丄 n(n41)丄 n(n 1)(2n12(6) n(7) . n向下取整(8) 11001.9假設(shè)n為2的乘幕,并且n>2,試求以下算法的時(shí)間復(fù)雜度及變 量count的值(以n的函數(shù)形式表示)。int Time(i nt n) count = 0;x=2;while(x< n/2) x *= 2;coun t+
11、;retur n count;解:o(log 2 n)count二 log 2 n 21.11有實(shí)現(xiàn)同一功能的兩個(gè)算法,其時(shí)間復(fù)雜度分別為0 2n和0 n10,假設(shè)現(xiàn)實(shí)計(jì)算機(jī)可連續(xù)運(yùn)算的時(shí)間為107秒(100多天),又每 秒可執(zhí)行根本操作(根據(jù)這些操作來估算算法時(shí)間復(fù)雜度)105次。試問在此條件下,這兩個(gè)算法可解問題的規(guī)模(即n值的范圍)各為 多少?哪個(gè)算法更適宜?請說明理由。解:2n 1012n=40n10 1012n=16那么對于同樣的循環(huán)次數(shù)n,在這個(gè)規(guī)模下,第二種算法所花費(fèi)的 代價(jià)要大得多。故在這個(gè)規(guī)模下,第一種算法更適宜。1.12設(shè)有以下三個(gè)函數(shù):f n 21n4 n2 1000 ,
12、 g n 15n4 500n3 , h n 500n35 nlogn請判斷以下斷言正確與否:(1) f(n)是 O(g(n)(2) h(n)是 O(f(n)(3) g(n)是 O(h(n) h(n)是 O(n3.5)(5) h(n)是 O(nlogn)解:(1)對錯(cuò)(3)錯(cuò)對(5)錯(cuò)1.13試設(shè)定假設(shè)干n值,比較兩函數(shù)n2和50n log?"的增長趨勢,并確 定n在什么范圍內(nèi),函數(shù)n2的值大于50 nl og2n的值。解:n2的增長趨勢快。但在n較小的時(shí)候,50nlogzn的值較大。當(dāng) n>438時(shí),n2 50n|og2n1.14判斷以下各對函數(shù)f n和g n,當(dāng)n時(shí),哪個(gè)函數(shù)
13、增長更快?(1) 1f n10n2Fnln n!fn2.1 nfn2n3;4鼻2.n 1, g n ln n!5 2, g n 13 n2.53ln n! 10n , g n 2n42n 2, g n n " n5解:(1)g(n)快(2)g(n)快f(n)快 f(n) 快1.15試用數(shù)學(xué)歸納法證明:n(1) i2 n n 1 2n 1/6n 0i 1(2) xi x n 1 1 / x 1 x 1,n 0i0n(3) 2i 1 2n 1 n 1i1n(4) 2i 1 n2n 1i1X, Y 和 Z1.16 試寫一算法,自大至小依次輸出順序讀入的三個(gè)整數(shù) 的值解:int max3(i
14、nt x,int y,int z)if(x>y)if(x>z) return x; else return z;elseif(y>z) return y;else return z;1.17 k 階斐波那契序列的定義為fo0 , fl 0,fk 20 , fk 11 ;fn k , n k,k 1,k 和 m 均以試編寫求k階斐波那契序列的第m項(xiàng)值的函數(shù)算法,值調(diào)用的形式在函數(shù)參數(shù)表中出現(xiàn)。解:k>0為階數(shù),n為數(shù)列的第n項(xiàng)int Fib on acci (int k,i nt n) if(k<1) exit(OVERFLOW);int *p,x;p=new in
15、 tk+1;if(!p) exit(OVERFLOW);int i,j;for(i=0;i<k+1;i+)if(i<k-1) pi=0;else pi=1;for(i=k+1;i< n+1;i+)x=p0;for(j=0;j<k;j+) pj=pj+1;pk=2*pk-1-x;return pk;1.18假設(shè)有A, B, C, D, E五個(gè)高等院校進(jìn)行田徑對抗賽,各院校的單項(xiàng)成績均已存入計(jì)算機(jī),并構(gòu)成一張表,表中每一行的形式為工程名 稱性別校名成績得分編寫算法,處理上述表格,以統(tǒng)計(jì)各院校的男、女總分和團(tuán)體總分,并輸出解:typedef enumA,B,C,D,E Sch
16、oolName; typedef enumFemale,Male SexType;typedef structchar event3; / 工程SexType sex;SchoolName school;int score; Component;typedef structint MaleSum; / 男團(tuán)總分int FemaleSum; / 女團(tuán)總分int TotalSum; / 團(tuán)體總分 Sum;Sum SumScore(SchoolName sn,Component a,int n) Sum temp;temp.MaleSum=0; temp.FemaleSum=0;temp.Total
17、Sum=0;int i;for(i=0;i<n;i+)if(ai.school=sn)if(ai.sex=Male) temp.MaleSum+=ai.score;if(ai.sex=Female)temp.FemaleSum+=ai.score;temp.TotalSum=temp.MaleSum+temp.FemaleSum;return temp;1.19 試編寫算法,計(jì)算 i!*2i 的值并存入數(shù)組 a0.arrsize-1的第i-1個(gè)分量中(i=1,2,n)。假設(shè)計(jì)算機(jī)中允許的整數(shù)最大值為 maxint ,那么當(dāng) n>arrsize 或?qū)δ硞€(gè) k 1 k n ,使 k!?
18、2k max int 時(shí),應(yīng) 按出錯(cuò)處理。注意選擇你認(rèn)為較好的出錯(cuò)處理方法。解:#include<iostream.h>#include<stdlib.h>#define MAXINT 65535#define ArrSize 100int fun(int i);int main()int i,k;int aArrSize; cout<<"Enter k:"cin>>k; if(k>ArrSize-1) exit(0);for(i=0;i<=k;i+)if(i=0) ai=1;elseif(2*i*ai-1>
19、MAXINT) exit(0);else ai=2*i*ai-1;for(i=0;i<=k;i+)if(ai>MAXINT) exit(0);else cout<<ai<<" "return 0;n1.20 試編寫算法求一元多項(xiàng)式的值Pn xaixi 的值 Pn x0 ,并確定i0算法中每一語句的執(zhí)行次數(shù)和整個(gè)算法的時(shí)間復(fù)雜度。 注意選擇你認(rèn)為較好的輸入和輸出方法。此題的輸入為ai i 0,1, ,n , xo和n ,輸出 為 Pn x0 。解:#include<iostream.h>#include<stdlib.h&
20、gt;#define N 10double polynomail(int a,int i,double x,int n);int main()double x;int n,i;int aN;cout<<" 輸入變量的值 x:"cin>>x;cout<<" 輸入多項(xiàng)式的階次 n:"cin>>n;if(n>N-1) exit(0);cout<<" 輸入多項(xiàng)式的系數(shù) a0-an:" for(i=0;i<=n;i+) cin>>ai;value iscout&
21、lt;<"The polynomail"<<polynomail(a,n,x,n)<<endl;return 0;double polyno mail(i nt a,i nt i,double x,i nt n)if(i>0) retur n an-i+po lyno mail(a,i-1,x ,n )*x;else return a n;本算法的時(shí)間復(fù)雜度為o(n)。第2章線性表2.1描述以下三個(gè)概念的區(qū)別:頭指針,頭結(jié)點(diǎn),首元結(jié)點(diǎn)(第一個(gè) 元素結(jié)點(diǎn))。解:頭指針是指向鏈表中第一個(gè)結(jié)點(diǎn)的指針。首元結(jié)點(diǎn)是指鏈表中存儲第一個(gè)數(shù)據(jù)元素的結(jié)點(diǎn)。
22、頭結(jié)點(diǎn)是在首元結(jié)點(diǎn)之前附設(shè)的一個(gè) 結(jié)點(diǎn),該結(jié)點(diǎn)不存儲數(shù)據(jù)元素,其指針域指向首元結(jié)點(diǎn),其作用主要 是為了方便對鏈表的操作。它可以對空表、非空表以及首元結(jié)點(diǎn)的操 作進(jìn)行統(tǒng)一處理。2.2填空題。解:(1)在順序表中插入或刪除一個(gè)元素,需要平均移動(dòng) 表中一 半元素,具體移動(dòng)的元素個(gè)數(shù)與 元素在表中的位置有關(guān)。(2) 順序表中邏輯上相鄰的元素的物理位置 必定緊鄰。單鏈表中 邏輯上相鄰的元素的物理位置 不一定緊鄰。(3) 在單鏈表中,除了首元結(jié)點(diǎn)外,任一結(jié)點(diǎn)的存儲位置由其前 驅(qū)結(jié)點(diǎn)的鏈域的值指示用進(jìn)行特殊處理。2.3在什么情況下用順序表比鏈表好?用順解:當(dāng)線性表的數(shù)據(jù)元素在物理位置上是連續(xù)存儲的時(shí)候, 序
23、表比用鏈表好,其特點(diǎn)是可以進(jìn)行隨機(jī)存取。2.4對以下單鏈表分別執(zhí)行以下各程序段,并畫出結(jié)果示意圖。L»5 |* T/ 310-TtKS解:PQS2.5畫出執(zhí)行以下各行語句后各指針及鏈表的示意圖L=(Li nkList)malloc(sizeof(LNode);P=L;for(i=1;i<=4;i+)P->n ext=(L in kList)malloc(sizeof(LNode);P=P-> next; P->data=i*2-1;P-> next二NULL;for(i=4;i>=1;i-) In s_Li nkList(L,i+1,i*2);fo
24、r(i=1;i<=3;i+) Del_Li nkList(L,i);解:L 1 4 *P2.6L是無表頭結(jié)點(diǎn)的單鏈表,且P結(jié)點(diǎn)既不是首元結(jié)點(diǎn),也不是尾元結(jié)點(diǎn),試從以下提供的答案中選擇適宜的語句序列。a. 在P結(jié)點(diǎn)后插入S結(jié)點(diǎn)的語句序列是 。b. 在P結(jié)點(diǎn)前插入S結(jié)點(diǎn)的語句序列是 。c. 在表首插入S結(jié)點(diǎn)的語句序列是(1) P->next=S;(2) P->next=P->next->next;(3) P->next=S->next;(4) S->next=P->next;(5) S->next=L;(6) S->next=NUL
25、L;(7) Q=P;(8) while(P->next!=Q) P=P->next;(9) while(P->next!=NULL) P=P->next;(10) P=Q;(11) P=L;(12) L=S;(13) L=P;解:a.(1)b. (7) (11) (8) (4) (1)c. (5) (12)d. (9) (1) (6)2.7L是帶表頭結(jié)點(diǎn)的非空單鏈表,且 P結(jié)點(diǎn)既不是首元結(jié)點(diǎn), 也不是尾元結(jié)點(diǎn),試從以下提供的答案中選擇適宜的語句序列。a. 刪 除 P 結(jié) 點(diǎn) 的 直 接 后 繼 結(jié) 點(diǎn) 的 語 句 序 列 是b. 刪 除 P 結(jié) 點(diǎn) 的 直 接 前 驅(qū)
26、結(jié) 點(diǎn) 的 語 句 序 列 是c. 刪除 P 結(jié)點(diǎn)的語句序列是 。d. 刪除首元結(jié)點(diǎn)的語句序列是 。e. 刪除尾元結(jié)點(diǎn)的語句序列是 。(1) P=P->next;(2) P->next=P;(3) P->next=P->next->next;(4) P=P->next->next;(5) while(P!=NULL) P=P->next;(6) while(Q->next!=NULL) P=Q; Q=Q->next; (7) while(P->next!=Q) P=P->next;(8) while(P->next-
27、>next!=Q) P=P->next;(9) while(P->next->next!=NULL) P=P->next;(10) Q=P;(11) Q=P->next;(12) P=L;(13) L=L->next;(14) free(Q);解:a. (11) (3) (14)b. (10) (12) (8) (3) (14)c. (10) (12) (7) (3) (14)d. (12) (11) (3) (14)e. (9) (11) (3) (14)2.8 P 結(jié)點(diǎn)是某雙向鏈表的中間結(jié)點(diǎn),試從以下提供的答案中選 擇適宜的語句序列。a. 在 P
28、結(jié) 點(diǎn) 后 插 入 S 結(jié) 點(diǎn) 的 語 句 序 列 是b. 在 P 結(jié) 點(diǎn) 前 插 入 S 結(jié) 點(diǎn) 的 語 句 序 列 是c. 刪 除 P 結(jié) 點(diǎn) 的 直 接 后 繼 結(jié) 點(diǎn) 的 語 句 序 列 是d. 刪 除 P 結(jié) 點(diǎn) 的 直 接 前 驅(qū) 結(jié) 點(diǎn) 的 語 句 序 列 是e. 刪除 P 結(jié)點(diǎn)的語句序列是 。(1) P->next=P->next->next;(2) P->priou=P->priou->priou;(3) P->next=S;(4) P->priou=S;(5) S->next=P;(6) S->priou=P;(7
29、) S->next=P->next;(8) S->priou=P->priou;(9) P->priou->next=P->next;(10) P->priou->next=P;(11) P->next->priou=P;(12) P->next->priou=S;(13) P->priou->next=S;(14) P->next->priou=P->priou;(15) Q=P->next;(16) Q=P->priou;(17) free(P);(18) free(Q)
30、;解:a.(6) (12)b. (8) (4) (5) (13)c. (15) (1) (11) (18)d. (16) (2) (10) (18)e. (14) (9) (17)2.9 簡述以下算法的功能。(1) Status A(LinkedList L) /L是無表頭結(jié)點(diǎn)的單鏈表if(L && L->next) Q=L; L=L->next; P=L;while(P->next) P=P->next;P->next=Q; Q->next=NULL;return OK;(2) void BB(LNode *s, LNode *q) p=s
31、;while(p->next!=q) p=p->next;p->next =s;void AA(LNode *pa, LNode *pb) /pa 和 pb 分別指向單循環(huán)鏈表中的兩個(gè)結(jié)點(diǎn)BB(pa,pb);BB(pb,pa);解:(1)如果L的長度不小于2,將L的首元結(jié)點(diǎn)變成尾元 結(jié)點(diǎn)。(2) 將單循環(huán)鏈表拆成兩個(gè)單循環(huán)鏈表。2.10 指出以下算法中的錯(cuò)誤和低效之處,并將它改寫為一個(gè)既正確 又高效的算法。Status DeleteK(SqList &a,int i,int k)/本過程從順序存儲結(jié)構(gòu)的線性表 a中刪除第i個(gè)元素起的kif(i<1|k<0|
32、i+k>a.length) return INFEASIBLE;/參數(shù)不合法else for(count=1;count<k;count+)/ 刪除第一個(gè)元素for(j=a.length;j>=i+1;j-)a.elemj-i=a.elemj;a.length-;return OK;解:Status DeleteK(SqList &a,int i,int k)/從順序存儲結(jié)構(gòu)的線性表a中刪除第i個(gè)元素起的k個(gè)元素/注意 i 的編號從 0開始int j;if(i<0|i>a.length-1|k<0|k>a.length-i)returnINFE
33、ASIBLE;for(j=0;j<=k;j+)a.elemj+i=a.elemj+i+k;a.length=a.length-k;return OK;2.11 設(shè)順序表 va 中的數(shù)據(jù)元素遞增有序。試寫一算法,將 x 插入到 順序表的適當(dāng)位置上,以保持該表的有序性。解:Status InsertOrderList(SqList &va,ElemType x)/ 在非遞減的順序表 va 中插入元素 x 并使其仍成為順序表的 算法int i;if(va.length=va.listsize)return(OVERFLOW); for(i=va.length;i>0,x<v
34、a.elemi-1;i-)va.elemi=va.elemi-1;va.elemi=x;va.length+;return OK;2.12設(shè)A ai, ,am和B b, ,bn均為順序表,A和B分別為A和B 中除去最大共同前綴后的子表。假設(shè) A B空表,那么A B ;假設(shè)A二空 表,而 B 空表,或者兩者均不為空表,且 A 的首元小于 B 的首元, 那么A B ;否那么A B。試寫一個(gè)比較A,B大小的算法。解:Status CompareOrderList(SqList &A,SqList &B)int i,k,j;k=A.length>B.length?A.length
35、:B.length; for(i=0;i<k;i+)if(A.elemi>B.elemi) j=1;if(A.elemi<B.elemi) j=-1;if(A.length>k) j=1;if(B.length>k) j=-1;if(A.length=B.length) j=0;return j;2.13 試 寫一 算法 在 帶頭 結(jié) 點(diǎn) 的單 鏈 表 結(jié)構(gòu) 上 實(shí)現(xiàn)線 性 表操作 Locate(L,x);解:int LocateElem_L(LinkList &L,ElemType x)int i=0;LinkList p=L;while(p&&
36、amp;p->data!=x)p=p->next;i+;if(!p) return 0;else return i;2.14 試 寫一 算法 在 帶頭 結(jié) 點(diǎn) 的單 鏈 表 結(jié)構(gòu) 上 實(shí)現(xiàn)線 性 表操作 Length(L) 。解:/ 返回單鏈表的長度int ListLength_L(LinkList &L)int i=0;LinkList p=L;if(p) p=p-next;while(p)p=p->next;i+;return i;2.15指針ha和hb分別指向兩個(gè)單鏈表的頭結(jié)點(diǎn),并且兩 個(gè)鏈表的長度分別為m和n。試寫一算法將這兩個(gè)鏈表連接在一起, 假設(shè)指針 hc
37、 指向連接后的鏈表的頭結(jié)點(diǎn),并要求算法以盡可能短的 時(shí)間完成連接運(yùn)算。請分析你的算法的時(shí)間復(fù)雜度。解:void MergeList_L(LinkList &ha,LinkList &hb,LinkList &hc)LinkList pa,pb;pa=ha;pb=hb;while(pa->next&&pb->next)pa=pa->next;pb=pb->next;if(!pa->next)hc=hb;while(pb->next) pb=pb->next;pb->next=ha->next;elseh
38、c=ha;while(pa->next) pa=pa->next; pa->next=hb->next;2.16 指針 la 和 lb 分別指向兩個(gè)無頭結(jié)點(diǎn)單鏈表中的首元結(jié)點(diǎn) 以下算法是從表 la 中刪除自第 i 個(gè)元素起共 len 個(gè)元素后,將它們 插入到表 lb 中第 i 個(gè)元素之前。試問此算法是否正確?假設(shè)有錯(cuò),請 改正之。Status DeleteAndInsertSub(LinkedList la,LinkedList lb,int i,int j,int len)if(i<0|j<0|len<0) return INFEASIBLE;p=l
39、a; k=1;while(k<i) p=p->next; k+; q=p;while(k<=len) q=q->next;k+; s=lb; k=1;while(k<j) s=s->next; k+; s->next=p; q->next=s->next;return OK;解:&lb,intStatus DeleteAndInsertSub(LinkList &la,LinkList i,int j,int len)LinkList p,q,s,prev=NULL;int k=1;if(i<0|j<0|len&
40、lt;0) return INFEASIBLE;/ 在 la 表中查找第 i 個(gè)結(jié)點(diǎn)p=la;while(p&&k<i)prev=p;p=p->next;k+;if(!p)return INFEASIBLE;/ 在 la 表中查找第 i+len-1 個(gè)結(jié)點(diǎn)q=p; k=1;while(q&&k<len)q=p->next;k+;if(!q)return INFEASIBLE;/ 完成刪除,注意, i=1 的情況需要特殊處理 if(!prev) la=q->next;else prev->next=q->next;/ 將從
41、 la 中刪除的結(jié)點(diǎn)插入到 lb 中if(j=1)q->next=lb;lb=p;elses=lb; k=1;while(s&&k<j-1)s=s->next;k+;if(!s)return INFEASIBLE;q->next=s->next;s->next=p; / 完成插入return OK;2.17 試寫一算法,在無頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)線性表操作 Insert(L,i,b) ,并和在帶頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)相同操作的算 法進(jìn)行比較。2.18 試寫一算法, 實(shí)現(xiàn)線性表操作 Delete(L,i) ,并和在帶頭結(jié)點(diǎn)的 動(dòng)態(tài)單鏈表上實(shí)
42、現(xiàn)相同操作的算法進(jìn)行比較。2.19 線性表中的元素以值遞增有序排列,并以單鏈表作存儲結(jié) 構(gòu)。試寫一高效的算法, 刪除表中所有值大于 mink 且小于 maxk 的元 素(假設(shè)表中存在這樣的元素) ,同時(shí)釋放被刪結(jié)點(diǎn)空間,并分析你的算法的時(shí)間復(fù)雜度注意,mink和maxk是給定的兩個(gè)參變量,它們 的值可以和表中的元素相同,也可以不同) 。解:mink,ElemTypeStatus ListDelete_L(LinkList &L,ElemTypemaxk)LinkList p,q,prev=NULL;if(mink>maxk)return ERROR;p=L;prev=p;p=p-
43、>next;while(p&&p->data<maxk)if(p->data<=mink)prev=p;p=p->next;elseprev->next=p->next;q=p;p=p->next;free(q);return OK;2.20 同 2.19 題條件,試寫一高效的算法,刪除表中所有值相同的多 余元素(使得操作后的線性表中所有元素的值均不相同) ,同時(shí)釋放 被刪結(jié)點(diǎn)空間,并分析你的算法的時(shí)間復(fù)雜度。解:void ListDelete_LSameNode(LinkList &L)LinkList p,q,p
44、rev;p=L;prev=p;p=p->next;while(p)prev=p;p=p->next;if(p&&p->data=prev->data)prev->next=p->next;q=p;p=p->next;free(q);2.21 試寫一算法,實(shí)現(xiàn)順序表的就地逆置,即利用原表的存儲空間 將線性表 a1, ,an 逆置為 an , ,a1 。解:/ 順序表的逆置Status ListOppose_Sq(SqList &L)int i;ElemType x; for(i=0;i<L.length/2;i+) x=L.
45、elemi;L.elemi=L.elemL.length-1-i;L.elemL.length-1-i=x; return OK;2.22 試寫一算法,對單鏈表實(shí)現(xiàn)就地逆置。解:/ 帶頭結(jié)點(diǎn)的單鏈表的逆置Status ListOppose_L(LinkList &L)LinkList p,q;p=L;p=p->next;L->next=NULL;while(p)q=p;p=p->next;q->next=L->next;L->next=q;return OK;2.23 設(shè)線性表 A a1,a2, ,am , B b1,b2, ,bn ,試寫一個(gè)按以下
46、規(guī)那么合并A, B為線性表C的算法,即使得Cai,bi,am,bm,bm 1,g當(dāng) mn 時(shí);Ca1,b1 ,an,bn ,an 1,am當(dāng) mn 時(shí)。線性表A, B和C均以單鏈表作存儲結(jié)構(gòu),且 C表利用A表和B表中 的結(jié)點(diǎn)空間構(gòu)成。注意:單鏈表的長度值m和n均未顯式存儲。解:/將合并后的結(jié)果放在C表中,并刪除B表Status ListMerge_L(LinkList &A,LinkList &B,LinkList &C)LinkList pa,pb,qa,qb;pa=A->next;pb=B->next;C=A;while(pa&&pb)q
47、a=pa; qb=pb;pa=pa->next; pb=pb->next;qb->next=qa->next;qa->next=qb;if(!pa)qb->next=pb;pb=B;free(pb);return OK;2.24假設(shè)有兩個(gè)按元素值遞增有序排列的線性表A和B,均以單鏈表作存儲結(jié)構(gòu),請編寫算法將A表和B表歸并成一個(gè)按元素值遞減有 序即非遞增有序,允許表中含有值相同的元素排列的線性表C,并要求利用原表即A表和B表的結(jié)點(diǎn)空間構(gòu)造C表。解:/將合并逆置后的結(jié)果放在 C表中,并刪除B表Status ListMergeOppose_LLinkList &a
48、mp;A,LinkList &B,LinkList&C)LinkList pa,pb,qa,qb;pa=A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=pb; /保存pb的前驅(qū)指針pa=pa->next;pb=pb->next;A->next=NULL;C=A;while(pa&&pb) if(pa->data<pb->data)qa=pa;pa=pa->next;qa->next=A->next; / 將當(dāng)前最小結(jié)點(diǎn)插入 A 表表頭A->next=qa;elseqb=pb;pb=pb->n
49、ext;qb->next=A->next; / 將當(dāng)前最小結(jié)點(diǎn)插入 A 表表頭A->next=qb;while(pa)qa=pa;pa=pa->next;qa->next=A->next;A->next=qa;while(pb)qb=pb;pb=pb->next;qb->next=A->next;A->next=qb;pb=B;free(pb);return OK;2.25 假設(shè)以兩個(gè)元素依值遞增有序排列的線性表 A 和 B 分別表示兩 個(gè)集合(即同一表中的元素值各不相同) ,現(xiàn)要求另辟空間構(gòu)成一個(gè) 線性表C,其元素為A和B中元
50、素的交集,且表C中的元素有依值遞增有序排列。試對順序表編寫求 C 的算法解:/將A、B求交后的結(jié)果放在C表中Status ListCross_Sq(SqList &A,SqList &B,SqList &C)int i=0,j=0,k=0;while(i<A.length && j<B.length)if(A.elemi<B.elemj)i+;elseif(A.elemi>B.elemj)j+;elseListInsert_Sq(C,k,A.elemi);i+;k+;return OK;2.26要求同2.25題。試對單鏈表編寫求C
51、的算法。解:/將A、B求交后的結(jié)果放在C表中,并刪除B表Status ListCross_L(LinkList &A,LinkList &B,LinkList &C)LinkList pa,pb,qa,qb,pt;pa=A;pb=B;qa=pa; /保存pa的前驅(qū)指針 qb=pb; /保存pb的前驅(qū)指針 pa=pa->next;pb=pb->next;C=A;while(pa&&pb) if(pa->data<pb->data) pt=pa;pa=pa->next; qa->next=pa;free(pt); e
52、lseif(pa->data>pb->data) pt=pb; pb=pb->next; qb->next=pb;free(pt); elseqa=pa; pa=pa->next;while(pa)pt=pa;pa=pa->next;qa->next=pa; free(pt);while(pb)pt=pb; pb=pb->next; qb->next=pb;free(pt);pb=B; free(pb); return OK;2.27 對 2.25 題的條件作以下兩點(diǎn)修改,對順序表重新編寫求得表 C的算法。(1) 假設(shè)在同一表(A或B
53、)中可能存在值相同的元素,但要求新 生成的表C中的元素值各不相同;(2) 利用A表空間存放表C。解:(1)/ A、B求交,然后刪除相同元素,將結(jié)果放在C表中Status ListCrossDelSame_Sq(SqList &A,SqList &B,SqList &C)int i=0,j=0,k=0;while(i<A.length && j<B.length)if(A.elemi<B.elemj)i+;elseif(A.elemi>B.elemj)j+;elseif(C.length=0)ListInsert_Sq(C,k,A.elemi);k+;elseif(C.elemC.length-1!=A.elemi)ListInsert_Sq(C,k,A.elemi);k+;i+;retu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《Unit 2 Are You Wu Chen》(說課稿)-2024-2025學(xué)年陜旅版(三起)(2024)英語三年級上冊
- Unit6 Chores Lesson 3(說課稿)-2024-2025學(xué)年人教新起點(diǎn)版英語五年級上冊
- 二零二五年度私密股權(quán)比例調(diào)整與分配協(xié)議書
- 交行貸款放款合同范例
- 企業(yè)對外投資入股合同范本
- 農(nóng)村改革合同范本
- 幼兒游戲與學(xué)習(xí)能力發(fā)展考核試卷
- 公共裝飾裝修合同范本
- 公眾號投訴合同范本
- 蘭州勞務(wù)外包合同范本
- 暖氣維修常識知識培訓(xùn)課件
- 精神科患者服藥依從性健康宣教
- 設(shè)備維保的維修流程與指導(dǎo)手冊
- 急性腎小球腎炎病人護(hù)理課件
- 招標(biāo)代理服務(wù)的關(guān)鍵流程與難點(diǎn)解析
- GB/T 5465.2-2023電氣設(shè)備用圖形符號第2部分:圖形符號
- 《三國演義》中的佛教文化:以黃承兒為例
- 材料預(yù)定協(xié)議
- 《學(xué)習(xí)的本質(zhì)》讀書會(huì)活動(dòng)
- 高氨血癥護(hù)理課件
- 《石油化工電氣自動(dòng)化系統(tǒng)設(shè)計(jì)規(guī)范》
評論
0/150
提交評論