最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

數(shù)據(jù)結(jié)構(gòu)與算法試題數(shù)據(jù)結(jié)構(gòu)與算法試題

2023-10-19 20:02 作者:答案資料  | 我要投稿

數(shù)據(jù)結(jié)構(gòu)與算法試題數(shù)據(jù)結(jié)構(gòu)與算法試題一、單選題1、在數(shù)據(jù)結(jié)構(gòu)的討論中把數(shù)據(jù)結(jié)構(gòu)從邏輯上分為 (C )

A 內(nèi)部結(jié)構(gòu)與外部結(jié)構(gòu) B 靜態(tài)結(jié)構(gòu)與動(dòng)態(tài)結(jié)構(gòu) C 線性結(jié)構(gòu)與非線性結(jié)構(gòu) D 緊湊結(jié)構(gòu)與非緊湊結(jié)構(gòu)。2、采用線性鏈表表示一個(gè)向量時(shí),要求占用的存儲(chǔ)空間地址(D ) A 必須就是連續(xù)的B 部分地址必須就是連續(xù)的 C 一定就是不連續(xù)的D 可連續(xù)可不連續(xù)3、采用順序搜索方法查找長(zhǎng)度為n的順序表時(shí),搜索成功的平均搜索長(zhǎng)度為( D )。

A n B n/2

C (n-1)/2

D (n+1)/2

4、在一個(gè)單鏈表中,若q結(jié)點(diǎn)就是p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn),若在q與p之間插入結(jié)點(diǎn)

s,則執(zhí)行( D )。A s→link = p→link;p→link = s; B p→link = s; s→link = q;C p→link = s→link;s→link = p;D q→link = s;s→link = p;5、如果想在4092個(gè)數(shù)據(jù)中只需要選擇其中最小的5個(gè),采用( C )方法最好。

A 起泡排序 B 堆排序C 錦標(biāo)賽排序 D 快速排序6、設(shè)有兩個(gè)串t與p,求p在t中首次出現(xiàn)的位置的運(yùn)算叫做( B )。

A 求子串B 模式匹配 C 串替換 D 串連接7、在數(shù)組A中,每一個(gè)數(shù)組元素A[i][j]占用3個(gè)存儲(chǔ)字,行下標(biāo)i從1到8,列下標(biāo)j從1到10。所有數(shù)組元素相繼存放于一個(gè)連續(xù)的存儲(chǔ)空間中,則存放該數(shù)

數(shù)據(jù)結(jié)構(gòu)與算法試題

組至少需要的存儲(chǔ)字?jǐn)?shù)就是( C )。

A 80 B 100

C 240


D 270

8、將一個(gè)遞歸算法改為對(duì)應(yīng)的非遞歸算法時(shí),通常需要使用( A )。

A 棧

B 隊(duì)列

C 循環(huán)隊(duì)列

D 優(yōu)先隊(duì)列

9、一個(gè)隊(duì)列的進(jìn)隊(duì)列順序就是1, 2, 3, 4,則出隊(duì)列順序?yàn)? C )。

10、在循環(huán)隊(duì)列中用數(shù)組A[0、、m-1] 存放隊(duì)列元素,其隊(duì)頭與隊(duì)尾指針分別為

front與rear,則當(dāng)前隊(duì)列中的元素個(gè)數(shù)就是( D )。

A ( front - rear + 1) % m B ( rear - front + 1) % m C ( front - rear + m) % m

D ( rear - front + m) % m

11、一個(gè)數(shù)組元素a[i]與( A )的表示等價(jià)。

A *(a+i)


B a+i

C *a+i

D &a+i

12、若需要利用形參直接訪問實(shí)參,則應(yīng)把形參變量說明為( B )參數(shù)。

A 指針

B 引用 C 值

D 變量

13、下面程序段的時(shí)間復(fù)雜度為( C ) for (int i=0;i<m;i++) for="" (int="" j="0;j<n;j++)" a[i][j]="i*j;" a="" o(m2)="" b="" o(n2)="" c="" o(m*n)="" d="" o(m+n)="" 14、下面程序段的時(shí)間復(fù)雜度為(="" )="" int="" f(unsigned="" n)="" {="" if(n="=0" ||="" n="=1)" return="" 1;="" 數(shù)據(jù)結(jié)構(gòu)與算法試題="" else="" n*f(n-1);="" }="" o(1)="" o(n)="" o(n="" !)="" 15、線性表若就是采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí),要求內(nèi)存中可用存儲(chǔ)單元的地址(="" )。="" 必須就是連續(xù)的="" 部分地址必須就是連續(xù)的="" 一定就是不連續(xù)的="" 連續(xù)或不連續(xù)都可以="" 16、數(shù)據(jù)結(jié)構(gòu)的定義為(d,s),其中d就是(="" )的集合。="" 算法="" b數(shù)據(jù)元素="" 數(shù)據(jù)操作="" 邏輯結(jié)構(gòu)="" 17、算法分析的目的就是(="" 找出數(shù)據(jù)結(jié)構(gòu)的合理性="" 研究算法中輸入與輸出的關(guān)系="" 分析算法的效率以求改進(jìn)="" 分析算法的易懂性與文檔性="" 18、在一個(gè)單鏈表中,若p所指結(jié)點(diǎn)不就是最后結(jié)點(diǎn),在p之后插入s所指結(jié)點(diǎn),則執(zhí)行(="" s-="">link=p;p->link=s;

B s->link=p->link;p->link=s; C s->link=p->link;p=s; D p->link=s;s->link=p;

19、設(shè)單鏈表中結(jié)點(diǎn)結(jié)構(gòu)為(data,link)、已知指針q所指結(jié)點(diǎn)就是指針p所指結(jié)點(diǎn)的直接前驅(qū),若在*q 與*p之間插入結(jié)點(diǎn)*s,則應(yīng)執(zhí)行下列哪一個(gè)操作( B )

A s->link=p->link; p->link=s; B q->link=s; s->link=p C p->link=s->link; s->link=p; D p->link=s; s->link=q; 20、設(shè)單鏈表中結(jié)點(diǎn)結(jié)構(gòu)為(data,link)、若想摘除結(jié)點(diǎn)*p的直接后繼,則應(yīng)執(zhí)行下列哪一個(gè)操作( A )

A p->link=p->link->link;

數(shù)據(jù)結(jié)構(gòu)與算法試題

B p=p->link; p->link=p->link->link;

C p->link=p->link; D p=p->link->link;

21、設(shè)單循環(huán)鏈表中結(jié)點(diǎn)的結(jié)構(gòu)為(data,link),且rear就是指向非空的帶表頭結(jié)點(diǎn)的單循環(huán)鏈表的尾結(jié)點(diǎn)的指針。若想刪除鏈表第一個(gè)結(jié)點(diǎn),則應(yīng)執(zhí)行下列哪一個(gè)操作( D )

A s=rear; rear=rear->link; delete s; B rear=rear->link; delete rear;


C rear=rear->link->link; delete rear;


D s=rear->link->link; rear->link->link=s->link; delete s;s為第一個(gè)結(jié)點(diǎn)硫

22、設(shè)單循環(huán)鏈表中結(jié)點(diǎn)的結(jié)構(gòu)為(data,link),且first為指向鏈表表頭的指針,current為鏈表當(dāng)前指針,在循環(huán)鏈表中檢測(cè)current就是否達(dá)到鏈表表尾的語句就是( D )。


A current->link =null B first->link=current C first=current D current->link=first

?23、一個(gè)棧的入棧序列為a,b,c,則出棧序列不可能的就是( C )。

A c,b,a B b,a,c C c,a,b D a,c,b 24、棧的數(shù)組表示中,top為棧頂指針,棧空的條件就是( A )。


A top=0 B top=maxSize C top=maxSize D top=-1 25、棧與隊(duì)列的共同特點(diǎn)就是( C )。


A 都就是先進(jìn)后出 B 都就是先進(jìn)先出 C 只允許在端點(diǎn)處插入與刪除 D 沒有共同點(diǎn)

26、假定一個(gè)順序存儲(chǔ)的循環(huán)隊(duì)列的隊(duì)頭與隊(duì)尾指針分別為f與r ,則判斷隊(duì)空的條件為( D )、 A f+1= =r

B r+1= =f

C f= =0

D f= =r

27、當(dāng)利用大小為n 的數(shù)組順序存儲(chǔ)一個(gè)隊(duì)列時(shí),該隊(duì)列的最大長(zhǎng)度為( B )

數(shù)據(jù)結(jié)構(gòu)與算法試題

A n-2

B n-1

C n D n+1

28、當(dāng)利用大小為n 的數(shù)組順序存儲(chǔ)一個(gè)棧時(shí),假定用top= =n 表示???則向這個(gè)棧插入一個(gè)元素時(shí),首先應(yīng)執(zhí)行( )語句修改top指針。

A top++;


B top--;

C top=0;

D top;

29、設(shè)鏈?zhǔn)綏V薪Y(jié)點(diǎn)的結(jié)構(gòu)為(data, link),且top就是指向棧頂?shù)闹羔?。若想摘除鏈?zhǔn)綏5臈m斀Y(jié)點(diǎn),并將被摘除結(jié)點(diǎn)的值保存到x中,則應(yīng)執(zhí)行下列( A )操作。


