1.嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)題集與參考答案_第1頁
1.嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)題集與參考答案_第2頁
1.嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)題集與參考答案_第3頁
1.嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)題集與參考答案_第4頁
1.嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)題集與參考答案_第5頁
免費預(yù)覽已結(jié)束,剩余46頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)(C語言版)習(xí)題集以及參考答案第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ī)科學(xué)中是指所有能輸入到計算機(jī)中并被計算機(jī)程序處理的符 號的總稱。數(shù)據(jù)元素是數(shù)據(jù)的基本單位,在計算機(jī)程序中通常作為一個整體進(jìn)行考慮和處理。數(shù)據(jù)對象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個子集。數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。存儲結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)在計算機(jī)中的表示。數(shù)據(jù)類型是一個值的集合和定義在這個值集上的一組操作的總稱。抽象數(shù)據(jù)類型是指一個數(shù)學(xué)模型以及定義在該模型上的一組操作。是對一般數(shù)據(jù)

2、類型的擴(kuò)展。1.2 試描述數(shù)據(jù)結(jié)構(gòu)和抽象數(shù)據(jù)類型的概念與程序設(shè)計語言中數(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ù)據(jù)的邏輯結(jié)構(gòu)和操作說明,不考慮數(shù)據(jù)的存儲結(jié)構(gòu)和操作的具體實 現(xiàn),這樣抽象層次更高,更能為其他用戶提供良好的使用接口。1.3 設(shè)有數(shù)據(jù)結(jié)構(gòu)(D,R),其中D d1,d2,d3,d4 , R r,r d

3、1,d2 , d2,d3 , d3,d4試按圖論中圖的畫法慣例畫出其邏輯結(jié)構(gòu)圖解:1.4 試仿照三元組的抽象數(shù)據(jù)類型分別寫出抽象數(shù)據(jù)類型復(fù)數(shù)和有理數(shù)的定義(有理數(shù)是其分子、分母均 為自然數(shù)且分母不為零的分?jǐn)?shù))。解:ADT Complex數(shù)據(jù)對象:D=r,i|r,i為實數(shù)數(shù)據(jù)關(guān)系:R=<r,i>基本操作:InitComplex(&C,re,im)操作結(jié)果:構(gòu)造一個復(fù)數(shù)C,其實部和虛部分別為re和imDestroyCmoplex(&C)操作結(jié)果:銷毀復(fù)數(shù) CGet(C,k,&e)操作結(jié)果:用e返回復(fù)數(shù)C的第k元的值Put(&C,k,e)操作結(jié)果:改變復(fù)數(shù)

4、 C的第k元的值為eIsAscending(C)操作結(jié)果:如果復(fù)數(shù)C 的兩個元素按升序排列,則返回1 ,否則返回0IsDescending(C)操作結(jié)果:如果復(fù)數(shù)C 的兩個元素按降序排列,則返回1 ,否則返回0Max(C,&e)操作結(jié)果:用e 返回復(fù)數(shù)C 的兩個元素中值較大的一個Min(C,&e)操作結(jié)果:用e 返回復(fù)數(shù)C 的兩個元素中值較小的一個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)造一個

5、有理數(shù)R,其分子和分母分別為s和mDestroyRationalNumber(&R)操作結(jié)果:銷毀有理數(shù) RGet(R,k,&e)操作結(jié)果:用 e 返回有理數(shù) R 的第 k 元的值Put(&R,k,e)操作結(jié)果:改變有理數(shù) R 的第 k 元的值為 eIsAscending(R)操作結(jié)果:若有理數(shù)R 的兩個元素按升序排列,則返回1 ,否則返回0IsDescending(R)操作結(jié)果:若有理數(shù)R 的兩個元素按降序排列,則返回1 ,否則返回0Max(R,&e)操作結(jié)果:用e 返回有理數(shù)R 的兩個元素中值較大的一個Min(R,&e)操作結(jié)果:用e 返回有理數(shù)R

6、的兩個元素中值較小的一個ADT RationalNumber1.5 試畫出與下列程序段等價的框圖。(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è)計中,常用下列三種不同的出錯處理方式:(1) 用 exit 語句終止執(zhí)行并報告錯誤;(2) 以函數(shù)的返回

