版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第1章緒論1.1簡(jiǎn)述下列術(shù)語:數(shù)據(jù),數(shù)據(jù)元素、數(shù)據(jù)對(duì)象、數(shù)據(jù)結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)、數(shù)據(jù)類型和抽象數(shù)據(jù)類型。解:數(shù)據(jù)是對(duì)客觀事物的符號(hào)表示。在計(jì)算機(jī)科學(xué)中是指所有能輸入 到計(jì)算機(jī)中并被計(jì)算機(jī)程序處理的符號(hào)的總稱。數(shù)據(jù)元素是數(shù)據(jù)的基本單位,在計(jì)算機(jī)程序中通常作為一個(gè)整體 進(jìn)行考慮和處理。數(shù)據(jù)對(duì)象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。存儲(chǔ)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)中的表示。數(shù)據(jù)類型是一個(gè)值的集合和定義在這個(gè)值集上的一組操作的總稱。抽象數(shù)據(jù)類型 是指一個(gè)數(shù)學(xué)模型以及定義在該模型上的一組操作。是對(duì)一般數(shù)據(jù)類型的擴(kuò)展。1.2試描述數(shù)據(jù)結(jié)構(gòu)和抽象數(shù)據(jù)類
2、型的概念與程序設(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ù)的存儲(chǔ)結(jié)構(gòu)和操作 的具體實(shí)現(xiàn),這樣抽象層次更高,更能為其他用戶提供良好的使用接 口。1.3設(shè)有數(shù)據(jù)結(jié)構(gòu)(D,R),其中D = d1,d2,d3,d4 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ù)對(duì)象: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元的值為eIsAsc
4、e ndin g(C)操作結(jié)果:如果復(fù)數(shù)C的兩個(gè)元素按升序排列,則返回1,否則返回0IsDesce ndin g(C)操作結(jié)果:如果復(fù)數(shù)C的兩個(gè)元素按降序排列,則返回1,否則返回0Max(C, &e)操作結(jié)果:用e返回復(fù)數(shù)C的兩個(gè)元素中值較大的一個(gè)Mi n(C, &e)操作結(jié)果:用e返回復(fù)數(shù)C的兩個(gè)元素中值較小的一個(gè)ADT ComplexADT Ratio nalNumber數(shù)據(jù)對(duì)象:D=s,m|s,m為自然數(shù),且m不為0數(shù)據(jù)關(guān)系:R=<s,m>基本操作:Ini tRatio nalNumber(&R,s,m)操作結(jié)果:構(gòu)造一個(gè)有理數(shù)R,其分子和分母分別為s
5、和mDestroyRatio nalNumber(&R)操作結(jié)果:銷毀有理數(shù)RGet(R,k, &e)操作結(jié)果:用e返回有理數(shù)R的第k兀的值Put(&R,k,e)操作結(jié)果:改變有理數(shù)R的第k兀的值為eIsAsce ndin g(R)操作結(jié)果:若有理數(shù)R的兩個(gè)元素按升序排列,則返回1,否則返回0IsDesce ndin g(R)操作結(jié)果:若有理數(shù)R的兩個(gè)兀素按降序排列,則返回1,否則返回0Max(R, &e)操作結(jié)果:用e返回有理數(shù)R的兩個(gè)兀素中值較大的一個(gè)Mi n(R, &e)操作結(jié)果:用e返回有理數(shù)R的兩個(gè)元素中值較小的一個(gè)ADT Ratio nalN
6、umber1.5試畫出與下列程序段等價(jià)的框圖(1) product=1; i=1;while(i<=n)product *= i;i+; 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ù)的返回值判斷正確與否常用于子程序的測(cè)試,便于實(shí) 現(xiàn)程序的局部控制。(3) 用整型函數(shù)進(jìn)行錯(cuò)誤處理的優(yōu)點(diǎn)是可以給出錯(cuò)誤類型,便于 迅速確定錯(cuò)誤。1.7在程序設(shè)計(jì)中,可采用下列三種方法實(shí)現(xiàn)輸出和輸入:(1) 通過seanf和printf 語句;(2) 通過函數(shù)的參數(shù)顯式傳遞;(3) 通過全局變量隱式傳遞。 試討論這三種方法的優(yōu)缺點(diǎn)。解: (1)用seanf和printf直接進(jìn)行輸入輸出的好處是形象、直觀,但缺點(diǎn)是需要對(duì)其進(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ù)。試確定下列各程序段中前置以記號(hào)勺語句的頻度:(1) i=1; k=0;while(i<=n-1) k += 10*i;i+; i=1; k=0;do k += 10*i;i+; while(i<二 n-1); i=1; k=0;while (i<=n-1) i+; k += 10*i; k=0;for(i=1; i<二n; i
9、+) 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; 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) n-1(2) n-1n(n 1)(3) n-
10、1;i(Li =1 2(4) n+(n-1)+( n-2)+.+1 =(5) 1+(1+2)+(1+2+3)+(1+2+3+.+n)=1 J i(i 1) = 1 J (i2 i) i2 1、2 i d2 i d2 i a2 i d1 n(n 1)(2 n 1)1 n(n 1) = 1 n(n 1)(2 n 3)12412(6) n_ 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二 log2 n - 21.11已知有實(shí)現(xiàn)同一功能的兩個(gè)算法,其時(shí)間復(fù)雜度分別為O2n和O(n10 ),假設(shè)現(xiàn)實(shí)計(jì)算機(jī)可連續(xù)運(yùn)算的時(shí)間為107秒(100多天),又每 秒可執(zhí)行基本操作(根據(jù)這些操作來估算算法時(shí)間復(fù)雜度)105次。試問在此條件下,這兩個(gè)算法可解問題的規(guī)模(即n值的范圍)各為 多少?哪個(gè)算法更適宜?請(qǐng)說明理由。解:2n =1012n=40n10 =1012n=16則對(duì)于同樣的循環(huán)次數(shù)n,在這個(gè)規(guī)模下,第二種算法所花費(fèi)的 代價(jià)要大得多。故在這個(gè)規(guī)模下,第一種算法更適宜1.12設(shè)有以下三個(gè)函數(shù):f n = 21n4 n2
12、1000 , g n =15n4 500n3, h n = 500n3'5 n log n請(qǐng)判斷以下斷言正確與否:(1) f(n)是 O(g(n) h(n)是 O(f(n) g(n)是 O(h(n) h(n)是 O(n3.5)(5) h(n)是 0(nlogn)解:(1)對(duì)錯(cuò)(3)錯(cuò)對(duì)(5)錯(cuò)1.13試設(shè)定若干n值,比較兩函數(shù)n2和50nlog? n的增長(zhǎng)趨勢(shì),并確 定n在什么范圍內(nèi),函數(shù)n2的值大于50nlog2 n的值。解:n2的增長(zhǎng)趨勢(shì)快。但在n較小的時(shí)候,50nlog2n的值較大。當(dāng) n>438時(shí),n2 50nlog2 n1.14判斷下列各對(duì)函數(shù)f n和g n,當(dāng)n時(shí),哪
13、個(gè)函數(shù)增長(zhǎng)更快?(1) f n =10n2 ln n! 10, g n =2n4 n 7(2) f n inn,亠5?, gn = 13n2'5(3) f (n ) = n2.1 + Jn4 +1, g(n)=(ln(n!)f + n(4) f (n )=2幘)+(2n , g(n)=nF)+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=1n(2) 、x,= xn 1 一1 / x 一1x = 1, n _07n(3) ' 2,=2n _1 n _1i 二n(4)
14、 、 2i1= n2 n_1i A1.16試寫一算法,自大至小依次輸出順序讀入的三個(gè)整數(shù) 的值解:int max3(i nt x,i nt y,i nt z)if(x>y)if(x>z) return x;else retur n z;elseif(y>z) return y;else retur n z;1.17已知k階斐波那契序列的定義為f0=° , f1=0 ,,fk_2=0 , f k J = 1 ;fn "nJ 仁fn " =k,k 1,試編寫求k階斐波那契序列的第m項(xiàng)值的函數(shù)算法,值調(diào)用的形式在函數(shù)參數(shù)表中出現(xiàn)。X, Y禾口 Zk和m
15、均以解: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 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)行田徑對(duì)抗賽,各院校的單項(xiàng)成績(jī)均
16、已存入計(jì)算機(jī),并構(gòu)成一張表,表中每一行的形式為項(xiàng)目名 稱性別校名成績(jī)得分編寫算法,處理上述表格,以統(tǒng)計(jì)各院校的男、女總分和團(tuán)體總分,并輸出解:typedef e nu mA,B,C,D,E SchoolName;typedef enu mFemale,Male SexType;typedef structchar eve nt3; /項(xiàng)目SexType sex;SchoolName school;int score; Comp onent;typedef structint MaleSum;/ 男團(tuán)總分int FemaleSum; / 女團(tuán)總分int TotalSum;/ 團(tuán)體總分 Sum;S
17、um SumScore(SchoolName sn, Comp onent a,i nt n)Sum temp;temp.MaleSum=O;temp.FemaleSum=O;temp.TotalSum=O;int i;for(i=0;i <n ;i+)if(ai.school=s n)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的
18、值并存入數(shù)組 a0.arrsize-1 的第i-1個(gè)分量中(i=1,2,n)。假設(shè)計(jì)算機(jī)中允許的整數(shù)最大值為maxi nt,則當(dāng)n> arrsize 或?qū)δ硞€(gè)k1乞k乞n,使k!«2k maxi nt時(shí),應(yīng)按出錯(cuò)處理。注意選擇你認(rèn)為較好的出錯(cuò)處理方法。解:#i nclude<iostream.h>#i nclude<stdlib.h>#define MAXINT 65535#defi ne ArrSize 100int fun (i nt i);int mai n()int i,k;int aArrSize;cout«"Enter k
19、:"cin> >k;if(k>ArrSize-1) exit(O);for(i=0;i<二k;i+)if(i=0) ai=1;elseif(2*i*ai-1>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)式的值PnX Aaixi的值Pn xg,并確定i=0算法中每一語句的執(zhí)行次數(shù)和整個(gè)算法的時(shí)間復(fù)雜度。注意選擇你認(rèn)為較好的輸
20、入和輸出方法。本題的輸入為ai i =0,1,n , x0和n,輸出為 Pn X。解:#i nclude<iostream.h>#i nclude<stdlib.h>#defi ne N 10double polyno mail(i nt a,i nt i,double x,i nt n);int mai n()double x;int n,i;int aN;cout«"輸入變量的值x:"cin> >x;cout«"輸入多項(xiàng)式的階次n:"cin>>n;if(n>N-1) exit(
21、0);coutvv"輸入多項(xiàng)式的系數(shù)a0-an:"for(i=0;i< 二n ;i+) cin> >ai;valueiscout<<"Thepolyno mail"<<po lyno mail(a ,n,x,n)«en dl;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)。
22、第2章線性表2.1描述以下三個(gè)概念的區(qū)別:頭指針,頭結(jié)點(diǎn),首元結(jié)點(diǎn)(第一個(gè) 元素結(jié)點(diǎn))。解:頭指針是指向鏈表中第一個(gè)結(jié)點(diǎn)的指針。首元結(jié)點(diǎn)是指鏈表中存儲(chǔ)第一個(gè)數(shù)據(jù)元素的結(jié)點(diǎn)。頭結(jié)點(diǎn)是在首元結(jié)點(diǎn)之前附設(shè)的一個(gè) 結(jié)點(diǎn),該結(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)元素,其指針域指向首元結(jié)點(diǎn),其作用主要 是為了方便對(duì)鏈表的操作。它可以對(duì)空表、非空表以及首元結(jié)點(diǎn)的操 作進(jìn)行統(tǒng)一處理。2.2填空題。解:(1)在順序表中插入或刪除一個(gè)元素,需要平均移動(dòng) 表中一 半元素,具體移動(dòng)的元素個(gè)數(shù)與 元素在表中的位置有關(guān)。(2) 順序表中邏輯上相鄰的元素的物理位置 必定緊鄰。單鏈表中 邏輯上相鄰的元素的物理位置 不一定緊鄰。(3) 在單鏈表中,除
23、了首元結(jié)點(diǎn)外,任一結(jié)點(diǎn)的存儲(chǔ)位置由其前 驅(qū)結(jié)點(diǎn)的鏈域的值指示(4) 在單鏈表中設(shè)置頭結(jié)點(diǎn)的作用是插入和刪除首元結(jié)點(diǎn)時(shí)不 用進(jìn)行特殊處理。2.3在什么情況下用順序表比鏈表好?解:當(dāng)線性表的數(shù)據(jù)元素在物理位置上是連續(xù)存儲(chǔ)的時(shí)候,用順序表比用鏈表好,其特點(diǎn)是可以進(jìn)行隨機(jī)存取。2.4對(duì)以下單鏈表分別執(zhí)行下列各程序段,并畫出結(jié)果示意圖。LL5 TIP2cuT PLcuLtlr-6hJJ-42.5畫出執(zhí)行下列各行語句后各指針及鏈表的示意圖L=(Li nkList)malloc(sizeof(LNode);P=L;for(i=1;i<=4;i+)P->n ext=(L in kList)mall
24、oc(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);for(i=1;i<=3;i+) Del_Li nkList(L,i);解:寸iTp7 TI PI p2.6已知L是無表頭結(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)的語句序列是。d. 在表尾插入S結(jié)點(diǎn)的語句序列是
25、 。(1) P-> next二S;(2) P->n ext=P->n ext- >n ext; P-> next二S-> next;(4) S-> next二P->n ext;(5) S-> next二L; S-> next二NULL; Q=P;(8) while(P-> next!二Q) P=P-> next;(9) while(P-> next!二NULL) P=P->n ext;(10) P=Q;(11) P=L;(12) L=S;(13) L=P;解:a.(1)b. (7) (11) (8) (4) (
26、1)c. (5) (12)d. (9) (1) (6)2.7已知L是帶表頭結(jié)點(diǎn)的非空單鏈表,且P結(jié)點(diǎn)既不是首元結(jié)點(diǎn),也不是尾元結(jié)點(diǎn),試從下列提供的答案中選擇合適的語句序列。a. 刪除P結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)的語句序列是Ob. 刪除P結(jié)點(diǎn)的直接前驅(qū)結(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->n ext=P->n ext- >n ext; P=P-> next-> next;(5) while(P!二NULL) P=P
27、->n ext;(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-> next;(9) while(P-> next- >n ext!=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) (
28、12) (8)(14)c. (10) (12)(14)d. (12) (11)(14)e. (9) (11)(14)2.8已知P結(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. 刪除P結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)的語句序列是d. 刪除P結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)的語句序列是e. 刪除P結(jié)點(diǎn)的語句序列是。(1) P->n ext=P->n ext- >n ext;(2) P->priou二P->priou->priou; P-> next二S; P->p
29、riou=S;(5) S-> next二P; S->priou=P;(7) S-> next二P->n ext;(8) S->priou=P->priou;(9) P->priou->n ext=P->n ext;(10) P->priou-> next二P;(11) P-> next->priou二P;(12) P-> next->priou二S;(13) P->priou-> next二S;(14) P->n ext->priou=P->priou;(15) Q=P-&g
30、t; next;(16) Q=P->priou;(17) free(P);(18) free(Q);解:a.(6) (12)b. (8)(5) (13)c. (15) (1) (11) (18)d. (16)(10) (18)e. (14) (9) (17)2.9簡(jiǎn)述以下算法的功能。(1) Status A(Li nkedList 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
31、;return OK;(2) void BB(LNode *s, LNode *q) P=s;while(p->n ext!二q) p=p->n ext;p->n ext =s;void AA(LNode *pa, LNode *pb) /pa和pb分別指向單循環(huán)鏈表中的兩個(gè)結(jié)點(diǎn)BB(pa,pb);BB(pb,pa);解:(1)如果L的長(zhǎng)度不小于2,將L的首元結(jié)點(diǎn)變成尾元 結(jié)點(diǎn)。(2)將單循環(huán)鏈表拆成兩個(gè)單循環(huán)鏈表。2.10指出以下算法中的錯(cuò)誤和低效之處,并將它改寫為一個(gè)既正確 又高效的算法。Status DeleteK(SqList & a,i nt i,i nt
32、k)/本過程從順序存儲(chǔ)結(jié)構(gòu)的線性表 a中刪除第i個(gè)元素起的kif(iv1|k<0|i+k>a.le ngth) return INFEASIBLE;/參數(shù)不合法else for(co un t=1;co un t<k;co un t+)/刪除第一個(gè)元素for(j=a.le ngth;j>=i+1;j-)a.elemj-i=a.elemj;a.le ngth-;return OK;解:Status DeleteK(SqList & a,i nt i,i nt k)/從順序存儲(chǔ)結(jié)構(gòu)的線性表a中刪除第i個(gè)元素起的k個(gè)元素/注意i的編號(hào)從0開始int j;if(i<
33、;0|i>a.le ngth-1|k<0|k>a.le ngth-i)returnINFEASIBLE;for(j=0;j<=k;j+)a.elemj+i=a.elemj+i+k;aen gth=aen gth-k;return OK;2.11設(shè)順序表va中的數(shù)據(jù)元素遞增有序。試寫一算法,將 x插入到 順序表的適當(dāng)位置上,以保持該表的有序性。解:Status In sertOrderList(SqList & va,ElemType x)/在非遞減的順序表va中插入元素x并使其仍成為順序表的 算法int i;if(va.le ngth=va.listsize)r
34、eturn(OVERFLOW);for(i=va.le ngth;i>0,x<va.elemi-1;i-)va.elemi=va.elemi-1;va.elemi=x;vaen gth+;return OK;2.12設(shè)AWa1, ,am和B f , ,6均為順序表,A和B分別為A和B 中除去最大共同前綴后的子表。若 AB =空表,則A = B ;若A =空 表,而B =空表,或者兩者均不為空表,且 A的首元小于B的首元, 則A : B ;否則A B。試寫一個(gè)比較A,B大小的算法。解:Status CompareOrderList(SqList &A,SqList &
35、B)int i,k,j;k=A.le ngth>B.le ngth?A.le ngthBle ngth;for(i=0;i<k;i+)if(A.elemi>B.elemi) j=1;if(A.elemi<B.elemi) j=-1;if(A.le ngth>k) j=1;if(B.le ngth>k) j=-1;if(A.le ngth=B.le ngth) j=0;return j;2.13試寫一算法在帶頭結(jié)點(diǎn)的單鏈表結(jié)構(gòu)上實(shí)現(xiàn)線性表操作Locate(L,x);解:int LocateElem_L(L in kList & L,ElemType x
36、)int i=0;Lin kList p=L;while(p&&p->data!=x)p=p- >n ext;i+;if(!p) return 0;else return i;2.14試寫一算法在帶頭結(jié)點(diǎn)的單鏈表結(jié)構(gòu)上實(shí)現(xiàn)線性表操作Length(L)。解:/返回單鏈表的長(zhǎng)度int ListLe ngth_L(Li nkList &L)int i=0;Lin kList p=L;if(p) p=p-n ext;while(p)p=p- >n ext;i+;return i;2.15已知指針ha和hb分別指向兩個(gè)單鏈表的頭結(jié)點(diǎn),并且已知兩 個(gè)鏈表的長(zhǎng)度分別
37、為m和n。試寫一算法將這兩個(gè)鏈表連接在一起, 假設(shè)指針hc指向連接后的鏈表的頭結(jié)點(diǎn),并要求算法以盡可能短的 時(shí)間完成連接運(yùn)算。請(qǐng)分析你的算法的時(shí)間復(fù)雜度。解:void MergeList_L(Li nkList & ha,Li nkList & hb,Li nkList & he) Lin kList pa,pb;pa二ha;pb=hb;while(pa->n ext&&pb->n ext)pa=pa->n ext;pb=pb->n ext;if(!pa->n ext)hc=hb;while(pb->n ext) pb
38、=pb->n ext;pb->n ext二ha->n ext;elsehc=ha;while(pa->n ext) pa=pa->n ext;pa->n ext=hb->n ext; 2.16已知指針la和lb分別指向兩個(gè)無頭結(jié)點(diǎn)單鏈表中的首元結(jié)點(diǎn) 下列算法是從表la中刪除自第i個(gè)元素起共len個(gè)元素后,將它們 插入到表lb中第i個(gè)元素之前。試問此算法是否正確?若有錯(cuò),請(qǐng) 改正之。Status DeleteAndlnsertSub(LinkedList la,LinkedList lb,int i,i nt j,i nt len)if(i<O|j
39、<O|le n< 0) retur n INFEASIBLE;p=la; k=1;while(k<i) p=p->n ext;k+;q=p;while(k<=le n) q二q->n ext;k+; s=lb; k=1;while(k<j) s=s->n ext;k+;s->n ext=p; q->n ext=s->n ext;return OK;解:& b,i ntStatus DeleteA ndl nsertSub(Li nkList& la,Li nkListi,i nt j,i nt len)Lin k
40、List p,q,s,prev二NULL;int k=1;if(i<O|j<O|le n< 0) retur n INFEASIBLE;/在la表中查找第i個(gè)結(jié)點(diǎn)p=la;while(p&&k<i)prev=p;p=p- >n ext;k+;if(!p)return INFEASIBLE;/在la表中查找第i+len-1個(gè)結(jié)點(diǎn)q=p; k=1;while(q&&k<le n)q=p- >n ext;k+;if(!q)return INFEASIBLE;/完成刪除,注意,i=1的情況需要特殊處理if(!prev) la=q
41、->n ext;else prev ->n ext=q->n ext;/將從la中刪除的結(jié)點(diǎn)插入到lb中if(j=1)q->n ext=lb;lb=p;elses=lb; k=1;while(s&&k<j-1)s=s- >n ext;k+;if(!s)return INFEASIBLE;q->n ext=s->n ext;s-> next二p; /完成插入return OK;2.17試寫一算法,在無頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)線性表操作In sert(L,i,b),并和在帶頭結(jié)點(diǎn)的動(dòng)態(tài)單鏈表上實(shí)現(xiàn)相同操作的算 法進(jìn)行比較。2.1
42、8試寫一算法,實(shí)現(xiàn)線性表操作Delete(L,i),并和在帶頭結(jié)點(diǎn)的 動(dòng)態(tài)單鏈表上實(shí)現(xiàn)相同操作的算法進(jìn)行比較。2.19已知線性表中的元素以值遞增有序排列,并以單鏈表作存儲(chǔ)結(jié) 構(gòu)。試寫一高效的算法,刪除表中所有值大于 mink且小于maxk的元 素(若表中存在這樣的元素),同時(shí)釋放被刪結(jié)點(diǎn)空間,并分析你的算法的時(shí)間復(fù)雜度(注意,mink和maxk是給定的兩個(gè)參變量,它們 的值可以和表中的元素相同,也可以不同)。解:mi nk,ElemTypeStatusListDelete_L(L in kList& L,ElemTypemaxk)Lin kList p,q,prev二NULL;if(m
43、i nk>maxk)return ERROR;p=L;prev=p;p=p->n ext;while(p&&p->data<maxk)if(p->data<=min k)prev=p;p=p->n ext;elseprev->n ext=p- >n ext;q=p;p=p->n ext;free(q);return OK;2.20同2.19題條件,試寫一高效的算法,刪除表中所有值相同的多 余元素(使得操作后的線性表中所有元素的值均不相同),同時(shí)釋放 被刪結(jié)點(diǎn)空間,并分析你的算法的時(shí)間復(fù)雜度。解:void ListDel
44、ete_LSameNode(Li nkList &L)Lin kList p,q,prev;P=L;prev=p;p=p->n ext;while(p)prev=p;p=p- >n ext;if(p&&p->data=prev->data)prev->n ext=p- >n ext;q=p;p=p->n ext;2.21試寫一算法,實(shí)現(xiàn)順序表的就地逆置,即利用原表的存儲(chǔ)空間 將線性表印,an逆置為an,,3。解:/順序表的逆置Status ListOppose_Sq(SqList &L)int i;ElemType x;
45、for(i=0;i<L.le ngth/2;i+)x=L.elemi;L.elemi=L.elemL.le ngth-1-i;L.elemL .len gth-1-i=x;return OK;2.22試寫一算法,對(duì)單鏈表實(shí)現(xiàn)就地逆置。解:/帶頭結(jié)點(diǎn)的單鏈表的逆置Status ListOppose_L(L in kList &L)Lin kList p,q;P=L;p=p->n ext;L-> next二NULL;while(p)q=p;p=p- >n ext;q->n ext=L->n ext;L->n ext=q;return OK;2.23
46、設(shè)線性表A二a,a2,,am , B二d®,,d ,試寫一個(gè)按下列規(guī) 則合并A, B為線性表C的算法,即使得C =歸1力,,am,bm,bm1,bn 當(dāng) m n 時(shí);C 二山,,an,bn,an 1,,am當(dāng) m n時(shí)。線性表A,B和C均以單鏈表作存儲(chǔ)結(jié)構(gòu),且 C表利用A表和B表中的結(jié)點(diǎn)空間構(gòu)成。注意:?jiǎn)捂湵淼拈L(zhǎng)度值m和n均未顯式存儲(chǔ)。解:/將合并后的結(jié)果放在C表中,并刪除B表Lin kList pa,pb,qa,qb;pa=A- >n ext;pb=B->n ext;C=A;while(pa&&pb)qa=pa;qb=pb;pa=pa->next;
47、 pb=pb->next;qb->n ext=qa->n ext;qa->n ext=qb;if(!pa)qb->n ext=pb;pb=B;free(pb);return OK;2.24假設(shè)有兩個(gè)按元素值遞增有序排列的線性表A和B,均以單鏈表作存儲(chǔ)結(jié)構(gòu),請(qǐng)編寫算法將A表和B表歸并成一個(gè)按元素值遞減有 序(即非遞增有序,允許表中含有值相同的元素)排列的線性表C,并要求利用原表(即A表和B表)的結(jié)點(diǎn)空間構(gòu)造C表。解:/將合并逆置后的結(jié)果放在 C表中,并刪除B表Status ListMergeOppose_L(LinkList&A,LinkList &
48、B,LinkList&C)Lin kList pa,pb,qa,qb;pa二A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=pb; /保存pb的前驅(qū)指針pa=pa->n ext;pb=pb->n ext;A->n ext二NULL;C=A;while(pa&&pb)if(pa->data<pb->data)qa=pa;pa=pa->n ext;qa->next二A->next; /將當(dāng)前最小結(jié)點(diǎn)插入A表表頭A->n ext=qa;elseqb=pb;pb=pb->n ext;qb->next二
49、A->next; /將當(dāng)前最小結(jié)點(diǎn)插入A表表頭A->n ext二qb;while(pa)qa=pa;pa=pa->n ext;qa->n ext=A- >n ext;A->n ext=qa;while(pb)qb=pb;pb=pb->n ext;qb->n ext=A- >n ext;A->n ext=qb;pb=B;free(pb);return OK; 2.25假設(shè)以兩個(gè)元素依值遞增有序排列的線性表 A和B分別表示兩 個(gè)集合(即同一表中的元素值各不相同),現(xiàn)要求另辟空間構(gòu)成一個(gè) 線性表C,其元素為A和B中元素的交集,且表C中的元素
50、有依值遞增有序排列。試對(duì)順序表編寫求 C的算法解:/將A、B求交后的結(jié)果放在C表中Status ListCross_Sq(SqList &A,SqList & B,SqList &C)int i=O,j=O,k=O;while(i<A.le ngth && jvB.le ngth)if(A.elemi<B.elemj)i+;elseif(A.elemi>B.elemj)j+;elseListI nsert_Sq(C,k,A.elemi);i+;k+;return OK;2.26要求同2.25題。試對(duì)單鏈表編寫求C的算法。解:/將A、B求
51、交后的結(jié)果放在C表中,并刪除B表Status ListCross_L(Li nkList &A,L in kList & B,Li nkList &C)Lin kList pa,pb,qa,qb,pt;pa二A;pb=B;qa=pa; /保存pa的前驅(qū)指針qb=pb; /保存pb的前驅(qū)指針pa=pa->n ext;pb=pb->n ext;C=A;while(pa&&pb)if(pa->data<pb->data) pt=pa;pa=pa->n ext;qa->n ext二pa;free(pt);elseif(p
52、a->data>pb->data) pt=pb;pb=pb->n ext;qb->n ext=pb;free(pt);elseqa=pa;pa二pa->n ext;while(pa)pt=pa;pa=pa->n ext; qa->n ext=pa; free(pt);while(pb)pt=pb;pb=pb->n ext;qb->n ext=pb;free(pt); pb=B;free(pb);return OK;2.27對(duì)2.25題的條件作以下兩點(diǎn)修改,對(duì)順序表重新編寫求得表C的算法。(1) 假設(shè)在同一表(A或B)中可能存在值相同的
53、元素,但要求新 生成的表C中的元素值各不相同;(2) 利用A表空間存放表Co解:(1)/ A、B求交,然后刪除相同元素,將結(jié)果放在C表中Status ListCrossDelSame_Sq(SqList &A,SqList & B,SqList &C)int i=O,j=O,k=O;while(i<A.le ngth && jvB.le ngth)if(A.elemi<B.elemj)i+;elseif(A.elemi>B.elemj)j+;elseif(C.le ngth=O)ListI nsert_Sq(C,k,A.elemi);k+;elseif(C.elemC.le ngth-1!=A.elemi)Listl nsert_Sq(C,k,A.elemi);k+;i+;ret
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四前期物業(yè)服務(wù)協(xié)議及社區(qū)文化活動(dòng)服務(wù)合同3篇
- 2024年高端紅酒代理銷售合同協(xié)議
- 2025年度市場(chǎng)調(diào)研服務(wù)外包合同4篇
- 二零二四年個(gè)性化嬰兒護(hù)理服務(wù)與月嫂雇傭協(xié)議3篇
- 2025年茶店加盟管理合同范本簡(jiǎn)易4篇
- 專業(yè)蝦苗供應(yīng)協(xié)議模板2024年適用版A版
- 2025年度航空器材產(chǎn)品定制采購(gòu)服務(wù)協(xié)議4篇
- 2025年度城市地下綜合管廊建設(shè)施工合同9篇
- 2025年茶樓茶葉采購(gòu)與營(yíng)銷推廣合同范本4篇
- 2024門店承包與區(qū)域市場(chǎng)拓展合同范本3篇
- 《庖丁解牛》獲獎(jiǎng)?wù)n件(省級(jí)公開課一等獎(jiǎng))-完美版PPT
- 化工園區(qū)危險(xiǎn)品運(yùn)輸車輛停車場(chǎng)建設(shè)標(biāo)準(zhǔn)
- 6月大學(xué)英語四級(jí)真題(CET4)及答案解析
- 氣排球競(jìng)賽規(guī)則
- 電梯維修保養(yǎng)報(bào)價(jià)書模板
- 危險(xiǎn)化學(xué)品目錄2023
- FZ/T 81024-2022機(jī)織披風(fēng)
- GB/T 33141-2016鎂鋰合金鑄錠
- JJF 1069-2012 法定計(jì)量檢定機(jī)構(gòu)考核規(guī)范(培訓(xùn)講稿)
- 綜合管廊工程施工技術(shù)概述課件
- 公積金提取單身聲明
評(píng)論
0/150
提交評(píng)論