A x=top->data; top=top->link; B top=top->link; x=top->data; C x=top; top=top->link;

D x=top->data;

30、設(shè)循環(huán)隊(duì)列的結(jié)構(gòu)就是: const int Maxsize=100; typedef int Data Type; typedef struct {

Data Type data[Maxsize]; Int front, rear; } Queue;

若有一個(gè)Queue類型的隊(duì)列Q,試問判斷隊(duì)列滿的條件應(yīng)就是下列哪一個(gè)語句( D )

數(shù)據(jù)結(jié)構(gòu)與算法試題

的存儲(chǔ)位置就是( 1044)。


28、在插入與選擇排序中,若初始數(shù)據(jù)基本正序,則選擇(插入排序),若初始數(shù)據(jù)基本反序,則最好選擇(選擇排序)。


29、算法就是對(duì)特定問題的求解步驟的一種描述,它就是(指令)的有限序列,每一條(指令)表示一個(gè)或多個(gè)操作。


30、對(duì)于一個(gè)具有n個(gè)頂點(diǎn)肯e 條邊的無向圖,進(jìn)行拓樸排序時(shí),總的進(jìn)間為(n) 31、構(gòu)造哈希函數(shù)有三種方法,分別為(平方取中)法、(除留余數(shù))法、(折迭移位)法。


32、處理沖突的三種方法,分別為(線性探測(cè))、( 隨機(jī)探測(cè) )、( 鏈地址法)。

33、對(duì)于含有n個(gè)頂點(diǎn)與e條邊的無向連通圖,利用普里姆算法產(chǎn)生的最小生成樹,其時(shí)間復(fù)雜度為( O(n2) )、利用克魯斯卡爾算法產(chǎn)生的最小生成樹,其時(shí)間復(fù)雜度為(O(elog2e) )

34、快速排序在平均情況下的時(shí)間復(fù)雜度為(O(nlog2n)),在最壞情況下的時(shí)間復(fù)雜度為(O(n2));快速排序在平均情況下的空間復(fù)雜度為(O(log2n)),在最壞情況下的空間復(fù)雜度為(O(n))。


35、假定一組記錄的排序碼為(46,79,56,38,40,80),對(duì)其進(jìn)行歸并排序的過程中,第二趟排序后的結(jié)果就是([38 46 56 79][40 80])

36、假定一組記錄的排序碼為(46,79,56,38,40,80),對(duì)其進(jìn)行快速排序的第一次劃分的結(jié)果就是([38 40]46[56 79 80])。

37、一個(gè)結(jié)點(diǎn)的子樹的( 個(gè)數(shù) )稱為該結(jié)點(diǎn)的度。度為( 零 )的結(jié)點(diǎn)稱為葉結(jié)點(diǎn)或終端結(jié)點(diǎn)。度不為( 零 )的結(jié)點(diǎn)稱為分支結(jié)點(diǎn)或非終端結(jié)點(diǎn)。樹中各結(jié)點(diǎn)度的( 最大值 )稱為樹的度。


數(shù)據(jù)結(jié)構(gòu)與算法試題

