2023年人武學(xué)院數(shù)據(jù)結(jié)構(gòu)課后習(xí)題答案及期末綜合練習(xí)_第1頁
2023年人武學(xué)院數(shù)據(jù)結(jié)構(gòu)課后習(xí)題答案及期末綜合練習(xí)_第2頁
2023年人武學(xué)院數(shù)據(jù)結(jié)構(gòu)課后習(xí)題答案及期末綜合練習(xí)_第3頁
2023年人武學(xué)院數(shù)據(jù)結(jié)構(gòu)課后習(xí)題答案及期末綜合練習(xí)_第4頁
2023年人武學(xué)院數(shù)據(jù)結(jié)構(gòu)課后習(xí)題答案及期末綜合練習(xí)_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十章內(nèi)部排序一、基本知識題答案1.排序:將一組雜亂無序的數(shù)據(jù)按一定的規(guī)律順次排列起來叫做排序。內(nèi)部排序:數(shù)據(jù)存儲在內(nèi)存中,并在內(nèi)存中加以解決的排序方法叫內(nèi)部排序。堆:堆是一個完全二叉樹,它的每個結(jié)點相應(yīng)于原始數(shù)據(jù)的一個元素,且規(guī)定假如一個結(jié)點有兒子結(jié)點,此結(jié)點數(shù)據(jù)必須大于或等于其兒子結(jié)點數(shù)據(jù)。穩(wěn)定排序:一種排序方法,若排序后具有相同關(guān)鍵字的記錄仍維持本來的相對順序,則稱之為穩(wěn)定的,否則稱為不穩(wěn)定的。2.回答下面問題(1)5000個無序的數(shù)據(jù),希望用最快速度挑選出其中前10個最大的元素,在快速排序、堆排序、歸并排序和基數(shù)排序中采用哪種方法最佳?為什么?(2)大多數(shù)排序算法都有哪兩個基本操作?答:(1)采用堆排序最佳。由于以上幾種算法中,快速排序、歸并排序和基數(shù)排序都是在排序結(jié)束后才干擬定數(shù)據(jù)元素的所有順序,而無法知道排序過程中部分元素的有序性。堆排序則每次輸出一個最大(或最?。┑脑?,然后對堆進(jìn)行調(diào)整,保證堆頂?shù)脑乜偸怯嘞略刂凶畲螅ɑ蜃钚?的。根據(jù)題意,只要選取前10個最大的元素,故采用堆排序方法是合適的。(2)兩個基本操作:比較兩個關(guān)鍵字的大小、改變指向記錄的指針或移動記錄自身。3.3.已知序列{17,25,55,43,3,32,78,67,91},請給出采用冒泡排序法對該序列作遞增排序時每一趟的結(jié)果。答:采用冒泡排序法排序時的各趟結(jié)果如下:初始:17,25,55,43,3,32,78,67,91第1趟:17,25,43,3,32,55,67,78,91第2趟:17,25,3,32,43,55,67,78,91第3趟:17,3,25,32,43,55,67,78,91第4趟:3,17,25,32,43,55,67,78,91第5趟:3,17,25,32,43,55,67,78,91第5趟無元素互換,排序結(jié)束。4.已知序列{491,77,572,16,996,101,863,258,689,325},請分別給出采用快速排序、堆排序和基數(shù)排序法對該序列作遞增排序時每一趟的結(jié)果。答:采用快速排序法排序時的各趟結(jié)果如下:初始:491,77,572,16,996,101,863,258,689,325第1趟:[325,77,258,16,101]491[863,996,689,572]第2趟:[101,77,258,16]325,491[863,996,689,572]第3趟:[16,77]101[258]325,491[863,996,689,572]第4趟:16[77]101[258]325,491[863,996,689,572]第5趟:16,77,101[258]325,491[863,996,689,572]第6趟:16,77,101,258,325,491[863,996,689,572]第7趟:16,77,101,258,325,491[572,689]863[996]第8趟:16,77,101,258,325,491,572[689]863[996]第9趟:16,77,101,258,325,491,572,689,863[996]第10趟:16,77,101,258,325,491,572,689,863,996采用堆排序法排序時各趟的結(jié)果如下圖所示:(a)初始堆(b)建堆(c)互換996和77,輸出996(d)篩選調(diào)整采用基數(shù)排序法排序時各趟的結(jié)果如下:初始:491,77,572,16,996,101,863,258,689,325第1趟(按個位排序):491,101,572,863,352,16,996,77,258,689第2趟(按十位排序):101,16,352,258,863,572,77,689,491,996第3趟(按百位排序):16,77,101,258,352,491,572,689,863,9965.已知序列{86,94,138,62,41,54,18,32},請給出采用插入排序法對該序列作遞增排序時,每一趟的結(jié)果。答:采用插入排序法排序時各趟的結(jié)果如下:初始:(86),94,138,62,41,54,18,32第1趟:(86,94),138,62,41,54,18,32第2趟:(86,94,138),62,41,54,18,32第3趟:(62,86,94,138),41,54,18,32第4趟:(41,62,86,94,138),54,18,32第5趟:(41,54,62,86,94,138),18,32第6趟:(18,41,54,62,86,94,138),32第7趟:(18,32,41,54,62,86,94,138)6.已知序列{27,35,11,9,18,30,3,23,35,20},請給出采用歸并排序法對該序列作遞增排序時的每一趟的結(jié)果。答:采用歸并排序法排序時各趟的結(jié)果如下:初始:27,35,11,9,18,30,3,23,35,20第1趟:[27,35][9,11][18,30][3,23][20,35]第2趟:[9,11,27,35][3,18,23,30][20,35]第3趟:[9,11,27,35][3,18,20,23,30,35]第4趟:[3,9,11,18,20,23,27,30,35,35]二、算法設(shè)計題答案1.二、算法設(shè)計題1.一個線性表中的元素為所有為正或者負(fù)整數(shù),試設(shè)計一算法,在盡也許少的時間內(nèi)重排該表,將正、負(fù)整數(shù)分開,使線性表中所有負(fù)整數(shù)在正整數(shù)前面。解:本題的算法思想是:設(shè)立兩個變量分別指向表的首尾,它們分別向中間移動,指向表首的?假如碰到正整數(shù),指向表尾的假如碰到負(fù)整數(shù)則互相互換,然后繼續(xù)移動直至兩者相遇。實現(xiàn)本?題功能的算法如下:voidpart(intarray[],intn){?inti,j;?i=1; j=n;while(i<j) {while(i<j&&array[i]<0) ??i++;? while(i<j&&array[j]>=0)?? j--; ?if(i<j) {array[0]=array[i]; ??array[i]=array[j];???array[j]=array[0];? }?}}2.設(shè)計一個用單鏈表作存儲結(jié)構(gòu)的直接插入排序算法。解:實現(xiàn)本題功能的算法如下:voidinsertsort(node*head){?node*p,*q,*pre;?pre=head;?p=head->next;/*p指向待插入的元素*/?while(p!=NULL)?{??q=head; ?if(p->key<q->key)/*插到表首*/{pre->next=p->next;? p->next=head;???head=p;? }? else??{??while(q->next!=p&&q->next->key<p->key) ??q=q->next; ?if(q->next==p) ?{ ??pre=p;p=p->next; }???else? ?{pre->next=p->next;? ?p->next=q->next; ? q->next=p;? ??p=pre->next;???}??}?}}3.試設(shè)計一個算法實現(xiàn)雙向冒泡排序。(雙向冒泡排序就是在排序的過程中交替改變掃描方向。)解:實現(xiàn)本題功能的算法如下:voiddbubblesort(sqlistr,intn){ inti,j,flag; flag=1; i=1;?while(flag!=0)?{? flag=0; for(j=i;j<n-i;j++){ ?if(r[j]>r[j+1]) ?{ ? ?flag=1;?? r[0]=r[j]; ?? r[j]=r[j+1];?? r[j+1]=r[0];?? }??}??for(j=n-i;j>i;j--){ ? if(r[j]<r[j-1])?? {flag=1;?? ?r[0]=r[j];????r[j]=r[j-1]; ?r[j-1]=r[0];? ?} }?? i++;?}}4.設(shè)一個一維數(shù)組A[n]中存儲了n個互不相同的整數(shù),且這些整數(shù)的值都在0到n-1之間,即A中存儲了從0到n-1這n個整數(shù)。試編寫一算法將A排序,結(jié)果存放在數(shù)組B[n]中,規(guī)定算法的時間復(fù)雜性為O(n)。解:實現(xiàn)本題功能的算法如下:voidsort(intA[n],intB[n]){?inti; for(i=0;i<n;i++) ?B[A[i]]=A[i];}第九章一、基礎(chǔ)知識題1.(1)查找:查找又稱為查詢或檢索,是在一批記錄中依照某個域的指定域值,找出相應(yīng)的記錄的操作。(2)樹型查找:將原始數(shù)據(jù)表達(dá)成二叉排序樹,樹的每個結(jié)點相應(yīng)一個記錄,運用此二叉排序樹進(jìn)行類似于二分查找思想的數(shù)據(jù)查找,這種查找方法稱為樹型查找。(3)平衡因子:二叉樹中每一結(jié)點的左子樹高度減右子樹高度為該結(jié)點的平衡因子。(4)散列函數(shù):根據(jù)關(guān)鍵字求存儲地址的函數(shù)稱為散列函數(shù)。(5)兩個不同的關(guān)鍵字,其散列函數(shù)值相同,因而被映射到同一個表位置上的現(xiàn)象稱為沖突。2.設(shè)有序表為{a,b,c,d,e,f,g},請分別畫出對給定值f,g和h進(jìn)行拆半查找的過程。答:查找f的過程如下:查找成功,找到k=f值查找g的過程如下:查找成功,找到k=g值查找h的過程如下:試述順序查找法、二分查找法和分塊查找法對被查找表中元素的規(guī)定,每種查找法對長度為n的表的等概率查找長度是多少答:順序查找法:表中元素可以任意存放。查找成功的平均查找長度為(n+1)/2。二分查找法:表中元素必須以關(guān)鍵字的值遞增或遞減地存放且只能以順序表存放。查找成功的平均查找長度為log2(n+1)-1。分塊查找法:表中每塊內(nèi)的元素可以任意存放,但塊與塊之間必須按關(guān)鍵字的大小遞增或遞減地存放,即前一塊內(nèi)所有元素的關(guān)鍵字不能大(或小)于后一塊內(nèi)任意一個元素的關(guān)鍵字。若用順序查找擬定所在塊,平均查找長度為1/2(n/s+s)+1;若用二分查找擬定所在塊,平均查找長度為log2(n/s+1)+s/2。4.設(shè)散列表長m=14,哈希函數(shù)為H(k)=kmod11,表中一共有8個元素{15,27,50,73,49,61,37,60},試畫出采用二次探測法解決沖突的散列表。答:采用二次探測法解決沖突的散列表如下:5.線性表的關(guān)鍵字集合為{113,12,180,138,92,67,94,134,252,6,70,323,60},共有13個元素,已知散列函數(shù)為:H(k)=kmod13,采用鏈接表解決沖突,試設(shè)計這種鏈表結(jié)構(gòu)。答:由題意,可得:H(113)=113%13=9H(12)=12%13=12H(180)=180%13=11H(138)=138%13=8H(92)=92%13=1H(67)=67%13=2H(94)=94%13=3H(134)=134%13=4H(252)=252%13=5H(6)=6%13=6H(70)=70%13=5H(323)=323%13=11H(60)=60%13=8鏈接表法的散列表如下圖所示:6.設(shè)關(guān)鍵字集合為{27,49,79,5,37,1,56,65,83},散列函數(shù)為:H(k)=kmod7,散列表長度m=10,起始地址為0,分別用線性探測和鏈接表法來解決沖突。試畫出相應(yīng)的散列表。答:線性探測法的散列表如下圖所示:鏈接表法的散列表如下圖所示:二、算法設(shè)計題1.從小到大排列的,試寫出對此鏈表的查找算法,并說明是否可以采用折半查找。解:實現(xiàn)本題功能的算法如下,假如查找成功,則返回指向關(guān)鍵字為x的結(jié)點的指針,否則返回NULL。node*sqsearch(node*head,intx){node*p=head;?while(p!=NULL)? if(x>p->key) ??p=p->link;elseif(x==p->key)? ?returnp;else{p=NULL;returnp;??}}雖然鏈表中的結(jié)點是按遞增順序排列的,但是其存儲結(jié)構(gòu)為單鏈表,查找結(jié)點時只能從頭指針開始逐步進(jìn)行搜索,所以不能用折半查找。2.假如線性表中各結(jié)點查找概率不等,則可以使用下面的策略提高順序表的查找效率:假如找到指定的結(jié)點,則將該結(jié)點和其前趨(若存在)結(jié)點互換,使得經(jīng)常被查找的結(jié)點盡量位于表的前端。試對線性表的順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu)寫出實現(xiàn)上述策略的順序查找算法(注意查找時必須從表頭開始向后掃描)。解:采用順序存儲結(jié)構(gòu)的算法如下,設(shè)記錄存儲在線性表的1~n單元中。假如查找成功,返回關(guān)鍵字為k的記錄在線性表中的位置,假如失敗則返回0。intseqsearch(sqlistr,intn,intk){ inti,j;?i=1;?while((r[i].key?。絢)&&(i<=n)) i++;?if(i<=n){ r[0]=r[i]; r[i]=r[i-1];r[i-1]=r[i];??i--; return(i); }?else ?return(0);}采用鏈?zhǔn)酱鎯Y(jié)構(gòu)的算法如下。假如查找成功,則返回指向關(guān)鍵字為k的結(jié)點的指針,否則返回NULL。node*seqsearch(node*head,intk){?if(head->key==k)return(head);?else{??node*p,*q;intx;p=head; ?q=head->link;? while(q!=NULL&&q->key!=k)??{???p=q;? ?q=q->link; } if(q!=NULL){ ?x=p->key;? ?p->key=q->key; ? q->key=x; ?q=p; ?} return(q);?}}3.試設(shè)計一個在用開放地址法解決沖突的散列表上刪除一個指定結(jié)點的算法。解:本題的算法思想是:一方面計算要刪除的關(guān)鍵字為k的記錄所在的位置,將其置為空(即刪除),然后運用線性探測法查找是否有與k發(fā)生沖突而存儲到下一地址的記錄,假如有則將記錄移到本來k所在的位置,直至表中沒有與k沖突的記錄為止。實現(xiàn)本題功能的算法如下:voiddelete(sqlistr,intn,intk){inth,h0,h1;?h=k%n;?while(r[h].key!=k)? h=(h+1)%n;r[h]=NULL;?h0=h; h1=(h+1)%n;?while(h1!=h)?{while(r[h1].key%n!=h)? h1=(h1+1)%n; r[h0]=r[h1]; r[h1]=NULL; h0=h1; h1=(h1+1)%n;?}}4.設(shè)給定的散列表存儲空間為H[1~m],每個單元可存放一個記錄,H[i](1≤i≤m)的初始值為零,選取散列函數(shù)為H(R.key),其中key為記錄R的關(guān)鍵字,解決沖突方法為線性探測法,編寫一個函數(shù)將某記錄R填入到散列表H中。解:本題的算法思想:先計算地址H(R.key),假如沒有沖突,則直接填入;否則運用線性探測法求出下一地址,直到找到一個為零的地址,然后填入。實現(xiàn)本題功能的函數(shù)如下:voidinsert(recordH,intm,recordR){ inti;?i=H(R.key);?if(H[i]==NULL)? H[i]=R;else { while(H[i]!=NULL) {?? i=(i+1)%(m+1); }??H[i]=R; }}第七章一、基本知識題1.圖的邏輯結(jié)構(gòu)特點是什么?什么是無向圖和有向圖?什么是子圖?什么是網(wǎng)絡(luò)?答:圖是比樹更為復(fù)雜的一種非線性數(shù)據(jù)結(jié)構(gòu),在圖結(jié)構(gòu)中,每個結(jié)點都可以和其它任何結(jié)點相連接。無向圖:對于一個圖G,若邊集合E(G)為無向邊的集合,則稱該圖為無向圖。有向圖:對于一個圖G,若邊集合E(G)為有向邊的集合,則稱該圖為有向圖。子圖:設(shè)有兩個圖G=(V,E)和G’=(V’,E’),若V(G’)是V(G)的子集,且E(G’)是E(G)的子集,則稱G’是G的子圖(Subgraph)。網(wǎng)絡(luò):有些圖,相應(yīng)每條邊有一相應(yīng)的數(shù)值,這個數(shù)值叫做該邊的權(quán)。邊上帶權(quán)的圖稱為帶權(quán)圖,也稱為網(wǎng)絡(luò)。2.什么是頂點的度?什么是途徑?什么是連通圖和非連通圖?什么是非連通圖的連通分量?答:頂點的度:圖中與每個頂點相連的邊數(shù),叫該頂點的度。在一個圖中,若從某頂點Vp出發(fā),沿一些邊通過頂點V1,V2,…,Vm到達(dá),Vq,則稱頂點序列(Vp,V1,V2,…,Vm,Vq)為從Vp到Vq的途徑。在無向圖中,假如從頂點Vi到頂點Vj之間有途徑,則稱這兩個頂點是連通的。假如圖中任意一對頂點都是連通的,則稱此圖是連通圖。非連通圖的連通分量:非連通圖的每一個連通的部分叫連通分量。3.給出圖6.25所示的無向圖G的鄰接矩陣和鄰接表兩種存儲結(jié)構(gòu)。答:圖G所相應(yīng)的鄰接矩陣如下:圖G所相應(yīng)的鄰接表如下:圖254.假設(shè)圖的頂點是A、B……請根據(jù)下面的鄰接矩陣畫出相應(yīng)的無向圖或有向圖。答:(a)所相應(yīng)的無向圖如下圖(a)所示,(b)所相應(yīng)的有向圖如下圖(b)所示:5.5.分別給出圖6.26所示G圖的深度優(yōu)先搜索和廣度優(yōu)先搜索得到的頂點訪問序列。圖26答:深度優(yōu)先搜索得到的頂點訪問序列:0、1、3、7、8、4、9、5、6、2;?廣度優(yōu)先搜索得到的頂點訪問序列:0、1、2、3、4、5、6、7、8、9。6.應(yīng)用prim算法求圖6.27所示帶權(quán)連通圖的最小生成樹。答:該圖的最小生成樹如下:????? ? ? ? 圖27?7.寫出圖6.28所示有向圖的拓樸排序序列答:該有向圖的拓樸排序序列為:3、1、4、5、2、6。二、算法設(shè)計題 ? ? ? 圖28二、算法設(shè)計題答案1.如圖6.29所示圖G,試給出其相應(yīng)的鄰接表,并寫出深度優(yōu)先算法。解:該圖相應(yīng)的鄰接表如下:深度優(yōu)先算法:voiddfsgraph(adjlistadj,intn)/*深度優(yōu)先遍歷整個圖*/{ inti; for(i=1;i<=n;i++) ?visited[i]=0; for(i=1;i<=n;i++)??if(!visited[i])?? dfs(adj,i);}voiddfs(adjlistadj,intv)/*以v為出發(fā)點,對圖進(jìn)行dfs遍歷*/{structedgenode*p;visited[v]=1;printf("%d",v);p=adj[v]→link;while(p!=NULL){if(visited[p→adjvex]==0)?? dfs(adjlist,p→adjvex);??p=p→next;?}}2.如圖6.29所示圖G,試給出其相應(yīng)的鄰接矩陣,并寫出廣度優(yōu)先算法。解:該圖相應(yīng)的鄰接矩陣如下:廣度優(yōu)先算法:voidbfsgraph(intadjarray[n][n],intn)/*廣度優(yōu)先遍歷整個圖*/{?inti;?for(i=0;i<n;i++)??visited[i]=0;?for(i=0;i<n;i++) 圖29? if(!visited[i]) bfs(adjarray,i);}voidbfs(intadjarray[][],intv)/*以v為出發(fā)點,對圖進(jìn)行bfs遍歷*/{ inti,j; queueq;?printf("%d",v);?visited[v]=1;?enqueue(&q,v); while(!queueemty(&q))?{ ?i=dequeue(&q);for(j=0;j<n;j++)? if(adjarray[i][j]==1&&!visited[j]) ? {??? printf("%d",j);?? ?visited[j]=1;????enqueue(&q,j);? }?}}3.編寫一個函數(shù)通過與用戶交互建立一個有向圖的鄰接表。解:實現(xiàn)本題功能的算法如下:voidcreategraph(adjlistg){?inte,i,s,d,n;structedgenode*p; printf("請輸入結(jié)點數(shù)(n)和邊數(shù)(e):\n"); scanf("%d,%d",&n,&e); for(i=1;i<=n;i++){printf("\n請輸入第%d個頂點信息:",i);scanf("%c",&g[i].data);g[i].link=NULL;?} for(i=1;i<=e;i++)?{printf("\n請輸入第%d條邊起點序號,終點序號:",i);??scanf("%d,%d",&s,&d);? p=(structedgenode*)malloc(sizeof(edgenode));? p→adjvex=d; p→next=g[s].link;? g[s].link=p;?}}4.編寫一個無向圖的鄰接矩陣轉(zhuǎn)換成鄰接表的算法。解:本題的算法思想是:逐個掃描鄰接矩陣的各個元素,如第i行第j列的元素為1,則相應(yīng)的鄰接表的第i個單鏈表上增長一個j結(jié)點。實現(xiàn)本題功能的算法如下:voidtransform(intadjarray[n][n],adjlistadj){?inti,j;?edgenode*p; for(i=0;i<n;i++) {??adj[i].dat(yī)a=i;adj[i].link=NULL;}for(i=0;i<n;i++) for(j=0;j<n;j++) ?{if(adjarray[i][j]==1)???{p=(edgenode*)malloc(sizeof(edgenode));? p→adjvex=j;? ?p→next=adj[i].link; ? adj[i].link=p;?? } }}5.已知一個有n個頂點的有向圖的鄰接表,設(shè)計算法分別實現(xiàn)1)求出圖中每個頂點的出度。2)求出圖中每個頂點的入度。3)求出圖中出度最大的一個頂點,輸出其頂點序號。4)計算圖中出度為0的頂點個數(shù)。解:(1)本題的算法思想是:計算出鄰接表中第i個單鏈表的結(jié)點數(shù),即為i頂點的出度。求頂點的出度數(shù)的算法如下:intoutdegree(adjlistadj,intv){intdegree=0; edgenode*p; p=adj[v].link;?while(p!=NULL)?{degree++;p=p->next;?}returndegree;}voidprintout(adjlistadj,intn){?inti,degree;?printf("Theoutdegreesare:\n"); for(i=0;i<n;i++)?{?degree=outdegree(adj,i); ?printf("(%d,%d)",i,degree); }}(2)本題的算法思想是:計算出整個鄰接表中所具有的結(jié)點為i的結(jié)點數(shù),這就是i頂點的入度。求頂點的入度數(shù)的算法:intindegree(adjlistadj,intn,intv){ inti,j,degree;?edgenode*p; for(i=0;i<n;i++)?{ ?p=adj[i].link; ?while(p!=NULL){ ? if(p->adjvex==v) ?degree++;? ?p=p->next;? } }?returndegree;}voidprintin(adjlistadj,intn){ inti,degree; printf("Theindegreesare:\n"); for(i=0;i<n;i++) {?degree=indegree(adj,n,i); printf("(%d,%d)",i,degree); }}(3)求最大出度的算法:voidmaxoutdegree(adjlistadj,intn){ intmaxdegree=0,maxv=0,degree,i;?for(i=0;i<n;i++)?{??degree=outdegree(adj,i);if(degree>maxdegree) {???maxdegree=degree; ? maxv=i; ?} } printf("maxoutdegree=%d,maxvertex=%d",maxdegree,maxv);}(4)求出度數(shù)為0的頂點數(shù)的算法:intoutzero(adjlistadj,intn){ intnum=0,i; for(i=0;i<n;i++) { ?if(outdegree(adj,i)==0)???num++;?} returnnum;}第六章一、基礎(chǔ)知識題1.就如圖5.21所示的樹回答下面問題:1)哪個是根結(jié)點?2)哪些是葉子結(jié)點?3)哪個是E的父結(jié)點?4)哪些是E的子孫結(jié)點?5)哪些是E的兄弟結(jié)點?哪些是C的兄弟結(jié)點?6)結(jié)點B和結(jié)點I的層數(shù)分別是多少?7)樹的深度是多少?8)以結(jié)點G為根的子樹的深度是多少?9)樹的度是多少?答:1)A是根結(jié)點2)D、H、I、J、F、G是葉子結(jié)點3)B是E的父結(jié)點4)H、I、J是E的子孫結(jié)點5)D是E的兄弟結(jié)點,B是C的兄弟結(jié)點6)B的層數(shù)是2,I的層數(shù)是47)樹的深度是48)以結(jié)點G為根的子樹的深度是19)樹的度是32.分別畫出含3個結(jié)點的樹與二叉樹的所有不同形態(tài)。答:3個結(jié)點的樹: 3個結(jié)點的二叉樹:3.高度為h的完全二叉樹至少有多少個結(jié)點?最多有多少個結(jié)點?答:高度為h的完全二叉樹至少有個結(jié)點,最多有個結(jié)點。4.采用順序存儲方法和鏈?zhǔn)酱鎯Ψ椒ǚ謩e畫出圖5.22所示二叉樹的存儲結(jié)構(gòu)。答:該二叉樹的順序存儲:該二叉樹的鏈?zhǔn)酱鎯?5.分別寫出圖5.22所示二叉樹的前序、中序和后序遍歷序列。圖22答:先序遍歷序列:1、2、4、7、3、5、8、6、9中序遍歷序列:7、4、2、1、8、5、3、6、9后序遍歷序列:7、4、2、8、5、9、6、3、16.若二叉樹中各結(jié)點值均不相同。1)已知一個二叉樹的中序和后序遍歷序列分別為GDHBAECIF和GHDBEIFCA,請畫出此二叉樹。2)已知一個二叉樹的前序和中序分別為ABCDEFGH和BDCEAFHG,請畫出此二叉樹。答:7.一個二叉樹如圖5.23所示,分別寫出其前序、中序、后序的遍歷序列。答:先序遍歷序列:A、B、D、E、F、C、G中序遍歷序列:D、F、E、B、A、G、C后序遍歷序列:F、E、D、B、G、C、A8.輸入一個正整數(shù)序列{55,34,18,88,119,11,76,9,97,99,46},試構(gòu)造一個二叉排序樹。9.有一份電文中共使用5個字符:a、b、c、d、e,它們的出現(xiàn)頻率依次為5、2、1、6、4。試畫出相應(yīng)的哈夫曼樹,并求出每個字符的哈夫曼編碼。第8題 各字符相應(yīng)的哈夫曼編碼如下:a:10,b:001,c:000,d:11,e:01二、算法設(shè)計題答案1.一個二叉樹以鏈?zhǔn)浇Y(jié)構(gòu)存儲,分別給出求二叉樹結(jié)點總數(shù)和葉子結(jié)點總數(shù)的算法。解:求二叉樹結(jié)點總數(shù)的算法如下:intCountNode(btree*t,intnum)/*num初值為0*/{if(t!=NULL)?{num++;??num=CountNode(t->left,num);??num=CountNode(t->right,num); }?returnnum;}求二叉樹葉子結(jié)點總數(shù)的算法如下:intCountLeaf(btree*t,intnum)/*num初值為0*/{if(t!=NULL)?{if(t->left==NULL&&t->right==NULL) ? num++;? num=CountLeaf(t->left,num);??num=CountLeaf(t->right,num);?} returnnum;}2.2.一個二叉樹以鏈?zhǔn)浇Y(jié)構(gòu)存儲,寫出在二叉樹中查找值為x的結(jié)點的算法。解:本題可以用先序、中序和后序遍歷中的任意一種遍歷,只要將遍歷算法中的訪問根結(jié)點改為判斷其值是否等于x。下面是用中序遍歷求解的算法,函數(shù)返回值為x的結(jié)點的地址,若沒有找到則返回空。btree*search(btree*t,intx,btreep)/*p的初值為NULL*/{ if(t!=NULL){ p=search(t->left,x,p); ?if(t->dat(yī)a==x)???p=t;/*找到x的地址放在p中*/? p=search(t->right,x,p);?}returnp;}3.設(shè)計一個算法將一個以鏈?zhǔn)酱鎯Y(jié)構(gòu)的二叉樹,按順序方式存儲到一維數(shù)組中。解:這是一個遞歸算法,如下:voidcreate(btree*t,inttree[],inti){ if(t!=NULL) { ?tree[i]=t->data; create(t->left,tree,2*i); ?creat(yī)e(t->right,tree,2*i+1); }}4.假設(shè)二叉排序樹t的各元素值均不相同,設(shè)計一個算法按遞增順序打印各元素值。解:按中序序列遍歷二叉排序樹即按遞增順序遍歷,所以遞增打印二叉排序樹各元素值的函數(shù)如下:voidinorder(btree*t){?if(t!=NULL) {??inorder(t->left); ?printf("%d",t->data);??inorder(t->right); }}5.已知一個中序線索二叉樹,試編寫中序遍歷的非遞歸算法。解:在中序線索二叉樹中進(jìn)行非遞歸中序遍歷,只要從頭結(jié)點出發(fā),反復(fù)找到結(jié)點的后繼,直至結(jié)束即可。在中序線索二叉樹中求結(jié)點后繼的算法如下:tbtree*succ(tbtree*p){ btree*q; if(p->rtag==1) return(p->right);else?{ q=p->right;? while(q->ltag==0) ?q=q->left; return(q);?}}由此得到中序遍歷線索二叉樹的非遞歸算法如下:voidthinorder(tbtree*p){if(p!=NULL) {while(p->ltag==0) ??p=p->left;? do{???printf("%d",p->data); ??p=succ(p); }while(p!=NULL);?}}第五章A[10][20]采用列為主序存儲,每個元素占1個單元,A[0][0]的地址為200,則A[6][12]的地址是多少?3262.稀疏矩陣m×n采用三元組順序表存儲結(jié)構(gòu),非零元個數(shù)tu滿足什么條件時,該存儲結(jié)構(gòu)才故意義?tu<m*n/33.二維數(shù)組A[10..20][5..10]采用行為主序存儲,每個元素占4個單元,A[10][5]的地址為1000,則A[18][9]的地址是多少?(1208)4.稀疏矩陣的三元組順序表存儲結(jié)構(gòu)是隨機(jī)存儲結(jié)構(gòu)嗎?為什么?(不是)5.廣義表((a,b,c,d))的表頭和表尾分別是什么?((a,b,c,d);空表)6.廣義表((a),((b),c),(((d))))的長度和深度分別是多少?(3,4)第一章數(shù)據(jù)物理結(jié)構(gòu)算法二、簡答一、名詞解釋數(shù)據(jù):就是一切可以由計算機(jī)接受和解決的對象。數(shù)據(jù)項:是數(shù)據(jù)的不可分割的最小單位,在有些場合下,數(shù)據(jù)項又稱為字段或域。數(shù)據(jù)元素:是數(shù)據(jù)的基本單位,在程序中作為一個整體加以考慮和解決,也稱為元素、頂點或記錄。它可以由若干個數(shù)據(jù)項組成。數(shù)據(jù)結(jié)構(gòu):指的是數(shù)據(jù)之間的互相關(guān)系,即數(shù)據(jù)的組織形式,它涉及數(shù)據(jù)的邏輯結(jié)構(gòu)、數(shù)據(jù)的存儲結(jié)構(gòu)和數(shù)據(jù)的運算三個方面的內(nèi)容。數(shù)據(jù)邏輯結(jié)構(gòu):是指數(shù)據(jù)元素之間的邏輯關(guān)系,是從邏輯上描述數(shù)據(jù),與數(shù)據(jù)的存儲無關(guān),獨立于計算機(jī)。數(shù)據(jù)物理結(jié)構(gòu):是指數(shù)據(jù)元素及其關(guān)系在計算機(jī)存儲器內(nèi)的表達(dá),是數(shù)據(jù)的邏輯結(jié)構(gòu)用計算機(jī)語言的實現(xiàn),是依賴于計算機(jī)語言的。算法:是對特定問題求解環(huán)節(jié)的一種描述。它是一個有窮的規(guī)則序列,這些規(guī)則決定了解決某一特定問題的一系列運算。由此問題相關(guān)的一定輸入,計算機(jī)依照這些規(guī)則進(jìn)行計算和解決,通過有限的計算環(huán)節(jié)后能得到一定的輸出。算法的時間復(fù)雜性:是該算法的時間花費,它是該算法所求解問題規(guī)模n的函數(shù)。當(dāng)n趨向無窮大時,我們把時間復(fù)雜性T(n)的數(shù)量級稱為算法的漸進(jìn)時間復(fù)雜性。二、簡答題1.算法分析的目的是什么?答:對算法進(jìn)行分析的目的有兩個:第一個目的是可以從解決同一問題的不同算法中區(qū)分相對優(yōu)劣,選出較為合用的一種;第二個目的是有助于設(shè)計人員考慮對現(xiàn)有算法進(jìn)行改善或設(shè)計出新的算法。2.什么是算法的最壞和平均時間復(fù)雜性?答:算法的最壞時間復(fù)雜性是研究各種輸入中運算最慢的一種情況下的運算時間;平均時間復(fù)雜性是研究同樣的n值時各種也許的輸入,取它們運算時間的平均值。三、答案1.三、分析下列算法的時間復(fù)雜性:1.sum=0;for(i=1;i<=n;i++){sum=sum+i;}答:該程序段的時間復(fù)雜性為T(n)=O(n)。2.2.i=1;while(i<=n)i=i*10;1*10for(j=0;j<n;j++)答:該程序段的時間復(fù)雜性T(n)=O(log10n)。3.3.sum=0;for(i=0;i<n;i++)???sum=sum+Array[i][j];答:該程序段的時間復(fù)雜性(n)=O(n2)。第二章一、基礎(chǔ)知識題一、基本知識題答案1.1.試比較順序表與鏈表的優(yōu)缺陷。的操作。答:順序表用結(jié)點物理位置的相鄰性來反映結(jié)點間的邏輯關(guān)系,其優(yōu)點是:節(jié)省存儲、隨機(jī)存取,當(dāng)表長變化較小,重要操作是進(jìn)行查找時,宜采用順序表。鏈表用附加的指針來反映結(jié)點間的邏輯關(guān)系,插入和刪除操作相對比較方便,當(dāng)表長變化較大,重要操作是進(jìn)行插入和刪除時,宜采用鏈表。2.2.試分析單鏈表與雙鏈表的優(yōu)缺陷。答:雙鏈表比單鏈表多增長了一個指針域以指向結(jié)點的直接前趨,它是一種對稱結(jié)構(gòu),因此在已知某個結(jié)點之前或之后插入一個新結(jié)點、刪除該結(jié)點或其直接后繼都同樣方便,操作的時間復(fù)雜度為O(1);而單鏈表是單向結(jié)構(gòu),對于找一個結(jié)點的直接前趨的操作要從開始結(jié)點找起,其時間復(fù)雜度為O(n)。3.3.為什么在單循環(huán)鏈表中設(shè)立尾指針比設(shè)立頭指針更好?答:由于對表的操作經(jīng)常在表的兩端進(jìn)行,所以對單循環(huán)鏈表,當(dāng)知道尾指針rear后,其另一端的頭指針是rear->next->next(表中帶頭結(jié)點)。這會使操作變的更加容易。4.4.寫出在循環(huán)雙鏈表中的p所指結(jié)點之后插入一個s所指結(jié)點答:s->prior=p;s->next=p->next;p->next->prior=s;p->next=s;5.5.寫出在單鏈表中的p所指結(jié)點之前插入一個s所指結(jié)點的操作。答:s->next=p->next;p->next=s;temp=p->data;p->data=s->dat(yī)a;s->data=temp;6.6.請運用鏈表來表達(dá)下面一元多項式A(x)=4*x^11+9*x^8+11*x^3+8*x+7答:多項式A(x)用鏈表表達(dá)如下:head_A-->4,11-->9,8--.11,3-->8,1-->7,0^二、算法設(shè)計題答案1.1.有一個有n個結(jié)點的單鏈表,設(shè)計一個函數(shù)將第i-1個結(jié)點與第i個結(jié)點互換,但指針不變。解:本題的算法思想是:要使結(jié)點互換而指針不變,只要將兩個結(jié)點的數(shù)據(jù)進(jìn)行互換即可。實現(xiàn)本題功能的函數(shù)如下:voidexchange(node*head,inti,n){?node*p,*q;?intdata; if(i>n)? printf("error!\n");else?{ p=head;??for(intj=1;j<i;j++) p=p->next;?q=p->next;?data=q->data;?q->dat(yī)a=p->data; p->dat(yī)a=data; }}2.2.設(shè)計一個函數(shù),查找單鏈表中數(shù)值為x的結(jié)點。解:實現(xiàn)本題功能的函數(shù)如下:voidsearch(node*head,intx){?node*p;?p=head; while(p->data!=x&&p!=NULL)? p=p->next;?if(p!=NULL)??printf("結(jié)點找到了!\n");?else ?printf("結(jié)點未找到!\n");}3..已知一個單鏈表,編寫一個刪除其值為x的結(jié)點的前趨結(jié)點的算法。解:本題的算法思想是:先找到值為x的結(jié)點*p和它的前趨結(jié)點*q,要刪除*q,只需把*p的值x放到*q的值域中,再刪除結(jié)點*p即可。實現(xiàn)本題功能的函數(shù)如下:voiddelete(node*head,intx){node*p,*q; q=head;?p=head->next;?while((p!=NULL)&&(p->data!=x)){q=p;?p=p->next;}?if(p==NULL) ?printf("未找到x!\n");elseif(q==head)? printf("x為第一個結(jié)點,無前趨!\n");else{ q->data=x; q->next=p->next; free(p);}}4.4.已知一個單鏈表,編寫一個函數(shù)從此單鏈表中刪除自第i個元素起的length個元素。解:實現(xiàn)本題功能的函數(shù)如下:voiddeletelength(node*head,inti,intlength){node*p,*q;?intj; if(i==1) for(j=1;j<=length;j++)/*刪除前k個元素*/??{p=head;/*p指向要刪除的結(jié)點*/ head=head->next;?? free(p);? }?else解:實現(xiàn)本題功能的函數(shù)如下:voiddeletelength(node*head,inti,intlength){node*p,*q;?intj;?if(i==1) ?for(j=1;j<=length;j++)/*刪除前k個元素*/? {p=head;/*p指向要刪除的結(jié)點*/ ? head=head->next;???free(p);??} else{p=head; ?for(j=1;j<=i-2;j++) p=p->next;/*p指向要刪除的結(jié)點的前一個結(jié)點*/??for(j=1;j<=length;j++)? { ?q=p->next;/*q指向要刪除的結(jié)點*/?? p->next=q->next; ?free(q);? } }}5.已知一個遞增有序的單鏈表,編寫一個函數(shù)向該單鏈表中插入一個元素為x的結(jié)點,使插入后該鏈表仍然遞增有序。解:本題算法的思想是:先建立一個待插入的結(jié)點,然后依次與鏈表中的各結(jié)點的數(shù)據(jù)域比較大小,找到插入該結(jié)點的位置,然后插入該結(jié)點。實現(xiàn)本題功能的函數(shù)如下:voidinsert(node*head,intx){ node*s,*p,*q;?s=(node*)malloc(sizeof(node));/*建立一個待插入的結(jié)點*/ s->data=x; s->next=NULL;if(head==NULL||x<head->dat(yī)a)/*若單鏈表為空或x小于第一個結(jié)點data域*/{ s->next=head;/*插入到表頭后面*/ head=s; } else?{ q=head;? p=q->next; ?while(p!=NULL&&x>p->data){ ??q=p; ??p=p->next; ?}??s->next=p;/*插入結(jié)點*/??q->next=s;?}}6.已知一個單鏈表,編寫一個函數(shù)將此單鏈表復(fù)制一個拷貝。解:本題算法的思想是依次查找原單鏈表(其頭指針為head1)中的每個結(jié)點,對每個結(jié)點復(fù)制一個新結(jié)點并鏈接到新的單鏈表(其頭指針為head2)中。實現(xiàn)本題功能的函數(shù)如下:voidcopy(node*head1,node*head2){?node*p,*q,*s;?head2=(node*)malloc(sizeof(node));?q=head2;q->data=head1->data;p=head1->next; while(p!=NULL) {? s=(node*)malloc(sizeof(node));??s->data=p->data;??q->next=s; q=s;? p=p->next;?} q->next=NULL;}7.有一個共10個結(jié)點的單鏈表,試設(shè)計一個函數(shù)將此單鏈表分為兩個結(jié)點數(shù)相等的單鏈表。解:本題的算法思想是:在原單鏈表一半處將其分開,第5個結(jié)點的next域置為空,為第一個單鏈表的表尾。第二個單鏈表的表頭指針指向原單鏈表的第6個結(jié)點。實現(xiàn)本題功能的函數(shù)如下,函數(shù)返回生成的第二個單鏈表的表頭指針,第一個單鏈表仍然使用原單鏈表的表頭指針。node*divide(node*head1){ node*head2,*prior; head2=head1;?for(inti=1;i<=5;i++) { prior=head2;?head2=head2->next; } prior->next=NULL;?returnhead2;}8.與上題相同的單鏈表,設(shè)計一個函數(shù),將此單鏈表提成兩個單鏈表,規(guī)定其中一個仍以原表頭指針head1作表頭指針,表中順序涉及原線性表的第一、三等奇數(shù)號結(jié)點;另一個鏈表以head2為表頭指針,表中順序涉及原單鏈表第二、四等偶數(shù)號結(jié)點。解:本題算法的思想是將第一個鏈表中的所有偶數(shù)序號的結(jié)點刪除,同時把這些結(jié)點鏈接起來構(gòu)成第二個單鏈表。實現(xiàn)本題功能的函數(shù)如下:voidsplit(node*head1,node*head2){ node*temp,*odd,*even;?odd=head1; head2=head1->next; temp=head2;while(odd!=NULL&&odd->next!=NULL) { ?even=odd->next;/*even指向偶數(shù)序號的結(jié)點*/??odd->next=even->next; ?temp->next=even;? temp=even;? odd=odd->next;/*odd指向奇數(shù)序號的結(jié)點*/ } even->next=NULL;}9.已知一個指針p指向單循環(huán)鏈表中的一個結(jié)點,編寫一個對此單循環(huán)鏈表進(jìn)行遍歷的算法。解:本題的算法思想是:由于是單循環(huán)鏈表,所以只要另設(shè)一指針q指向p用來幫助判斷是否已經(jīng)遍歷一遍即可。實現(xiàn)本題功能的函數(shù)如下:voidtravel(node*p){node*q=p;?while(q->next!=p) { printf("%4d",q->data);? q=q->next; }?printf("%4d",q->data);}10.已知一個單循環(huán)鏈表,編寫一個函數(shù),將所有箭頭方向取反。解:本題算法的思想是:從頭到尾掃描該循環(huán)鏈表,將第一個結(jié)點的next域置為NULL,將第二個結(jié)點的next域指向第一個結(jié)點,如此直到最后一個結(jié)點,便用head指向它。由于是循環(huán)鏈表,所以鑒定最后一個結(jié)點時不能用p->next=NULL作為條件,而是用q指向第一個結(jié)點,以p!=q作為條件。實現(xiàn)本題功能的函數(shù)如下:voidinvert(node*head){?node*p,*q,*r;p=head;q=p->next;?while(p!=q) {??r=head;? while(r->next!=p) ? r=r->next;??p->next=r;? p=p->next;?} q->next=head;}11.在雙鏈表中,若僅知道指針p指向某個結(jié)點,不知頭指針,能否根據(jù)p遍歷整個鏈表?若能,試設(shè)計算法實現(xiàn)。解:能。本題的算法思想是:分別從p開始沿著next以及prior向右、向左掃描直至各自的鏈為空即可遍歷整個鏈表。實現(xiàn)本題功能的函數(shù)如下:voidtravellist(node*p){node*q;?q=p;?while(q?。絅ULL)?{ printf("%4d",q->data); q=q->next;?}q=p->prior; while(q!=NULL)?{??printf("%4d",q->data);??q=q->prior;?}}12.試編寫一個在循環(huán)雙向鏈表中進(jìn)行刪除操作的算法,規(guī)定刪除的結(jié)點是指定結(jié)點p的前趨結(jié)點。解:實現(xiàn)本題功能的算法如下:voiddeleteprior(node*p){ node*pri,q;?pri=p->prior;?q=pri->prior;?if(pri==p) ?printf("p結(jié)點無前趨!\n");第三章二、算法設(shè)計題習(xí)題解答(3)一、基本知識題答案1.什么是棧?什么是隊列?它們各自的特點是什么?答:棧是限定在表的一端進(jìn)行插入或刪除操作的線性表;隊列是元素的添加在表的一端進(jìn)行,而元素的刪除在表的另一端進(jìn)行的線性表;棧的特點是后進(jìn)先出,隊列的特點是先進(jìn)先出。2.線性表、棧、隊列有什么異同?答:棧和隊列都是線性表,但是是受限的線性表,對插入、刪除運算加以限制。棧是只允許在一端進(jìn)行插入、刪除運算,因而是后進(jìn)先出表;而隊列是只允許在一端進(jìn)行插入、另一端進(jìn)行刪除運算,因而是先進(jìn)先出表。3.簡述棧的入棧、出棧操作的過程。答:棧的入棧、出棧操作均在棧頂進(jìn)行,棧頂指針指向棧頂元素的下一個位置。入棧操作先將入棧元素放到棧頂指針?biāo)甘镜奈恢蒙?,然后將棧頂指針加1。出棧操作先將棧頂指針減1,然后從棧頂指針指向位置取值。4.在循環(huán)隊列中簡述入隊、出隊操作的過程。答:在循環(huán)隊列中,設(shè)隊首指針指向隊首元素,隊尾指針指向隊尾元素后的一個空閑元素。在隊列不滿時,可執(zhí)行入隊操作,此時先送值到隊尾指針指向的空閑元素,隊尾指針再加1(要取模)。在隊列不空時,可執(zhí)行出隊操作,此時先從隊首指針指向處取值,隊首指針再加1(要取模)。二、算法設(shè)計題答案1.設(shè)用一維數(shù)組stack[n]表達(dá)一個堆棧,若堆棧中一個元素需占用length個數(shù)組單元(length>1),試寫出其入棧、出棧操作的算法。解:用一整型變量top表達(dá)棧頂指針,top為0時表達(dá)棧為空。假如棧不空,則從stack[1]開始存放元素。實現(xiàn)本題功能的函數(shù)如下:入棧算法:voidPush(EleTypex){ if((top+length)>n) printf("上溢出\n");?else{?if(top==0)/*為空棧*/{ top++;???stack[top]=x;? } else? {?? top=top+length;? ?stack[top]=x; }?}}出棧算法:voidPop(EleTypex){?if(top==0) printf("為空棧\n"); else?{??if(top==1) { x=stack[top];top--;??} else??{ x=stack[top]; ??top=top-length; }?}}2.試編寫一個遍歷及顯示隊列中元素的算法。解:設(shè)表達(dá)式在字符數(shù)組a[]中,使用一堆棧S來幫助判斷。實現(xiàn)本題功能的函數(shù)如下:intcorrect(chara[]){StackS; InitStack(S);?for(i=0;i<strlen(a);i++)??if(a[i]=='(')?? Push(S,'(');? elseif(a[i]==')'){? ?if(StackEmpty(S)) ??return0; else ??Pop(S);? } if(StackEmpty(S)) return1;/*配對對的*/ ?elsereturn0;/*配對錯誤*/}3.設(shè)一循環(huán)隊列Queue,只有頭指針front,不設(shè)尾指針,另設(shè)一個內(nèi)含元素個數(shù)的計數(shù)器,試寫出相應(yīng)的入隊、出隊算法。解:實現(xiàn)本題功能的函數(shù)如下:voidtravel(Queue,intfront,rear){?inti; for(i=front;i<=rear;i++){? printf("%4d",Queue[i]);?}}4.設(shè)計一算法能判斷一個算術(shù)表達(dá)式中的圓括號配對是否對的。(提醒:對表達(dá)式進(jìn)行掃描,凡碰到“(”就進(jìn)棧,碰到“)”就退出棧頂?shù)摹?”,表達(dá)式掃描完畢時棧若為空則圓括號配對對的。)解:用一個循環(huán)數(shù)組Queue[0,n-1]表達(dá)該循環(huán)隊列,頭指針為front,計數(shù)器count用來記錄隊列中結(jié)點的個數(shù)。入隊算法如下:voidenqueue(intx){?inttemp; if(count==n) ?printf("隊列上溢出\n");?else{ ?count++;??temp=(front+count)%n; Queue[temp]=x; }}出隊算法如下:intdequeue(){inttemp;if(count==0) printf("隊列下溢出\n"); else {temp=Queue[front]; front=(front+1)%n;count--; ?returntemp;?}}數(shù)據(jù)結(jié)構(gòu)(本科)期末綜合練習(xí)一(單選題)單選題1.一個數(shù)組元素a[i]與(A)的表達(dá)等價。A.*(a+i)B.a+iC.*a+iD.&a+i2.若需要運用形參直接訪問實參,則應(yīng)把形參變量說明為(B)參數(shù)。A.指針B.引用C.傳值D.常值3.下面程序段的時間復(fù)雜度為(C)。for(inti=0;i<m;i++)for(intj=0;j<n;j++)a[i][j]=i*j;A.O(m2)B.O(n2)C.O(m*n)D.O(m+n)4.執(zhí)行下面程序段時,執(zhí)行S語句的次數(shù)為(D)。for(inti=1;i<=n;i++)for(intj=1;j<=i;j++)S;A.n2B.n2/2C.n(n+1)D.n(n+1)/25.下面算法的時間復(fù)雜度為(B)。intf(unsignedintn){if(n==0||n==1)return1;elsereturnn*f(n-1);}A.O(1)B.O(n)C.O(n2)D.O(n!)6.一種抽象數(shù)據(jù)類型涉及數(shù)據(jù)和(B)部分。A.數(shù)據(jù)類型B.操作C.數(shù)據(jù)抽象D.類型說明7.當(dāng)一個作為實際傳遞的對象占用的存儲空間較大并也許被修改時,應(yīng)最佳說明為(B),以節(jié)省參數(shù)值的傳輸時間和存儲參數(shù)的空間。A.基本類型B.引用型C.指針型D.常值引用型8.當(dāng)需要進(jìn)行標(biāo)準(zhǔn)I/O操作時,則應(yīng)在程序文獻(xiàn)中包含iostream.h頭文獻(xiàn),當(dāng)需要進(jìn)行文獻(xiàn)I/O操作時,則應(yīng)在程序文獻(xiàn)中包含(A)頭文獻(xiàn)。A.fstream.hB.stdlib.hC.iomanip.hD.string.h9.一個記錄r理論上占有的存儲空間的大小等于所有域類型長度之和,事實上占有的存儲空間的大小即記錄長度為(D)。A.所有域長度之和B.最大域所占字節(jié)長度C.任意一個域長度D.sizeof(r)的值10.輸出一個二維數(shù)組b[m][n]中所有元素值的時間復(fù)雜度為(D)。A.O(n)B.O(m+n)C.O(n2)D.O(m*n)11.一個算法的時間復(fù)雜度為(3n2+2nlog2n+4n-7)/(5n),其數(shù)量級形式的復(fù)雜度表達(dá)為(A)。A.O(n)B.O(nlog2n)C.O(n2)D.O(log2n)12.某算法的時間代價為T(n)=100n+10nlog2n+n2+10,其時間復(fù)雜度為(C)。A.O(n)B.O(nlog2n)C.O(n2)D.O(1)13.某算法僅含程序段1和程序段2,程序段1的執(zhí)行次數(shù)3n2,程序段2的執(zhí)行次數(shù)為0.01n3,則該算法的時間復(fù)雜度為(C)。A.O(n)B.O(n2)C.O(n3)D.O(1)14.以下說法錯誤的是(C)。A.抽象數(shù)據(jù)類型具有封裝性。B.抽象數(shù)據(jù)類型具有信息隱蔽性。C.使用抽象數(shù)據(jù)類型的用戶可以自己定義對抽象數(shù)據(jù)類型中數(shù)據(jù)的各種操作。D.抽象數(shù)據(jù)類型的一個特點是使用與實現(xiàn)分離。15.在二維數(shù)組中,每個數(shù)組元素同時處在(C)個向量中。A.0個? B.1個??C.2個 D.n個16.多維數(shù)組事實上是由嵌套的(A)實現(xiàn)的。A.一維數(shù)組B.多項式C.三元組表D.簡樸變量17.在一個長度為n的順序表中順序搜索一個值為x的元素時,在等概率的情況下,搜索成功時的數(shù)據(jù)平均比較次數(shù)為(C)。A.nB.n/2C.(n+1)/2D.(n-1)/218.在一個長度為n的順序表中向第i個元素(0≤i≤n-1)位置插入一個新元素時,需要從后向前依次后移(A)個元素。A.n-iB.n-i+1C.n-i-1D.i19.在一個長度為n的順序表中刪除第i個元素(0≤i≤n-1)時,需要從前向后依次前移(C)個元素。

溫馨提示

  • 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

提交評論