7、值區(qū)別正確返回或錯誤返回;(3) 設(shè)置一個整型變量的函數(shù)參數(shù)以區(qū)別正確返回或某種錯誤返回。試討論這三種方法各自的優(yōu)缺點。解: (1)exit 常用于異常錯誤處理,它可以強(qiáng)行中斷程序的執(zhí)行,返回操作系統(tǒng)。(2) 以函數(shù)的返回值判斷正確與否常用于子程序的測試,便于實現(xiàn)程序的局部控制。(3) 用整型函數(shù)進(jìn)行錯誤處理的優(yōu)點是可以給出錯誤類型,便于迅速確定錯誤。1.7 在程序設(shè)計中,可采用下列三種方法實現(xiàn)輸出和輸入:(1) 通過 scanf 和 printf 語句;(2) 通過函數(shù)的參數(shù)顯式傳遞;(3) 通過全局變量隱式傳遞。試討論這三種方法的優(yōu)缺點。解: (1) 用 scanf 和 printf 直接

8、進(jìn)行輸入輸出的好處是形象、 直觀,但缺點是需要對其進(jìn)行格式控制,較為煩瑣,如果出現(xiàn)錯誤,則會引起整個系統(tǒng)的崩潰。(2) 通過函數(shù)的參數(shù)傳遞進(jìn)行輸入輸出,便于實現(xiàn)信息的隱蔽,減少出錯的可能。(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&

9、lt;=n-1) i+; k += 10*i;(4) k=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;. 專業(yè) .專注 .(6) i=1; j=0;while(i+j<=n) if(i>j) j+;else i+;(7) x=n; y=0;/ n是不小于1的常數(shù).專業(yè).專注.while(x>=(y+1)*(y+1) y+;(8) x=91; y=100;while

10、(y>0) if(x>100) x -= 10; y-; else x+;解:(1) n-1(2) n-1n-1(4) n+(n-1)+(n-2)+1 =n(n 1)(5) 1+(1+2)+(1+2+3)+(1+2+3+n)=i(i 1)ni(ii 11)(i2i)12n(n1)(2n1)1n(n 41)工n(n 121)(2n 3)(6) nJn 向下取整(8) 11001.9假設(shè)n為2的乘嘉,并且n>2,試求下列算法的時(S復(fù)雜度及變量count的值(以n的函數(shù)形式表示)int Time(int n) count = 0;x=2;while(x<n/2) x *=

11、2;count+;return count;解:o(log 2 n)count= log 2 n 2,假設(shè)現(xiàn)實計算機(jī)可連續(xù)1.11 已知有實現(xiàn)同一功能的兩個算法,其時間復(fù)雜度分別為7 5運算的時間為10秒(100多天),又每秒可執(zhí)行基本操作(根據(jù)這些操作來估算算法時間復(fù)雜度)10次。試問在此條件下,這兩個算法可解問題的規(guī)模 (即n值的范圍)各為多少?哪個算法更適宜?請說明理由。解:2 n 1012n=401012n 10n=16則對于同樣的循環(huán)次數(shù)n,在這個規(guī)模下,第二種算法所花費的代價要大得多。故在這個規(guī)模下,第一種算法更適宜。1.12 設(shè)有以下三個函數(shù):f n 21n4 n2 1000,

12、g n 15n4 500n3, h n500n3.5nlog n請判斷以下斷言正確與否: f(n)是 O(g(n)(2) h(n)是 O(f(n)(3) g(n)是 O(h(n)(4) h(n) 是 O(n3.5)(5) h(n)是 O(nlogn)解:(1)對(2)錯(3)錯(4)對(5)錯221.13試設(shè)定若干n值,比較兩函數(shù)n和50nlog2 n的增長趨勢,并確定 n在什么范圍內(nèi),函數(shù) n的值大于50niog2 n的值。解:n2的增長趨勢快。但在 n較小的時候50n log 2 n的值較大。2當(dāng) n>438 時,n 50n log 2 n1.14判斷下列各對函數(shù)f n和g n,當(dāng)n

13、時,哪個函數(shù)增長更快?3(1) f n10nln n! 10 , g n2n n 7f nln n!5 2 , gn 13n2.5 f n n2.1Jn41 , g n2ln n! non 22, g n快Rn)解:(1)g(n)快(2)g(n)快(3)f(n)1.15試用數(shù)學(xué)歸納法證明:n i2 n n 12n 1 /6 n 0i 1(2) xi xn 1 1 / x 1x 1,n 0i0n(3) 2i 12n 1n 1i1n(4) 2i 1 n 2n 1i11.16 試寫一算法,自大至小依次輸出順序讀入的三個整數(shù)X, Y 和 Z 的值解:int max3(int x,int y,int z

14、) if(x>y) if(x>z) return x; else return z;elseif(y>z) return y;else return z;1.17 已知 k 階斐波那契序列的定義為f00,fl0,,fk 20,fk i 1;fn fn 1fn 2fn k , n k,k 1,試編寫求k階斐波那契序列的第m項值的函數(shù)算法,k和m均以值調(diào)用的形式在函數(shù)參數(shù)表中出現(xiàn)。解: k>0 為階數(shù), n 為數(shù)列的第n 項int Fibonacci(int k,int n)if(k<1) exit(OVERFLOW);int *p,x;p=new intk+1;if

15、(!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五個高等院校進(jìn)行田徑對抗賽,各院校的單項成績均已存入計算機(jī),并構(gòu)成一 張表,表中每一行的形式為項目名稱 1性別校名成績得分編寫算法,處理上述表格,以統(tǒng)計各院校的男、女總分和團(tuán)體總分,并輸出。解:typedef enumA,B,C,D,E SchoolNam

16、e;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.TotalSum=0;int

17、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 試編寫算法,計算i!*2i的值并存入數(shù)組a0.arrsize-1 的第i-1個分量中(i=1,2,n)。假設(shè)計算機(jī)中允許的整數(shù)最大值為maxint ,則當(dāng)n>arrsize或?qū)δ硞€k 1 k n ,使k!?2kmaxint時,應(yīng)按出錯處理

18、。注意選擇你認(rèn)為較好的出錯處理方法。解:#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>MAXINT) exit(0);else a

19、i=2*i*ai-1;for(i=0;i<=k;i+)if(ai>MAXINT) exit(0);else cout<<ai<<" "return 0;n1.20 試編寫算法求一元多項式的值Pn x ai xi 的值Pn x0 ,并確定算法中每一語句的執(zhí)行次數(shù)i0和整個算法的時間復(fù)雜度。 注意選擇你認(rèn)為較好的輸入和輸出方法。 本題的輸入為ai i 0,1, n , x0和 n ,輸出為Pn x0 。解:#include<iostream.h>#include<stdlib.h>#define N 10double

20、polynomail(int a,int i,double x,int n);int main()double x;int n,i;int aN;cout<<" 輸入變量的值 x:"cin>>x;cout<<" 輸入多項式的階次n:"cin>>n;if(n>N-1) exit(0);cout<<"輸入多項式的系數(shù) a0-an:"for(i=0;i<=n;i+) cin>>ai;cout<<"The polynomail value

21、 is "<<polynomail(a,n,x,n)<<endl;return 0;double polynomail(int a,int i,double x,int n)if(i>0) return an-i+polynomail(a,i-1,x,n)*x;else return an;本算法的時間復(fù)雜度為 o(n)。第2章線性表2.1 描述以下三個概念的區(qū)別:頭指針,頭結(jié)點,首元結(jié)點(第一個元素結(jié)點)。解:頭指針是指向鏈表中第一個結(jié)點的指針。首元結(jié)點是指鏈表中存儲第一個數(shù)據(jù)元素的結(jié)點。頭結(jié)點是在首元結(jié)點之前附設(shè)的一個結(jié)點,該結(jié)點不存儲數(shù)據(jù)元素,其指

22、針域指向首元結(jié)點,其作用主要是為了方便對鏈表的操作。它可以對空表、非空表以及首元結(jié)點的操作進(jìn)行統(tǒng)一處理。2.2 填空題。解:(1)在順序表中插入或刪除一個元素,需要平均移動表中一半元素,具體移動的元素個數(shù)與 2gg(2) 順序表中邏輯上相鄰的元素的物理位置必定緊鄰。單鏈表中邏輯上相鄰的元素的物理位置不一定緊鄰。(3) 在單鏈表中,除了首元結(jié)點外,任一結(jié)點的存儲位置由其前驅(qū)結(jié)點的鏈域的值指示。(4) 在單鏈表中設(shè)置頭結(jié)點的作用是插入和刪除首元結(jié)點時不用進(jìn)行特殊處理。2.3 在什么情況下用順序表比鏈表好?解:當(dāng)線性表的數(shù)據(jù)元素在物理位置上是連續(xù)存儲的時候,用順序表比用鏈表好,其特點是可以進(jìn)行隨機(jī)存

23、取。2.4 對以下單鏈表分別執(zhí)行下列各程序段,并畫出結(jié)果示意圖。.專業(yè).專注.7 T QL-.專業(yè).專注.2.5 畫出執(zhí)行下列各行語句后各指針及鏈表的示意圖。L=(LinkList)malloc(sizeof(LNode);P=L;for(i=1;i<=4;i+)P->next=(LinkList)malloc(sizeof(LNode);P=P->next; P->data=i*2-1;P->next=NULL;for(i=4;i>=1;i-) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i+) Del_LinkList

24、(L,i);解:P76t p437 TIP2.6 已知L是無表頭結(jié)點的單鏈表,且P結(jié)點既不是首元結(jié)點,也不是尾元結(jié)點,試從下列提供的答案中選擇合適的語句序列。a. 在 P 結(jié)點后插入S 結(jié)點的語句序列是 。b. 在 P 結(jié)點前插入S 結(jié)點的語句序列是 。c. 在表首插入S 結(jié)點的語句序列是。d. 在表尾插入S 結(jié)點的語句序列是。(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

25、=NULL;(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. (4) (1)b. (7) (11) (8) (4) (1)c. (5) (12)d. (9) (1) (6)2.7已知L是帶表頭結(jié)點的非空單鏈表,且P結(jié)點既不是首元結(jié)點,也不是尾元結(jié)點,試從下列提供的答案中選擇合適的語句序列。a. 刪除P 結(jié)點的直接后繼結(jié)點的語句序列是 。b. 刪除P 結(jié)點的直接前驅(qū)結(jié)點的語句序列是 。c.

26、刪除 P 結(jié)點的語句序列是。d. 刪除首元結(jié)點的語句序列是。e. 刪除尾元結(jié)點的語句序列是 。(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->next!=Q) P=P->

27、;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é)點是某雙向鏈表的中間結(jié)點,試從下列提供的答案中選擇合適的語句序列a. 在 P 結(jié)點后插入S 結(jié)點的語句序列是 。b. 在

28、 P 結(jié)點前插入S 結(jié)點的語句序列是 。c. 刪除P 結(jié)點的直接后繼結(jié)點的語句序列是 。d. 刪除P 結(jié)點的直接前驅(qū)結(jié)點的語句序列是 。e. 刪除 P 結(jié)點的語句序列是 。(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) S->next=P->next;(8) S->priou=P->priou;(9) P->priou-&

29、gt;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);解: a. (7) (3) (6) (12)b. (8) (4) (5) (13)c. (15) (1) (11) (18)d. (16

30、) (2) (10) (18)e. (14) (9) (17)2.9 簡述以下算法的功能。(1) Status A(LinkedList L) /L是無表頭結(jié)點的單鏈表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;while(p->next!=q) p=p->next;p->next =s;void AA(LN

31、ode *pa, LNode *pb) /pa 和 pb 分別指向單循環(huán)鏈表中的兩個結(jié)點BB(pa,pb);BB(pb,pa);解: (1) 如果 L 的長度不小于 2 ,將 L 的首元結(jié)點變成尾元結(jié)點。(3) 將單循環(huán)鏈表拆成兩個單循環(huán)鏈表。2.10 指出以下算法中的錯誤和低效之處,并將它改寫為一個既正確又高效的算法。Status DeleteK(SqList &a,int i,int k)/ 本過程從順序存儲結(jié)構(gòu)的線性表a 中刪除第 i 個元素起的 k 個元素if(i<1|k<0|i+k>a.length) return INFEASIBLE;/參數(shù)不合法else

32、 for(count=1;count<k;count+)/ 刪除第一個元素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 個元素起的 k 個元素/ 注意 i 的編號從 0 開始int j;if(i<0|i>a.length-1|k<0|k>a.length-i) return INFEASIBLE;for(j=0;j<=k;j+)a.elem

33、j+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<va.elemi-1;i-)va.elemi=va.elemi-1;va.

34、elemi=x;va.length+; return OK; 2.12 設(shè)Aai,am和B 6, h 均為順序表,A和B分別為A和B中除去最大共同前綴后的子表。若 A B 空表,則 A B ;若 A = 空表,而 B 空表,或者兩者均不為空表,且 A 的首元小于B 的首元,則 A B ;否則 A B 。試寫一個比較A , B 大小的算法。解:Status CompareOrderList(SqList &A,SqList &B)int i,k,j;k=A.length>B.length?A.length:B.length;for(i=0;i<k;i+)if(A.el

35、emi>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é)點的單鏈表結(jié)構(gòu)上實現(xiàn)線性表操作Locate(L,x);解:int LocateElem_L(LinkList &L,ElemType x)int i=0;LinkList p=L;while(p&&p->data!=x)p=p->next;i+;if(!p) return 0;e

36、lse return i;2.14 試寫一算法在帶頭結(jié)點的單鏈表結(jié)構(gòu)上實現(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分別指向兩個單鏈表的頭結(jié)點,并且已知兩個鏈表的長度分別為m和n。試寫一算法將這兩個鏈表連接在一起, 假設(shè)指針 hc 指向連接后的鏈表的頭結(jié)點, 并要求算法以盡可能短的時間完成 連接運算。請分析你的算法的時間復(fù)雜度。解:void Merge

37、List_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;elsehc=ha;while(pa->next) pa=pa->next;pa->next=hb->nex

38、t;2.16 已知指針 la 和 lb 分別指向兩個無頭結(jié)點單鏈表中的首元結(jié)點。下列算法是從表 la 中刪除自第i 個元素起共 len 個元素后, 將它們插入到表lb 中第 i 個元素之前。 試問此算法是否正確?若有錯, 請改正之。Status DeleteAndInsertSub(LinkedList la,LinkedList lb,int i,int j,int len) if(i<0|j<0|len<0) return INFEASIBLE;p=la; k=1;while(k<i) p=p->next; k+; q=p;while(k<=len)q=

39、q->next;k+;s=lb; k=1;while(k<j)s=s->next;k+;s->next=p;q->next=s->next;return OK;解:Status DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int len) LinkList p,q,s,prev=NULL;int k=1;if(i<0|j<0|len<0) return INFEASIBLE;/ 在 la 表中查找第i 個結(jié)點p=la;while(p&&k&

40、lt;i)prev=p;p=p->next;k+;if(!p)return INFEASIBLE;/ 在 la 表中查找第i+len-1 個結(jié)點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;/ 將從 la 中刪除的結(jié)點插入到 lb 中if(j=1)q->next=lb;lb=p;elses=lb; k=1;while(s&

41、amp;&k<j-1)s=s->next; k+;if(!s)return INFEASIBLE;q->next=s->next; s->next=p; / 完成插入 return OK;,并和在帶頭結(jié)點的動態(tài)單2.17 試寫一算法,在無頭結(jié)點的動態(tài)單鏈表上實現(xiàn)線性表操作 Insert(L,i,b) 鏈表上實現(xiàn)相同操作的算法進(jìn)行比較。2.18 試寫一算法,實現(xiàn)線性表操作 Delete(L,i) ,并和在帶頭結(jié)點的動態(tài)單鏈表上實現(xiàn)相同操作的算法進(jìn)行比較。2.19 已知線性表中的元素以值遞增有序排列,并以單鏈表作存儲結(jié)構(gòu)。試寫一高效的算法,刪除表中所有值大于

42、mink 且小于 maxk 的元素 (若表中存在這樣的元素) , 同時釋放被刪結(jié)點空間, 并分析你的算法的時 間復(fù)雜度(注意,mink和maxk是給定的兩個參變量,它們的值可以和表中的元素相同,也可以不同) 。解:Status ListDelete_L(LinkList &L,ElemType mink,ElemType maxk) LinkList p,q,prev=NULL;if(mink>maxk)return ERROR;p=L;prev=p;p=p->next;while(p&&p->data<maxk)if(p->data<

43、;=mink)prev=p;p=p->next; elseprev->next=p->next;q=p;p=p->next;free(q); return OK;2.20 同 2.19 題條件,試寫一高效的算法,刪除表中所有值相同的多余元素(使得操作后的線性表中所有 元素的值均不相同) ,同時釋放被刪結(jié)點空間,并分析你的算法的時間復(fù)雜度。解:void ListDelete_LSameNode(LinkList &L)LinkList p,q,prev;p=L;prev=p;p=p->next;while(p)prev=p;p=p->next;if(p

44、&&p->data=prev->data)prev->next=p->next;q=p;p=p->next;free(q);. 專業(yè) .專注 .2.21 試寫一算法,實現(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.elemi;L.elemi=L.elemL.length-1-i;L.elemL.length-1-i=x;return

45、 OK;2.22 試寫一算法,對單鏈表實現(xiàn)就地逆置。解:/ 帶頭結(jié)點的單鏈表的逆置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è)線性表 Aa1 ,a2, am , Bb1 ,b2 ,bnA, B 為線性表C 的算法,即使得a1, b1 ,am,bm,bm 1 ,bnm n 時;a1, b1 ,an ,bn ,an 1 , ,am

46、m n 時。線性表A, B和C均以單鏈表作存儲結(jié)構(gòu),且 C表利用A表和B表中的結(jié)點空間構(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)qa=pa;qb=pb;pa=pa->next;pb=pb->next;qb->next=qa->next;qa-

47、>next=qb;if(!pa)qb->next=pb;pb=B;free(pb);return OK;A 表和 BC,并要求2.24 假設(shè)有兩個按元素值遞增有序排列的線性表A和B,均以單鏈表作存儲結(jié)構(gòu),請編寫算法將表歸并成一個按元素值遞減有序(即非遞增有序,允許表中含有值相同的元素)排列的線性表利用原表(即A表和B表)的結(jié)點空間構(gòu)造 C表。解:/ 將合并逆置后的結(jié)果放在C 表中,并刪除B 表Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C) LinkList pa,pb,qa,qb;p

48、a=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é)點插入 A 表表頭A->next=qa;elseqb=pb;pb=pb->next;qb->next=A->next; / 將當(dāng)前最小結(jié)點插入 A 表表頭 A->next=

49、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è)以兩個元素依值遞增有序排列的線性表A 和 B 分別表示兩個集合(即同一表中的元素值各不相同),現(xiàn)要求另辟空間構(gòu)成一個線性表C,其元素為A和B中元素的交集,且表 C中的元素有依值遞增有序排列。試對順序表編寫求C 的算法。解:/將A、B求交

50、后的結(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+; else if(A.elemi>B.elemj) j+; else ListInsert_Sq(C,k,A.elemi); i+; k+; return OK; 2.26 要求同 2.25 題。試對單鏈表編寫求C 的算法。解:/將A、B求交后的結(jié)果放在 C表中,并刪除B表S

51、tatus 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);elseif(pa->data>pb->data

52、)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 題的條件作以下兩點修改,對順序表重新編寫求得表C 的算法。C 中的元素值各不相同;(1)假設(shè)在同一表(A或B)中可能存在值相同的元素,但要求新生成的表(2) 利用 A 表

53、空間存放表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.e

54、lemi)ListInsert_Sq(C,k,A.elemi);k+;i+;return OK;(2)/ A、B求交,然后刪除相同元素,將結(jié)果放在A表中Status ListCrossDelSame_Sq(SqList &A,SqList &B)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(k=0)A.elemk=A.elemi;k+;elseif(A.elemk!=A.el

55、emi)A.elemk=A.elemi;k+;i+;A.length=k;return OK;2.28 對 2.25 題的條件作以下兩點修改,對單鏈表重新編寫求得表C 的算法。(1) 假設(shè)在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;(2)利用原表(A表或B表)中的結(jié)點構(gòu)成表 C,并木!放A表中的無用結(jié)點空間。解:(2)/ A 、 B 求交,結(jié)果放在 C 表中,并刪除相同元素Status ListCrossDelSame_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

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論