38、設(shè)Ki=Kj (1<=i<=n, 1<=j<=n,j<>i)且在排序前的序列中Ri領(lǐng)先于Rj (i<j),若排序后的序列中ri仍領(lǐng)先于 rj,則這種排序方法就是(穩(wěn)定的),反之就是(不穩(wěn)定的)。="" 40="" 、在堆排序的過程中,對(duì)任一分支結(jié)點(diǎn)進(jìn)行調(diào)整運(yùn)算的時(shí)間復(fù)雜度為(O(log2n)),整個(gè)排序過程的時(shí)間復(fù)雜度為(O(nlog2n))。="" 41、在索引表中,每個(gè)索引項(xiàng)至少包含有(關(guān)鍵碼值)域與(子表地址)域這兩項(xiàng)。="" 42、假定一個(gè)線性表為="" (”abcd”,”baabd”,”bcef”,”cfg”,”ahij”,”bkwte”,”ccdt”,”aayb”),若按照字符串的第一個(gè)字母進(jìn)行劃分,使得同一個(gè)字母被劃分在一個(gè)子表中,則得到的a,b,c三個(gè)子表的長(zhǎng)度分別為(3),(3),(2)。="" 43、對(duì)于包含50個(gè)關(guān)鍵碼的3階b-樹,其最小高度為(4),最大高度為(5)。="" 44、從一棵b-樹刪除關(guān)鍵碼的過程,若最終引起樹根結(jié)點(diǎn)的合并,則新樹比原樹的高度(減1)="" 45、假定要對(duì)長(zhǎng)度n="100的線性表進(jìn)行散列存儲(chǔ),并采用開散列法處理沖突,則對(duì)于長(zhǎng)度m=20的散列表,每個(gè)散列地址的同義詞子表的長(zhǎng)度平均為(5)。" 46、在散列存儲(chǔ)中,裝載因子α又稱為裝載系數(shù),若用m表示散列表的長(zhǎng)度,n表示待散列存儲(chǔ)的元素的個(gè)數(shù),則α等于(n="" m)。="" 47、在有向圖的鄰接矩陣中,第i行中“1”的個(gè)數(shù)就是第i個(gè)頂點(diǎn)的(出度),第i列中“1”的個(gè)數(shù)就是第i個(gè)頂點(diǎn)的(入度)。在無向圖的鄰接矩陣中,第i行(列)中“1”的個(gè)數(shù)就是第i個(gè)頂點(diǎn)的(度),矩陣中“1”的個(gè)數(shù)的一半就是圖中的(邊數(shù))。="" 48、在對(duì)m階b-樹中,每個(gè)非根結(jié)點(diǎn)的關(guān)鍵碼數(shù)最少為(「m="" 2┐-1)個(gè),最多為(m-1)個(gè),其子樹棵數(shù)最少為(「m="" 2┐),最多為(m)。="" 數(shù)據(jù)結(jié)構(gòu)與算法試題="" 三、="" 判斷題="" 1、="" 數(shù)據(jù)元素就是數(shù)據(jù)的最小單位(╳)。="" 2、="" 數(shù)據(jù)的邏輯結(jié)構(gòu)就是指各數(shù)據(jù)元素之間的邏輯關(guān)系,就是用戶按使用需要建立的(√)、="" 3、="" 數(shù)據(jù)結(jié)構(gòu)就是指相互之間存在一種或多種關(guān)系的數(shù)據(jù)元素的全體(╳)。="" 4、="" 從邏輯關(guān)系上講,數(shù)據(jù)結(jié)構(gòu)主要分為兩大類:線性結(jié)構(gòu)與非線性結(jié)構(gòu)(√)。="" 5、="" 線性表的邏輯順序與物理順序總就是一致的(╳)。="" 6、="" 二維數(shù)組就是其數(shù)組元素為線性表的線性表(╳)。="" 7、="" 每種數(shù)據(jù)結(jié)構(gòu)都應(yīng)具備三種基本運(yùn)算:插入、刪除、搜索(√)。="" 8、="" 非空線性表中任意一個(gè)數(shù)據(jù)元素都有且僅有一個(gè)直接前驅(qū)元素。(╳="" )="" 9、="" 空串與由空格組成的串沒有區(qū)別。(╳="" 10、將t在s中首次出現(xiàn)的位置作為t在s中的位置的操作稱為串的模式匹配。(√)="" 11、深度為h的非空二叉樹的第h層最多有2h-1個(gè)結(jié)點(diǎn)(╳="" 12、完全二叉樹就就是滿二叉樹。(╳)="" 13、已知一棵二叉樹的前序序列與中序序列可以唯一地構(gòu)造出該二叉樹。(√="" 14、帶權(quán)連通圖的最小生成樹的權(quán)值之與一定小于它的其它生成樹的權(quán)值之與。(√)="" 15、線性表的順序存儲(chǔ)結(jié)構(gòu)的特點(diǎn)就是邏輯關(guān)系上相鄰的兩個(gè)元素在物理位置上也相鄰。(="" √="" 16、若有一個(gè)結(jié)點(diǎn)就是二叉樹中某個(gè)子樹的中序遍歷結(jié)果序列的最后一個(gè)結(jié)點(diǎn),="" 則它一定就是該子樹的前序遍歷結(jié)果序列的最后一個(gè)結(jié)點(diǎn)。(√)="" 17、任一棵二叉搜索樹的平均搜索時(shí)間都小于用順序搜索法搜索同樣結(jié)點(diǎn)的順序表的平均搜索時(shí)間。(╳)="" 18、最優(yōu)二叉搜索樹一定就是平衡的二叉搜索樹。(√)="" 19、aoe網(wǎng)就是一種帶權(quán)的無環(huán)連通圖。(√="" 20、對(duì)于同一組待輸入的關(guān)鍵碼集合,雖然各關(guān)鍵碼的輸入次序不同,但得到的二叉搜索樹都就是相同的(╳)。="" 21、二叉排序樹可以就是一棵空樹(√="" 22、線性表中所有結(jié)點(diǎn)的類型必須相同。="" (√="" 23、n個(gè)結(jié)點(diǎn)的有向圖,若它有n(n-1)條邊,則它一定就是強(qiáng)連通的。(√="" 24、任何無環(huán)的有向圖,其結(jié)點(diǎn)都可以排在一個(gè)拓?fù)湫蛄欣铩?√="" 25、隊(duì)列邏輯上就是一個(gè)下端口與上端能增加又能減少的線性表(╳="" 26、二叉樹就是樹的一種特殊情況(="" 27、用鄰接矩陣存儲(chǔ)一個(gè)圖時(shí),在不考慮壓縮存儲(chǔ)的情況下,所占用的存儲(chǔ)空間大小只與圖中頂點(diǎn)個(gè)數(shù)有關(guān),而與圖的邊數(shù)無關(guān)(√)。="" 28、鄰接表只能用于有向圖的存儲(chǔ),鄰接矩陣對(duì)于有向圖與無向圖的存儲(chǔ)都適用。(╳)="" 29、連通分量就是無向圖中的極小連通子圖。(╳)="" 30、在AOE網(wǎng)絡(luò)中一定只有一條關(guān)鍵路徑。(╳)="" 31、關(guān)鍵活動(dòng)不按期完成就會(huì)影響整個(gè)工程的完成時(shí)間。(√)="" 32、平衡二叉樹的左右子樹深度之差的絕對(duì)值不超過1。(√="" 33、快速排序就是對(duì)起泡排序的一種改進(jìn)。(="" 34、直接選擇排序穩(wěn)定。(="" ╳="" 35、堆排序占用的輔助空間很大。(="" 36、在散列法中采取開散列法來解決沖突時(shí),其裝載因子的取值一定在(0,1)之間。(╳)="" 37、b-樹就是一種動(dòng)態(tài)索引結(jié)構(gòu),它既適用于隨機(jī)搜索,也適用于順序搜索。(="" ╳)="" 38、在散列法中,一個(gè)可用散列函數(shù)必須保證絕對(duì)不產(chǎn)生沖突。(╳)="" 39、任何一個(gè)關(guān)鍵活動(dòng)延遲,那么整個(gè)工程將會(huì)延遲。(√)="" 40、任何一個(gè)關(guān)鍵活動(dòng)提前完成,那么整個(gè)工程將會(huì)提前完成。(╳)="" 四、運(yùn)算應(yīng)用題="" 1、在一個(gè)有n個(gè)元素的順序表的第i個(gè)元素(1="" £="" i="" n)之前插入一個(gè)新元素時(shí),需要向后移動(dòng)多少個(gè)元素?="" 答案:需要向后移動(dòng)="" n-="" +="" 1個(gè)元素="" 2、當(dāng)一個(gè)棧的進(jìn)棧序列為1234567時(shí),可能的出棧序列有多少種?6457321就是否就是合理的出棧序列?="" 答案:="" 可能的出棧序列有="" 種,6457321不就是合理的出棧序列。="" 3、簡(jiǎn)單(直接)選擇排序就是一種穩(wěn)定的排序方法不?試舉例說明?="" 4291="" 234567891011121314811717="" 14=*************=+c數(shù)據(jù)結(jié)構(gòu)與算法試題="" (1)各層的結(jié)點(diǎn)個(gè)數(shù)就是ki="" (i="0,1,2,、、、、,h)" (2)編號(hào)為i的結(jié)點(diǎn)的父結(jié)點(diǎn)(若存在)的編號(hào)就是└="" (i+k-2)="" k」="" (3)編號(hào)為i的結(jié)點(diǎn)的第m個(gè)孩子結(jié)點(diǎn)(若存在)的編號(hào)就是(i-1)*k+m+1="" (4)當(dāng)(i-1)%k<="">0時(shí)有右兄弟, 右兄弟的編號(hào)為 i+1

(5)若結(jié)點(diǎn)個(gè)數(shù)為 n ,則高度h與n 的關(guān)系為:h=logk(n*(k-1)+1)-1 (n=0時(shí)h=-1)

7、 寫出下列中綴表達(dá)式的后綴形式: (1) A* - B + C

(2) (A + B) * D + E / (F + A * D) + C (3) A && B|| ! (E > F) {注:按C++的優(yōu)先級(jí))

(4) !(A && !( (B < C)||(C > D) ) )||(C < E)

答案:各中綴表達(dá)式的后綴形式如下: (1)AB-*C+

(2)AB+D*EFAD*+/+C+ (3)AB&&EF>!|| (4)ABC||!&&!CE<||

8、 畫出下列廣義表的圖形表示與它們的存儲(chǔ)表示: (1) D(A(c), B(e), C(a, L(b, c, d)))

(2) J1(J2(J1, a, J3(J1)), J3(J1))

數(shù)據(jù)結(jié)構(gòu)與算法試題

答案:廣義表(1)的圖形表示為:



廣義表(2)的圖形表示為:


廣義表(1)的存儲(chǔ)表示為:


廣義表(2)的存儲(chǔ)表示為:



A

B C D

L c

e

a

b

c

d

J1

J3

J2 a

D

0 A 1 C ^ 0 B 1 e ^

A B

0 D

2

2

2 ^

0 C

1 a

2 ^

0 L

1 b

1 C

1 d ^

C L

0 J1

2

2 ^

0 J2

2

1 a

2 ^

0 J3

2 ^

J3

J2

J1

數(shù)據(jù)結(jié)構(gòu)與算法試題


9、題目:11、將下面的森林變換成二叉樹(7分)。

答案:


10、將算術(shù)表達(dá)式 ((a+b)+c*(d+e)+f)*(g+h) 轉(zhuǎn)化為二叉樹。(7分) 答案:


*

+

+

+

f

+ *

+

c b

a

h

g

A

C

D

B F

E

K

J

G

H

I

A

C

D

B

F

E

K

J

G

H

I

數(shù)據(jù)結(jié)構(gòu)與算法試題


11、根據(jù)所給有向圖,寫出一個(gè)拓?fù)湫蛄小?5分)


答案:

其中的一個(gè)拓?fù)湫蛄袨?V1,V2,V3,V4,V5,V6,V7

12、 將給定的圖簡(jiǎn)化為最小的生成樹,要求從頂點(diǎn)1出發(fā)。(7分)





答案:

1

3

2

5

4

7

6

1

3

2

5

4

7 6

8

5

15

3 10

12

2 7 9

6 1

3

2

5

4

7

6

5

15

3 6 2

7 數(shù)據(jù)結(jié)構(gòu)與算法試題


13、某子系統(tǒng)在通信聯(lián)絡(luò)中只可能出現(xiàn)8種字符,其出現(xiàn)的概率分別為0、05,0、29,0、07,0、08,0、14,0、23,0、03,0、11試設(shè)計(jì)赫夫曼編碼。

答案:

為方便起見,設(shè)各種字符的權(quán)值w={5,29,7,8,14,23,3,11}。因?yàn)閚=8,所以要構(gòu)造的赫夫曼樹共有m=2n-1=2*8-1=15個(gè)結(jié)點(diǎn)。生成的赫夫曼樹為下圖所示:


赫夫曼編碼為:概率為0、23的字符編碼為:00 概率為0、11的字符編碼為:010

概率為0、05的字符編碼為:0110

23

11

5

3

29 14

7 8

0 0

0

0 0 0 0 1 1

1

1 1 1 1 數(shù)據(jù)結(jié)構(gòu)與算法試題

概率為0、03的字符編碼為:0111 概率為0、29的字符編碼為:10

概率為0、14的字符編碼為:110 概率為0、07的字符編碼為:1110 概率為0、08的字符編碼為:1111

14、已知一棵二叉樹的前序遍歷的結(jié)果就是ABECDFGHIJ, 中序遍歷的結(jié)果就是EBCDAFHIGJ, 試畫出這棵二叉樹,并給出這棵二叉樹的后序遍歷序列。

答案:根據(jù)前序序列與中序序列能得到唯一的二叉樹,所得二叉樹如圖:


這棵二叉樹的后序遍歷序列為:EDCBIHJGFA

15、在結(jié)點(diǎn)個(gè)數(shù)為n(n>1)的各棵樹中,高度最小的樹的高度就是多少?它有多少個(gè)葉結(jié)點(diǎn)?多少個(gè)分支結(jié)點(diǎn)?高度最大的樹的高度就是多少?它有多少個(gè)葉結(jié)點(diǎn)?多少個(gè)分支結(jié)點(diǎn)?

答案:結(jié)點(diǎn)個(gè)數(shù)為n時(shí),高度最小的樹的高度為1,有2層;它有n-1個(gè)葉結(jié)點(diǎn),1個(gè)分支結(jié)點(diǎn);高度最大的樹的高度為n-1,有n層;它有1個(gè)葉結(jié)點(diǎn),n-1個(gè)分支結(jié)點(diǎn)。

16、 對(duì)于一個(gè)高度為h的AVL樹,其最少結(jié)點(diǎn)數(shù)就是多少?反之,對(duì)于一個(gè)有n個(gè)結(jié)點(diǎn)的AVL樹, 其最大高度就是多少? 最小高度就是多少?

答案:設(shè)高度為h(空樹的高度為-1)的AVL樹的最少結(jié)點(diǎn)為Nh,則Nh = Fh+3 -1。


A

B

F G

E

C

D

H

J

I

數(shù)據(jù)結(jié)構(gòu)與算法試題

Fh 就是斐波那契數(shù)。又設(shè)AVL樹有n個(gè)結(jié)點(diǎn),則其最大高度不超過3/2*log2(n+1), 最小高度為「log2(n+1) ┐-1。


17、7-7 設(shè)有序順序表中的元素依次為017, 094, 154, 170, 275,503, 509, 512, 553, 612, 677, 765, 897, 908。試畫出對(duì)其進(jìn)行折半搜索時(shí)的判定樹, 并計(jì)算搜索成功的平均搜索長(zhǎng)度與搜索不成功的平均搜索長(zhǎng)度。


____圖(1)____

答案:折半搜索時(shí)的判定樹為:



ASLSUCC=1/14(1+2*2+3*4+4*7)=45/14 ASLUNSUCC=1/15(3*1+4*14)=59/15

18、試對(duì)下圖所示的AOE網(wǎng)絡(luò)


(1) 這個(gè)工程最早可能在什么時(shí)間結(jié)束。


(2) 求每個(gè)事件的最早開始時(shí)間Ve[i]與最遲開始時(shí)間Vl[i]。

(3) 求每個(gè)活動(dòng)的最早開始時(shí)間e( )與最遲開始時(shí)間l( )。


(4) 確定哪些活動(dòng)就是關(guān)鍵活動(dòng)。畫出由所有關(guān)鍵活動(dòng)構(gòu)成的圖,指出哪些活動(dòng)加速可使整個(gè)工程提前完成。


509

154

677

017

275

170

503

094 553

897

512 612 765 908

數(shù)據(jù)結(jié)構(gòu)與算法試題

答案:按拓樸有序的順序計(jì)算各個(gè)頂點(diǎn)的最早可能開始時(shí)間Ve與最遲允許開始時(shí)間Vl,然后再計(jì)算各個(gè)活動(dòng)的最早可能開始時(shí)間e與最遲允許開始時(shí)間l,根據(jù)l-e就是否等于0來確定關(guān)鍵活動(dòng),從而確定關(guān)鍵路徑。

① ③ ② ④ ⑤ ⑥ Ve Vl






<1,2> <1,3> <3,2> <2,4> <2,5> <3,5> <4,6> <5,6> e 0 8 L 17 8 l-e

17

0

0

8

0

12

8

0

此工程最早完成時(shí)間為43,關(guān)鍵路徑為<1,3><3,2><2,5><5,6>

19、已知有五個(gè)待排序的記錄,其關(guān)鍵字分別為:256,301,751,129,937,863,742,694,076,438請(qǐng)用快速排序的方法將它們從小到大排列。

答案:

第一次排序:(076,129),256,(751,937,863,742,694,301,439) 第二次排序:076,129,256,(438,301,694,742),751,(863,937) 第三次排序:076,129,256,301,438,(694,742),751,(863,937) 第四次排序:076,129,256,301,438,694,742,751,(863,937) 第五次排序:076,129,256,301,438,694,742,751,863,937

20、設(shè)有150個(gè)記錄要存儲(chǔ)到散列表中, 并利用線性探查法解決沖突, 要求找到所需記錄的平均比較次數(shù)不超過2次。試問散列表需要設(shè)計(jì)多大? (設(shè)a就是散列表的裝載因子,則有ASLsucc = ( 1+1/ (1-a) )/2)。


數(shù)據(jù)結(jié)構(gòu)與算法試題

答案:已知要存儲(chǔ)的記錄數(shù)為n=150,查找成功的平均查找長(zhǎng)度為ASLsucc ≤2,則有:ASLsucc =1/2(1+1/(1-a))≤2 解得 a≤2/3 ,又有:a=n/m=150/m 兩式聯(lián)立得:150/m≤2/3,解得:m≥225、 所以散列表需要設(shè)計(jì)225個(gè)單位。

五、算法分析題

1、給出下列遞歸過程的執(zhí)行結(jié)果 void unknown ( int w ) {

if ( w ) {

unknown ( w-1 );

for ( int i = 1; i <= w; i++ ) cout << w<<' ';

cout << endl;

} }

調(diào)用語句為 unknown (4)。

答案:

(1) 1 2 2

3 3 3

4 4 4 4

2、給出遞歸過程的執(zhí)行結(jié)果 void unknown ( int n ) {

cout << n % 10 ;

if ( int ( n / 10 ) ) unknown ( int ( n / 10 ) );

數(shù)據(jù)結(jié)構(gòu)與算法試題

}

調(diào)用語句為unknown ( 582 )。

答案: 285

3、給出遞歸過程的執(zhí)行結(jié)果

int unknown ( int m ) {

int value;

if ( ! m ) value = 3;

else value = unknown ( m-1 ) + 5; return value;

}

執(zhí)行語句為 cout << unknown (3)。

答案: 18

4、 設(shè)有一個(gè)二維數(shù)組A[m][n],假設(shè)A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每個(gè)元素占一個(gè)空間,問A[3][3](10)存放在什么位置?腳注(10)表示用10進(jìn)制表示。


答案:設(shè)數(shù)組元素A[i][j]存放在起始地址為L(zhǎng)oc(i,j)的存儲(chǔ)單元中。

因?yàn)?Loc(2,2)= Loc(0,0)+2*n+2=644+2*n+2=676 所以:n=(676-2-644)/2=15

所以:Loc(3,3)= Loc(0,0)+3*15+3=644+45+3=692 5、設(shè)單鏈表結(jié)構(gòu)為 struct ListNode {

int data ;

ListNode * link ;



};

數(shù)據(jù)結(jié)構(gòu)與算法試題

下面的程序就是以單鏈表為存儲(chǔ)結(jié)構(gòu), 實(shí)現(xiàn)二路歸并排序的算法, 要求鏈表不另外占用存儲(chǔ)空間, 排序過程中不移動(dòng)結(jié)點(diǎn)中的元素, 只改各鏈結(jié)點(diǎn)中的指針, 排序后r仍指示結(jié)果鏈表的第一個(gè)結(jié)點(diǎn)。在初始狀態(tài)下, 所有待排序記錄鏈接在一個(gè)以r為頭指針的單鏈表中。例如,


____圖(1)____



在算法實(shí)現(xiàn)時(shí),利用了一個(gè)隊(duì)列做為輔助存儲(chǔ), 存儲(chǔ)各有序鏈表構(gòu)成的歸并段的鏈頭指針。初始時(shí), 各初始?xì)w并段為只有一個(gè)結(jié)點(diǎn)的有序鏈表。隊(duì)列的數(shù)據(jù)類型為Queue, 其可直接使用的相關(guān)操作有

n 置空隊(duì)列操作:makeEmpty ( );

n 將指針x加入到隊(duì)列的隊(duì)尾操作:EnQueue ( ListNode * x ); n 退出隊(duì)頭元素, 其值由函數(shù)返回的操作:ListNode *DlQueue ( ); n 判隊(duì)列空否的函數(shù), 空則返回1, 不空則返回0:int IsEmpty( )。

解決方法提示:

? 程序首先對(duì)待排序的單鏈表進(jìn)行一次掃描, 將它劃分為若干有序的子鏈表, 其表頭 指針存放在一個(gè)指針隊(duì)列中。


? 當(dāng)隊(duì)列不空時(shí), 從隊(duì)列中退出兩個(gè)有序子鏈表, 對(duì)它們進(jìn)行二路歸并, 結(jié)果鏈表的表頭指針存放到隊(duì)列中。


? 如果隊(duì)列中退出一個(gè)有序子鏈表后變成空隊(duì)列, 則算法結(jié)束。這個(gè)有序子鏈表即為所求。


在算法實(shí)現(xiàn)時(shí)有 6 處語句缺失,請(qǐng)閱讀程序后補(bǔ)上。

(1) 兩路歸并算法 void merge ( ListNode * ha, ListNode * hb,, ListNode *& hc ) {

ListNode *pa, *pb, *pc ;

if ( ha→data <= hb→data ) { hc = ha; pa = ha→link; pb = hb; }

數(shù)據(jù)結(jié)構(gòu)與算法試題

else { hc = hb; pb = hb→link; pa = ha ; } pc = hc;


while ( pa && pb )

if (

pa→data <= pb→data )


{

pc→link = pa; pc = pa;

pa = pa→link

;

}

else

{ pc→link = pb; pc = pb;

pb = pb→link

;

}


if ( pa ) pc→link = pa;

else pc→link = pb; };

(2) 歸并排序主程序 void mergesort ( ListNode * r ) { ListNode * s, t; Queue Q ;

if ( ! r ) return;

s = r; Q、EnQueue( r )

;

while ( s ) { t = s→link;


while ( t != 0 && s→data <= t→data ) { s = t; t = t→

link; }

if ( t ) {

s→link = 0; s = t;

Q、EnQueue( s )

;

數(shù)據(jù)結(jié)構(gòu)與算法試題

} }

while ( !Q、IsEmpty( ) ) { r = Q、DlQueue( );

if ( Q、IsEmpty( ) ) break;

s = Q、DlQueue( );

merge( r, s, t );

Q、EnQueue( t ) ;

}

}

6、請(qǐng)讀下列程序,該程序就是在單鏈表中刪除一個(gè)結(jié)點(diǎn)的算法,為空出的地方填上正確的語句。(7分)

void demo2(LinkList head,ListNode *p) {//head 就是帶頭結(jié)點(diǎn)的單鏈表,刪除P指向的結(jié)點(diǎn) ListNode *q=head;

while(q&&q->next!=p ) q=q->next; if (q) Error(“*p not in head”); q->next=p->next; free(p);

}

7、 已知一完全二叉樹從根結(jié)點(diǎn)開始,自頂向下,同一層自左向右連續(xù)編號(hào),根結(jié)

點(diǎn)的編號(hào)為0,閱讀以下程序請(qǐng)回答該程序所實(shí)現(xiàn)的功能: template

void linkedtosequent(Bintreenode *t,type a[ ],int i){ if (t!=Null){

數(shù)據(jù)結(jié)構(gòu)與算法試題

a[]=t->getData();

linkedtosequent(t->getleftchild(),a,2*i+1); linkedtosequent(t->getrightchild(),a,2*i+2); }}

主程序調(diào)用方式:linkedtosequent(t、root,a,0);

答案:該程序的功能就是:將用二叉鏈表表示的完全二叉樹轉(zhuǎn)換為二叉樹的順序(數(shù)組)表示。


8、設(shè)散列表為HT[13], 散列函數(shù)為 H (key) = key %13。用閉散列法解決沖突, 對(duì)下列關(guān)鍵碼序列 12, 23, 45, 57, 20, 03, 78, 31, 15, 36 造表。


(1) 采用線性探查法尋找下一個(gè)空位, 畫出相應(yīng)的散列表, 并計(jì)算等概率下搜索成功的平均搜索長(zhǎng)度與搜索不成功的平均搜索長(zhǎng)度。


(2) 采用雙散列法尋找下一個(gè)空位, 再散列函數(shù)為 RH (key) = (7*key) % 10 + 1, 尋找下一個(gè)空位的公式為 Hi = (Hi-1 + RH (key)) % 13, H1 = H (key)。畫出相應(yīng)的散列表, 并計(jì)算等概率下搜索成功的平均搜索長(zhǎng)度。

答案:使用散列函數(shù)H(key)=key mod 13 有: H(12)=12,

H(23)=10,H(45)=6,H(57)=5,H(20)=7,H(03)=3,H(78)=0,H(31)=5,H(15)=2,H(36)=10

利用線性探查法造表: 0 11 12 78 1 23 36 12 1


1

1


1

1

1

4


1

2

1

搜索成功的平均搜索長(zhǎng)度為:

ASLsucc =1/10(1+1+1+1+1+1+4+1+2+1)=14/10 搜索不成功的平均搜索長(zhǎng)度為:

ASLunsucc =1/13(2+1+3+2+1+5+4+3+2+1+5+4+3)=36/13 利用雙散列法造表:

數(shù)據(jù)結(jié)構(gòu)與算法試題

Hi =(Hi-1 +RH(key))%13, Hi =H(key) 0 11 12 78 1 36 23 12 1


1

1


1

1

1

3

5

1


1

9、閱讀下面程序,指出其算法的功能并求出其時(shí)間復(fù)雜度。


(1) int Prime(int n){

int i=2,x=(int)sqrt(n); while(i<=x){ if(n%i==0)break; i++; }

if(i>x) return 1; else return 0; }

(2)int sum1(int n){ int p=1,s=0;

for(int i=1;i<=n;i++) {p*=i;s+=p;} return s; }

答案:(1)程序功能就是判斷n就是否就是一個(gè)素?cái)?shù),若就是則返回?cái)?shù)值1,否則返回?cái)?shù)值0,該算法的時(shí)間復(fù)雜度為O(sqrt(n))、 (2)程序功能就是計(jì)算∑ni=1i!,該算法的時(shí)間復(fù)雜度為O(n)、

10、判斷一個(gè)帶表頭結(jié)點(diǎn)的雙向循環(huán)鏈表L就是否對(duì)稱相等的算法如下所示,請(qǐng)?jiān)谒惴ǖ?處填入正確的語句。


數(shù)據(jù)結(jié)構(gòu)與算法試題

int symmetry(DblList DL) { int sym=1;

DblNode p=DL->rLink,q=DL->lLink; While(p!=q&&p->lLink==q)&& sym==1 ) if (p->data==q->data){ p=p->rLink; q=q->lLink; }

else sym=0; return sym;} 11、閱讀下面程序,指出其算法的功能 #include “stack、h” int BaseTrans(int N,int B) { int i,result=0;StackS;

while(N!=0){i=N%B;N=N/B;S、Push(i);} while(!S、IsEmpty()){i=S、GetTop();S、Pop(); result=result*10+i;} return result; }

答案:該算法就是將一個(gè)非負(fù)的十進(jìn)制整數(shù)N轉(zhuǎn)換為另一個(gè)基數(shù)為B的B進(jìn)制數(shù)。


12、閱讀下面程序,指出其算法的功能 template

void BinaryTree::binsearchTree(BinTreeNode*t,int &bs) {

數(shù)據(jù)結(jié)構(gòu)與算法試題

if(t!=Null){

if((t->letfchild==Null||t->data>t->leftchild->data)&& (t->rightchild==Null||t->datarightchild->data)) { bs=1;

binsearchTree(t->leftchild,bs);

if(bs) binsearchTree(t->rightchild,bs); }

else bs=0; } }

答案:該算法就是判別給定的以二叉鏈表存儲(chǔ)的二叉樹就是否就是二叉搜索樹。采用遞歸算法,對(duì)樹中的所有結(jié)點(diǎn)檢查就是否左子樹上結(jié)點(diǎn)的關(guān)鍵碼都小于它的關(guān)鍵碼,右子樹上結(jié)點(diǎn)的關(guān)鍵碼都大于它的關(guān)鍵碼。如滿足上述條件,則就是二叉搜索樹。

六、綜合算法題

1、試設(shè)計(jì)一個(gè)實(shí)現(xiàn)下述要求的查找運(yùn)算函數(shù)Locate。設(shè)有一個(gè)帶表頭結(jié)點(diǎn)的雙向鏈表L, 每個(gè)結(jié)點(diǎn)有4個(gè)數(shù)據(jù)成員:指向前驅(qū)結(jié)點(diǎn)的指針llink、指向后繼結(jié)點(diǎn)的指針rlink,存放字符數(shù)據(jù)的成員data與訪問頻度freq。所有結(jié)點(diǎn)的freq 初始時(shí)都為0。每當(dāng)在鏈表上進(jìn)行一次Locate(L, x) 操作時(shí),令元素值為x的結(jié)點(diǎn)的訪問頻度freq加1,并將該結(jié)點(diǎn)前移,鏈接到與它的訪問頻度相等的結(jié)點(diǎn)后面,使得鏈表中所有結(jié)點(diǎn)保持按訪問頻度遞減的順序排列,以使頻繁訪問的結(jié)點(diǎn)總就是靠近表頭。


答案:

(1) 定義鏈表結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)與算法試題

struct DoubleListNode { char data ; int freq;



DoubleListNode * llink, *rlink ;

};

初始時(shí),所有結(jié)點(diǎn)的freq域的值都為0。

(2) 定義函數(shù)

DoubleListNode * locate ( DoubleListNode *f ; char &x ) { DoubleListNode * p, *q; p = f→rlink;




/*跳過表頭結(jié)點(diǎn)*/

while ( p != NULL && p→data != x ) p = p→rlink; /*搜索*/ if ( p ) {

p→freq ++; q = p→llink;


p→rlink→llink = q; q→rlink = p→rlink; /*從鏈中

摘下p*/

while ( q != f && q→freq < p→freq ) q =q→llink;

p→llink = q;

p→rlink = q→rlink; q→rlink→llink = p;

q→rlink = p; /*在q后面插入p*/

} return p;

}

2、已知A[n]為整數(shù)數(shù)組,試寫出實(shí)現(xiàn)下列運(yùn)算的遞歸算法:

(1) 求數(shù)組A中的最大整數(shù)。


數(shù)據(jù)結(jié)構(gòu)與算法試題

(2) 求n個(gè)整數(shù)的與。


(3) 求n個(gè)整數(shù)的平均值

答案:#include <iostream、h> class RecurveArray{ private: int *Elements; int ArraySize; int CurrentSize; public:

RecurveArray (int MaxSize=10):

ArraySize(MaxSize),Elements(new int[MaxSize]){ } ~ RecurveArray ( ){delete[ ] Elements;} void InputArray( ) ; int Maxkey(int n); int sum(int n); float Average (int n); };

void RecurveArray:: InputArray( ) { cout<<”Input the number of Array :\n”;

for (int i=0;i< ArraySize;i++) cin>> Elements[i]; }

int RecurveArray::Maxkey(int n) { if(n= =1) return Elements[0]; int temp= Maxkey(n-1);

數(shù)據(jù)結(jié)構(gòu)與算法試題

if(Elements[n-1]>temp) return Elements[n-1]; else return temp; }

int RecurveArray::Sum(int n) { if (n= =1) return Elements[0]; else return Elements[n-1]+Sum(n-1); }

float RecurveArray::Average(int n) { if (n= =1) return (float)Elements[0];

else return ((float) Elements[n-1]+(n-1)*Average(n-1))/n; }

int main(int argc, char *argv[ ]){ int size=1;

cout<<”No、of the Elements:”; while (size<1) cin>>size; RecurveArray ra(size); Ra、InputArray( );

Cout<<”\n The max is :”<<ra、maxkey(ra、maxsize)<<end1; cout<<”\n="" the="" sum="" is="" :”<<ra、="" (ra、maxsize)<<end1;="" ave="" :”<<ra、average(ra、maxsize)<<end1;="" return="" 0;="" }="" 3、="" 試編寫一個(gè)函數(shù)計(jì)算n!*2n的值,結(jié)果存放于數(shù)組a[arraysize]的第n個(gè)數(shù)="" 數(shù)據(jù)結(jié)構(gòu)與算法試題="" 組元素中,0="" £="" n="" arraysize。若設(shè)計(jì)算機(jī)中允許的整數(shù)的最大值為maxint,則當(dāng)n=""> arraySize或者對(duì)于某一個(gè)k (0 £ k £ n),使得k!*2k > maxInt時(shí),應(yīng)按出錯(cuò)處理??捎腥缦氯N不同的出錯(cuò)處理方式: (1) 用cerr <<及exit (1)語句來終止執(zhí)行并報(bào)告錯(cuò)誤;


(2) 用返回整數(shù)函數(shù)值0, 1來實(shí)現(xiàn)算法,以區(qū)別就是正常返回還就是錯(cuò)誤返

回;

(3) 在函數(shù)的參數(shù)表設(shè)置一個(gè)引用型的整型變量來區(qū)別就是正常返回還就是

某種錯(cuò)誤返回。


用您認(rèn)為就是最好的方式實(shí)現(xiàn)它。


答案:#include “iostream、h” #define arraySize 100 #define MaxInt 0x7fffffff int calc (int t[ ],int n){ int i,edge=MaxInt/n/2; t[0]=1; if (n!=0) {

for (i=1;i<n;i++){ t[i]="t[i-1]*i*2;" if(t[i]="">edge) return 0; }

t[n]=t[n-1]*n*2; }

cout<<”t[“<<n<<”]=”<<t[n]<<end1; return="" 1;="" 數(shù)據(jù)結(jié)構(gòu)與算法試題="" }="" void="" main()="" {int="" a[arraysize];int="" i;="" for(i="0;i<arraySize;i++)" if(!calc(a,i)="" ){="" cout<<”failed="" at="" ”<<i<<”、”<<end1;="" break;}}="" 4、="" 編寫一個(gè)算法frequency,統(tǒng)計(jì)在一個(gè)輸入字符串中各個(gè)不同字符出現(xiàn)的頻度。用適當(dāng)?shù)臏y(cè)試數(shù)據(jù)來驗(yàn)證這個(gè)算法。="" 答案:="" include="" <iostream、h=""> include”string、h” const int charnumber=128;

void frequency(string&s,int C[ ]){ for(int i=0;i< charnumber;i++) C[i]=0; for( i=0;i< s、length();i++) C[atoi(s[i])]++; for( i=0;i< charnumber;i++)

if(C[i]>0) cout<<”(”<<i<<”):\t”<<c[i]<<”\t”; }="" 測(cè)試數(shù)據(jù)="" s="”cast" cast="" sat="" at="" a="" tasa\0”="" 測(cè)試結(jié)果="" c="" t="" 空格="" 2="" 7="" 4="" 5="" 5、="" 若矩陣am′n中的某一元素a[i][j]就是第i行中的最小值,同時(shí)又就是第j列中的最大值,則稱此元素為該矩陣的一個(gè)鞍點(diǎn)。假設(shè)以二維數(shù)組存放矩陣,試="" 數(shù)據(jù)結(jié)構(gòu)與算法試題="" 編寫一個(gè)函數(shù),確定鞍點(diǎn)在數(shù)組中的位置(若鞍點(diǎn)存在時(shí)),并分析該函數(shù)的時(shí)間復(fù)雜度="" 答案:int="" minmax(int="" a[="" ][="" ],const="" int="" m,const="" n)="" {="" *row="new" [m];="" *col="new" [n];="" i,j;="" for(i="0;i<m;i++){" row[i]="A[i][0];" for(j="1;j<n;j++)" if(a[i][j]<row[i])="" col[i]="A[0][j];" if(a[i][j]="">col[j]) col[j]=A[i][j]; }

for(i=0;i<m;i++){ for(j="0;j<n;j++)" if(row[i]="=col[j])" cout<<”the="" saddle="" point="" is="" :(“<<i<<”,”<<j<<”)”<<end1;="" delete[="" ]row;="" ]col;="" }="" 此算法有3個(gè)并列二重循環(huán),其時(shí)間復(fù)雜度為o(m*n)、="" 6、試編寫一個(gè)函數(shù),將一個(gè)有n個(gè)非零元素的整數(shù)一維數(shù)組a[n]拆分為兩個(gè)一維數(shù)組,使得a[="" ]中大于零的元素存放在b[="" ]中,小于零的元素存放在c[="" ]中。="" 數(shù)據(jù)結(jié)構(gòu)與算法試題="" 答案:="" void="" fenjie(int="" a[],int="" b[],int="" c[],int="" n,int="" &pb,int="" &pc){="" pb="pc=-1;" for(int="" k="0;k<n;k++)" if(a[k]="">0) B[++pb]=A[k]; else C[++pc]=A[k];}

7、已知在一維數(shù)組A[m+n]中依次存放著兩個(gè)順序表(a0, a1, 、、、 am-1,)與(b0, b1, 、、、 bn-1,),試編寫一個(gè)函數(shù),將數(shù)組中兩個(gè)順序表的位置互換,即交(b0, b1, 、、、 bn-1,)放在(a0, a1, 、、、 am-1,)的前面。

答案:#define mpn 20

typedef int DataType;

void inverse(DataType A[ ],int st, int ed); void exchange(DataType A[ ],int m, int n){ inverse(A,0,m+n-1); inverse(A,0,n-1); inverse(A,n,m+n-1); }

void inverse(DataType A[ ],int st, int ed){ int md=(st+ed)/2; for(int i=0;i<md-st;i++) {="" datatype="" temp="A[st+i];" a[st+i]="A[ed-i];" a[ed-i]="temp;}}" 8、="" 設(shè)有一個(gè)表頭指針為h的單鏈表。試設(shè)計(jì)一個(gè)算法,通過遍歷一趟鏈表,將鏈表中所有結(jié)點(diǎn)的鏈接方向逆轉(zhuǎn),如下圖所示。要求逆轉(zhuǎn)結(jié)果鏈表的表頭指針h指向原鏈表的最后一個(gè)結(jié)點(diǎn)。="" 數(shù)據(jù)結(jié)構(gòu)與算法試題


____圖(1)____



答案:templatevoid List ::Inverse(){ if(first==Null) return ;

ListNode*p=first->link,*pr=Null; While(p!=Null){ First->link=pr;

Pr=first;first=p;p=p->link; }

first->link=pr; }




數(shù)據(jù)結(jié)構(gòu)與算法試題數(shù)據(jù)結(jié)構(gòu)與算法試題的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
随州市| 辽阳县| 正镶白旗| 资中县| 林甸县| 南汇区| 石景山区| 松阳县| 福建省| 中西区| 乐陵市| 铁岭县| 淳安县| 班戈县| 敖汉旗| 淳化县| 海宁市| 额敏县| 东丰县| 淮安市| 正宁县| 龙里县| 如东县| 亚东县| 九龙坡区| 任丘市| 翁牛特旗| 望奎县| 陆河县| 崇州市| 崇左市| 咸阳市| 镇康县| 丰镇市| 海兴县| 南溪县| 宣威市| 辰溪县| 田阳县| 秦皇岛市| 肥西县|