當前位置:首頁 » 操作系統 » 數據結構與演算法試題

數據結構與演算法試題

發布時間: 2022-09-09 06:59:49

① 求數據結構試題…重點

這是我們老師要求的重點,即考點。列印出來,背一下就行了,准過!
第一章:緒論
1.1:數據結構課程的任務是:討論數據的各種邏輯結構、在計算機中的存儲結構以及各種操作的演算法設計。

1.2:數據:是客觀描述事物的數字、字元以及所有的能輸入到計算機中並能被計算機接收的各種集合的統稱。

數據元素:表示一個事物的一組數據稱作是一個數據元素,是數據的基本單位。

數據項:是數據元素中有獨立含義的、不可分割的最小標識單位。

數據結構概念包含三個方面:數據的邏輯結構、數據的存儲結構的數據的操作。

1.3數據的邏輯結構指數據元素之間的邏輯關系,用一個數據元素的集合定義在此集合上的若干關系來表示,數據結構可以分為三種:線性結構、樹結構和圖。

1.4:數據元素及其關系在計算機中的存儲表示稱為數據的存儲結構,也稱為物理結構。

數據的存儲結構基本形式有兩種:順序存儲結構和鏈式存儲結構。

2.1:演算法:一個演算法是一個有窮規則的集合,其規則確定一個解決某一特定類型問題的操作序列。演算法規則需滿足以下五個特性:

輸入——演算法有零個或多個輸入數據。
輸出——演算法有一個或多個輸出數據,與輸入數據有某種特定關系。
有窮性——演算法必須在執行又窮步之後結束。
確定性——演算法的每個步驟必須含義明確,無二義性。
可行性——演算法的每步操作必須是基本的,它們的原則上都能夠精確地進行,用筆和紙做有窮次就可以完成。
有窮性和可行性是演算法最重要的兩個特徵。

2.2:演算法與數據結構:演算法建立數據結構之上,對數據結構的操作需用演算法來描述。

演算法設計依賴數據的邏輯結構,演算法實現依賴數據結構的存儲結構。

2.3:演算法的設計應滿足五個目標:

正確性:演算法應確切的滿足應用問題的需求,這是演算法設計的基本目標。
健壯性:即使輸入數據不合適,演算法也能做出適當的處理,不會導致不可控結
高時間效率:演算法的執行時間越短,時間效率越高。 果。
高空間效率:演算法執行時佔用的存儲空間越少,空間效率越高。
可讀性:演算法的可讀性有利於人們對演算法的理解。
2.4:度量演算法的時間效率,時間復雜度,(課本39頁)。

2.5:遞歸定義:即用一個概念本身直接或間接地定義它自己。遞歸定義有兩個條件:

至少有一條初始定義是非遞歸的,如1!=1.
由已知函數值逐步遞推計算出未知函數值,如用(n-1)!定義n!。
第二章:線性表
1.1線性表:線性表是由n(n>=0)個類型相同的數據元素a0,a1,a2,…an-1,組成的有限序列,記作: LinearList = (a0,a1,a2,…an-1)

其中,元素ai可以是整數、浮點數、字元、也可以是對象。n是線性表的元素個數,成為線性表長度。若n=0,則LinearList為空表。若n>0,則a0沒有前驅元素,an-1沒有後繼元素,ai(0<i<n-1)有且僅有一個直接前驅元素ai-1和一個直接後繼元素ai+1。

1.2線性表的順序存儲是用一組連續的內存單元依次存放線性表的數據元素,元素在內存的物理存儲次序與它們在線性表中的邏輯次序相同。

線性表的數據元素數據同一種數據類型,設每個元素佔用c位元組,a0的存儲地址為

Loc(a0),則ai的存儲地址Loc(ai)為:Loc(ai) = Loc(a0)+ i*c

數組是順序存儲的隨機存儲結構,它佔用一組連續的存儲單元,通過下標識別元素,元素地址是下標的線性函數。

1.3:順序表的插入和刪除操作要移動數據元素。平均移動次數是 屬數據表長度的一半。(課本第50頁)

1.4:線性表的鏈式存儲是用若乾地址分散的存儲單元存儲數據元素,邏輯上相鄰的數據元素在物理位置上不一定相鄰,必須採用附加信息表示數據元素之間的順序關系。

它有兩個域組成:數據域和地址域。通常成為節點。(課本第55頁及56頁)

1.5單鏈表(課本56頁)

單鏈表的遍歷:Node<E> p = head; while(p!=null){ 訪問p節點;p = p.next;}

單鏈表的插入和刪除操作非常簡便,只要改變節點間的鏈接關系,不需移動數據元素。

單鏈表的插入操作:1):空表插入/頭插入 2)中間插入/尾插入

if(head == null) Node<E> q = new Node<E>(x);

{ head = new Node<E>(x); q.next = p.next;

}else{ p.next = q;

Node<E> q=new Node<E>(x); 中間插入或尾插入都不會改變單表

q.next = head; 的頭指針head。

head = q;

}

單鏈表的刪除操作:

頭刪除:head = head.next;
中間/尾刪除:if(p.next!=null){ p.next = p.next.next;}
循環單鏈表:如果單鏈表最後一個節點的next鏈保存單鏈表的頭指針head值,則該單鏈表成為環形結構,稱為循環單鏈表。(課本67)

若rear是單鏈表的尾指針,則執行(rear.next=head;)語句,使單鏈表成為一條循環單鏈表。當head.next==head時,循環單鏈表為空。

1.6:雙鏈表結構:雙鏈表的每個結點有兩個鏈域,分別指向它的前驅和後繼結點,

當head.next==null時,雙鏈表為空。

設p指向雙鏈表中非兩端的某個結點,則成立下列關系:p=p.next.prev=p.prev.next。

雙鏈表的插入和刪除:1)插入 2)刪除

q=new DLinkNode(x); p.prev.next = p.next;

q.prev=p.prev;q.next =p; if(p.next=null){

p.prev.next = q;p.prev=q; (p.next).prev = p.prev;}

循環雙鏈表:當head.next==head且head.prev==head時,循環雙鏈表為空。

第三章:棧和隊列
1.1棧:棧是一種特殊的線性表,其中插入和刪除操作只允許在線性表的一端進行。允許操作的一端稱為棧頂,不允許操作的一端稱為棧底。棧有順序棧和鏈式棧。

棧中插入元素的操作稱為入棧,刪除元素的操作稱為出棧。沒有元素的中稱為空棧。

棧的進出棧順序:後進先出,先進後出。(及75頁的思考題)。

1.2:隊列:隊列是一種特殊的線性表,其中插入和刪除操作分別在線性表的兩端進行。

向隊列中插入元素的過程稱為入隊,刪除元素的過程稱為出對,允許入隊的一端稱為隊尾,允許出隊的一端稱為對頭。沒有元素的隊列稱為空隊列。隊列是先進先出。

第四章:串
1.1:串是一種特殊的線性表,其特殊性在於線性表中的每個元素是一個字元。一個串記為: s=「s0s1s2…sn-1」 其中n>=0,s是串名,一對雙引號括起來的字元序列s0s1s2…sn-1是串值,si(i=0,1,2,…n-1)為特定字元集合中的一個字元。一個串中包含的字元個數稱為串的長度。

長度為0的串稱為空串,記作「」,而由一個或多個空格字元構成的字元串稱為空格串。

子串:由串s中任意連續字元組成的一個子序列sub稱為s的子串,s稱為sub的主串。子串的序號是指該子串的第一個字元在主串中的序號。

串比較:兩個串可比較是否相等,也可比較大小。兩個串(子串)相等的充要條件是兩個串(子串)的長度相同,並且各對應位置上的字元也相同。

兩個串的大小由對應位置的第一個不同字元的大小決定,字元比較次序是從頭開始依次向後。當兩個串長度不等而對應位置的字元都相同時,較長的串定義為較「大」。

第五章:數組和廣義表
1.1:數組是一種數據結構,數據元素具有相同的數據類型。一維數組的邏輯結構是線性表,多維數組是線性表的擴展。

1.2:一維數組:一維數組採用順序存儲結構。一個一維數組佔用一組連續的存儲單元。

設數組第一個元素a0的存儲地址為Loc(a0),每個元素佔用c位元組,則數組其他元素ai的存儲地址Loc(ai)為: Loc(ai)= Loc(a0)+i*c

數組通過下標識別元素,元素地址是下標的線性函數。一個下標能夠唯一確定一個元素,所劃給的時間是O(1)。因此數組是隨機存取結構,這是數組最大的優點。

1.3:多維數組的遍歷:有兩種次序:行主序和列主序。

行主序:以行為主序,按行遞增訪問數組元素,訪問完第i行的所有元素之後再訪問第i+1行的元素,同一行上按列遞增訪問數組元素。
a00,a01,…a0(n-1), a10,a11,…a1(n-1),…a(m-1)0,a(m-1)1,…,a(m-1)(n-1)

2)列主序:以列為主序,按列遞增訪問數組元素,訪問完第j列的所有元素之後再訪問第j+1列的元素,同一列上按列遞增訪問數組元素。

多維數組的存儲結構:多維數組也是由多個一維數組組合而成,組合方式有一下兩種。

靜態多維數組的順序存儲結構:可按行主序和列主序進行順序存儲。
按行主序存儲時,元素aij的地址為:Loc(aij)= Loc(a00)+(i*n+j)*c

按列主序存儲時,Loc(aij)= Loc(a00)+(j*m+i)*c

動態多維數組的存儲結構。
二維數組元素地址就是兩個下標的線性函數。無論採用哪種存儲結構,多維數組都是基於一維數組的,因此也只能進行賦值、取值兩種存取操作,不能進行插入,刪除操作。

第六章:

樹是數據元素(結點)之間具有層次關系的非線性結構。在樹結構中,除根以外的結點只有一個直接前驅結點,可以有零至多個直接後繼結點。根沒有前驅結點。

樹是由n(n>=0)個結點組成的有限集合(樹中元素通常稱為結點)。N=0的樹稱為空樹;n>0大的樹T;

@有一個特殊的結點稱為根結點,它只有後繼結點,沒有前驅結點。

@除根結點之外的其他結點分為m(m>=0)個互不相交的集合T0,T1,T3……..,Tm-1,其中每個集合Ti(0<=i<m)本身又是一棵樹,稱為根的子樹。

樹是遞歸定義的。結點是樹大的基本單位,若干個結點組成一棵子樹,若干棵互不相交的子樹組成一棵樹。樹的每個結點都是該樹中某一棵子樹的根。因此,樹是由結點組成的、結點之間具有層次關系大的非線性結構。

結點的前驅結點稱為其父母結點,反之,結點大的後繼結點稱為其孩子結點。一棵樹中,只有根結點沒有父母結點,其他結點有且僅有一個父母結點。

擁有同一個父母結點的多個結點之間稱為兄弟結點。結點的祖先是指從根結點到其父母結點所經過大的所有結點。結點的後代是指該結點的所有孩子結點,以及孩子的孩子等。

結點的度是結點所擁有子樹的棵數。度為0的結點稱為葉子結點,又叫終端結點;樹中除葉子結點之外的其他結點稱為分支結點,又叫非葉子結點或非終端結點。樹的度是指樹中各結點度的最大值。

結點的層次屬性反應結點處於樹中的層次位置。約定根結點的層次為1,其他結點的層次是其父母結點的層次加1。顯然,兄弟結點的層次相同。

樹的高度或深度是樹中結點的最大層次樹。

設樹中x結點是y結點的父母結點,有序對(x,y)稱為連接這兩個結點的分支,也稱為邊。

設(X0,X1,….,Xk-1)是由樹中結點組成的一個序列,且(Xi,Xi+1)(0<=i<k-1)都是樹中的邊,則該序列稱為從X0到Xk-1的一條路徑。路徑長度為路徑上的邊數。

在樹的定義中,結點的子樹T0,T1…..,Tm-1之間沒有次序,可以交換位置,稱為無序樹,簡稱樹。如果結點的子樹T0,T1……,Tm-1從左到右是有次序的,不能交換位置,則 稱該樹為有序樹。

森林是m(m>=0)棵互不相乾的樹的集合。給森林加上一個根結點就變成一棵樹,將樹的根節點刪除就變成森林。

二叉樹的性質1:若根結點的層次為1,則二叉樹第i層最多有2 的i-1次方(i>=1)個結點。

二叉樹的性質2:在高度為k的二叉樹中,最多有2的k次方減一個結點。

二叉樹的性質3:設一棵二叉樹的葉子結點數為n0,2度結點數為n2,則n0=n2+1。

一棵高度為k的滿二叉樹是具有2的k次方減一個結點的二叉樹。滿二叉樹中每一層的結點數目都達到最大值。對滿二叉樹的結點進行連續編號,約定根節點的序號為0,從根節點開始,自上而下,每層自左至右編號。

一棵具有n個結點高度為k的二叉樹,如果他的每個節點都與高度為k的滿二叉樹中序號為0~n-1

的結點一一對應,則這棵二叉樹為為完全二叉樹。

滿二叉樹是完全二叉樹,而完全二叉樹不一定是滿二叉樹。完全二叉樹的第1~k-1層是滿二叉樹第k層不滿,並且該層所有結點必須集中在該層左邊的若干位置上。

二叉樹的性質4:一棵具有n個結點的完全二叉樹,其高度k=log2n的絕對值+1

二叉樹的性質5:一棵具有n個結點的完全二叉樹,對序號為i的結點,有

@若i=0,則i為根節點,無父母結點;若i>0,則i的父母結點的序號為[(i-1)/2]。

@若2i+1<n,則i的左孩子結點序號為2i+1;否則i無左孩子。

@若2i+2<n,則i的右孩子結點的序號為2i+2,否則i無右孩子。

二叉樹的遍歷

二叉樹的遍歷是按照一定規則和次序訪問二叉樹中的所有結點,並且每個結點僅被訪問一次。

二叉樹的三種次序遍歷

1:先根次序;訪問根節點,遍歷左子樹,遍歷右子樹。

2:中根次序;遍歷左子樹,訪問右子樹,遍歷右子樹。

3:後根次序;遍歷左子樹,遍歷右子樹,訪問根節點。

先根次序遍歷時,最先訪問根節點;後根次序遍歷時,最後訪問根節點;中根次序遍歷時,左子樹上的結點在根節點之前訪問,右子樹上的結點在根節點之後訪問。

二叉樹的插入和刪除操作P147

二叉樹的層次遍歷P149

習題P167 6—10,6—19

第七章

圖是由定點集合及頂點間的關系集合組成的一種數據關邊系。頂點之間的關系成為邊。一個圖G記為G=(V,E),V是頂點A的有限集合,E是邊的有限集合。即 V={A|A屬於某個數據元素集合}

E={(A,B)|A,B屬於V}或E={<A,B>|A,B屬於V且Path(A,B)}其中Path(A,B)表示從頂點A到B的一條單向通路,即Path(A,B)是有方向的。

無向圖中的邊事沒有方向,每條邊用兩個頂點的無序對表示。

有向圖中的邊是有方向,每條邊用兩個頂點的有序對表示。

完全圖指圖的邊數達到最大值。n個頂點的完全圖記為Kn。無向完全圖Kn的邊數為n*(n-1)/2,有向完全圖Kn的邊數為n*(n-1)。

子圖:設圖G==(V,E),G』=(V』,E』),若V』包含於V且E』包含於E,則稱圖G』是G的子圖。若G』是G的真子圖。

連通圖:在無向圖G中,若從頂點VI到Vj有路徑,則稱Vi和Vj是聯通的。若圖G中任意一對頂點Vi和Vj(Vi不等於Vj)都是聯通的,則稱G為連通圖。非連通圖的極大聯通子圖稱為該圖的聯通分量。

強連通圖:在有向圖中,若在每一對頂點Vi和Vj(Vi不等於Vj)之間都存在一條從Vi到Vj的路徑,也存在一條從Vi到Vj的路徑,也存在一條從Vi到Vj的路徑,則稱該圖的強連通圖。非強連通圖的極大強連通子圖稱為該圖的強連通圖分量。

圖的遍歷

遍歷圖是指從圖G中任意一個頂點V出發,沿著圖中的邊前行,到達並訪問圖中的所有頂點,且每個頂點僅被訪問一次。遍歷圖要考慮一下三個問題:

@指定遍歷的第一個訪問頂點

@由於一個頂點可能與多個頂點相鄰,因此要在多個鄰接頂點之間約定一種訪問次序。

@由於圖中可能存在迴路,在訪問某個頂點之後,可能沿著某條路徑又回到該頂點。

深度優先搜索

圖的深度優先搜索策略是,訪問某個頂點v,接著尋找v的另一個未被訪問的鄰接頂點w訪問,如此反復執行,走過一條較長路徑到達最遠頂點;若頂點v沒有未被訪問的其他鄰接頂點,則回到前一個被訪問頂點,再尋找其他訪問路徑。

圖的深度優先搜索遍歷演算法P188

聯通的無迴路的無向圖,簡稱樹。樹中的懸掛點又成為樹葉,其他頂點稱為分支點。各連通分量均為樹的圖稱為森林,樹是森林。

由於樹中無迴路,因此樹中必定無自身環也無重邊(否則他有迴路)若去掉樹中的任意一條邊,則變成森林,成為非聯通圖;若給樹加上一條邊,形成圖中的一條迴路,則不是樹。P191

生成樹和生成森林:

一個連通無向圖的生成樹是該圖的一個極小聯通生成子圖,它包含原圖中所有頂點(n個)以及足以構成一棵樹的n-1條邊。

一個非聯通的無向圖,其各連通圖分量的生成圖組成該圖的生成森林。

圖的生成圖或生成森林不是唯一的,從不同頂點開始、採用不同遍歷可以得到不同的生成樹或森林。

在生成樹中,任何樹中,任何兩個頂點之間只有唯一的一條路徑。

第八章

折半查找演算法描述 P206,P207

二叉排序樹及其查找:

二叉排序樹或者是一棵空樹;或者是具有下列性質的二叉樹:

@每個結點都有一個作為查找依據的關鍵字,所有結點的關鍵字互不相同。

@若一個結點的左子樹不空,則左子樹上所有結點的關鍵字均小於這個節點的關鍵字;

@每個結點的左右子樹也分別為二叉排序樹。

在一棵二叉排序樹中,查找值為value的結點,演算法描述如下:

@從根結點開始,設p指向根結點

@將value與p結點的關鍵字進行比較,若兩者相等,則查找成功;若value值較小,則在p的左子樹中繼續查找;若value值較大,則在p的右子樹中繼續查找。

@重復執行上一步,直到查找成功或p為空,若p為空,則查找不成功。

習題 8-6

第九章

直接插入排序演算法描述:p228

冒泡排序演算法的描述:p232

快速排序演算法描述p233

直接選擇排序演算法描述p236

直接選擇排序演算法實現如下:

Public static void selectSort(int[]table){

for(int i=0;i<table.length-1;i++){

int min=I;

for(int j=i+1;j<table.length;j++){

if(table[j]<table[min])

min=j;

if(min!=i){

int temp=table[i];

table[i]==table[min];

table[min]=temp;

}

}

}

}

堆排序是完全二叉樹的應用,是充分利用完全二叉樹特性的一種選擇排序。

堆定義:設n個元素的數據序列{k0,k1,。。。。kn-1},當且僅當滿足下列關系

k1<=k2i+1且ki<=k2i+2 i=0,1,2,3,….,[n/2-1]

或ki>==k2i+1且ki>=2i+2i=0,1,2,3,…..[n/2-1]時,序列{k0,k1…….kn-1}稱為最小堆或最大堆。將最小(大)堆看成是一顆完全二叉樹的層次遍歷序列,則任意一個結點的關鍵字都小於等於(大於等於)它的孩子節點的關鍵字值,由此可知,根結點值最小(大)。根據二叉樹的性質5,完全二叉樹中的第i(0<=i<n)個結點,如果有孩子,則左孩子為第2i+1個結點,右孩子為第2i+2個結點。

希望對你會有所幫助。

② 數據結構與演算法選擇題

1.A
存取任一指定序號,用順序表最方便,在最後進行插入和刪除運算,順序表也可以方便的實現。
2.C
第一個是5,第二個是4,都可以,表示5、4是最後進棧的,之後再要出棧1,不可能
3.D
4.C
5.A
生成樹
6.D
二分查找的前提是該查找必須是順序存儲的有序表
7.C
8.不清楚
9.B
abc,cba正好倒過來。
10.B

③ 求數據結構與演算法分析高人幫忙做下這幾道題目。(希望能給出正確答案,在此謝過!!!)

填空題
1. n-1
因為隊尾指針總是指向空。
2. 1
因為無向圖的鄰接矩陣是對稱的。
3. 61
元素數量=
(rear+max-front) 當front > rear
(front+max-rear) 當rear > front
4. 深度優先搜索演算法

5.

判斷題
1. F
二叉樹就可以用數組存儲。
2. F
當發生沖突時,它要在下一個位置找,但如果該位置已被佔用,仍需要繼續向前。故同

義詞不一定相鄰。
3. F
圖的鄰接矩陣的行列數只取決於頂點數量。
4. F
沒有最快的排序演算法,只有特定條件下的相對較快。
5. T

選擇題
1. D
2. B
Loc(a[6]) = Loc(a[1]) + (6-1)*2
= 90 + 10 =100
3. A
4. C
5. C
進堆排序時,每個元素在最底下的葉子層都有,然後較大的非葉子結點存儲。

6. C
構造一棵二叉樹:
/
* +
A + - F
B C D E
對該二叉樹進行後序遍歷即可。

7. C
折半查找要求查找表有序,並且可以根據下標定位,要求是直接存取。
順序存儲方式:可直接存取,但插入刪除需耗時間
鏈式存儲方式:只能順序存取,插入刪除方便

8. D
二次探測再散列法:
addr(key) = (初始哈希值+di)%表長
di=1、-1、4、-4、9、-9...

addr(15) = 15 % 11 = 4
addr(38) = 38 % 11 = 5
addr(61) = 61 % 11 = 6
addr(84) = 84 % 11 = 7

addr(49) = 49 % 11 = 5 有沖突
addr(49) = (5+1)%14=6 有沖突
addr(49) = (5-1)%14=4 有沖突
addr(49) = (5+4)%14=9

9. D
執行p的後繼指針(next)指向p的直接後繼結點(next)的下一個結點(next)即可

④ 數據結構演算法 試題 急! 試構造下圖的最小生成樹,要求分步給出構造過程。

圖有如下參數:

邊數=8頂點數=5

頂點頂點邊的權值
v1v26
v1v34
v1v42
v2v35
v2v48
v2v56
v3v45
v4v57

用Kruskal(克魯斯卡爾)演算法,求最小生成樹.

先將所有邊的權值按照從小到大排序:

頂點頂點邊的權值
v1v42
v1v34
v2v35
v3v45
v1v26
v2v56
v4v57
v2v48

然後,每次提取權值最小邊,逐步組成最小生成樹:

(1)取最小邊(v1,v4,2)

v1--v4

(2)取邊(v1,v3,4),不會產生環路.

v1--v4
|
|
v3

(3)取邊(v2,v3,5),不會產生環路.

v1--v4
|
|
v3--v2

(4)如果取邊(v3,v4,5),會產生環路,所以不能取.
如果取邊(v1,v2,6),會產生環路,所以不能取.
取邊(v2,v5,6),不會產生環路.

v1--v4
|
|
v3--v2--v5

這就是最小生成樹,連通了所有頂點,總權值最小.

頂點邊的權值
(v1,v4)2
(v1,v3)4
(v2,v3)5
(v2,v5)6


//C語言測試程序

//最小生成樹Kruskal(克魯斯卡爾)演算法
#include"stdio.h"

#defineMAXEDGE20
#defineMAXVEX20
#defineINF65535

typedefstruct
{
intarc[MAXVEX][MAXVEX];
intnumVertexes,numEdges;
}MGraph;

typedefstruct
{
intbegin;
intend;
intweight;
}Edge;//對邊集數組Edge結構的定義

//創建圖
voidCreateMGraph(MGraph*G)
{
inti,j;

G->numEdges=8;//邊數
G->numVertexes=5;//頂點數

for(i=0;i<G->numVertexes;i++)//初始化圖
{
for(j=0;j<G->numVertexes;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=G->arc[j][i]=INF;
}
}

G->arc[0][1]=6;
G->arc[0][2]=4;
G->arc[0][3]=2;
G->arc[1][2]=5;
G->arc[1][3]=8;
G->arc[1][4]=6;
G->arc[2][3]=5;
G->arc[3][4]=7;

for(i=0;i<G->numVertexes;i++)
{
for(j=i;j<G->numVertexes;j++)
{
G->arc[j][i]=G->arc[i][j];
}
}
}

//交換權值以及頭和尾
voidSwapn(Edge*edges,inti,intj)
{
inttemp;
temp=edges[i].begin;
edges[i].begin=edges[j].begin;
edges[j].begin=temp;
temp=edges[i].end;
edges[i].end=edges[j].end;
edges[j].end=temp;
temp=edges[i].weight;
edges[i].weight=edges[j].weight;
edges[j].weight=temp;
}

//對權值進行排序(選擇排序法)
voidsort(Edgeedges[],MGraph*G)
{
inti,j,min;
for(i=0;i<(G->numEdges-1);i++)
{
min=i;
for(j=i+1;j<G->numEdges;j++)
{
if(edges[min].weight>edges[j].weight)
{
min=j;
}
}
if(i!=min)
{
Swapn(edges,i,min);
}
}

printf("邊的權值排序之後: ");
for(i=0;i<G->numEdges;i++)
{
printf("(%d,%d)%d ",edges[i].begin,edges[i].end,edges[i].weight);
}
}

//查找連線頂點的尾部下標
intFind(int*parent,intf)
{
while(parent[f]>0)
{
f=parent[f];
}
returnf;
}

//生成最小生成樹
voidMiniSpanTree_Kruskal(MGraphG)
{
inti,j,n,m;
intk=0;
intparent[MAXVEX];//定義一數組用來判斷邊與邊是否形成環路

Edgeedges[MAXEDGE];//定義邊集數組,edge的結構為begin,end,weight,均為整型

//用來構建邊集數組並排序
for(i=0;i<G.numVertexes-1;i++)
{
for(j=i+1;j<G.numVertexes;j++)
{
if(G.arc[i][j]<INF)
{
edges[k].begin=i;
edges[k].end=j;
edges[k].weight=G.arc[i][j];
k++;
}
}
}
sort(edges,&G);//從小到大排序

for(i=0;i<G.numVertexes;i++)
{
parent[i]=0;
}

printf("列印最小生成樹: ");
for(i=0;i<G.numEdges;i++) //循環每一條邊
{
n=Find(parent,edges[i].begin);
m=Find(parent,edges[i].end);
if(n!=m)//假如n與m不等,說明此邊沒有與現有的生成樹形成環路
{
parent[n]=m; //將此邊的結尾頂點放入下標為起點的parent中
//表示此頂點已經在生成樹集合中
printf("(%d,%d)%d ",edges[i].begin,edges[i].end,edges[i].weight);
}
}
}

intmain(void)
{
MGraphG;
CreateMGraph(&G);
MiniSpanTree_Kruskal(G);
return0;
}

⑤ 請教數據結構與演算法的題 急~~

見圖

⑥ 數據結構與演算法題

數據結構復習
重點是了解數據結構的邏輯結構、存儲結構、數據的運算三方面的概念及相互關系,難點是演算法復雜度的分析方法。
需要達到<識記>層次的基本概念和術語有:數據、數據元素、數據項、數據結構。特別是數據結構的邏輯結構、存儲結構及數據運算的含義及其相互關系。數據結構的兩大類邏輯結構和四種常用的存儲表示方法。
需要達到<領會>層次的內容有演算法、演算法的時間復雜度和空間復雜度、最壞的和平均時間復雜度等概念,演算法描述和演算法分析的方法、對一般的演算法要能分析出時間復雜度。
對於基本概念,仔細看書就能夠理解,這里簡單提一下:
數據就是指能夠被計算機識別、存儲和加工處理的信息的載體。
數據元素是數據的基本單位,有時一個數據元素可以由若干個數據項組成。數據項是具有獨立含義的最小標識單位。如整數這個集合中,10這個數就可稱是一個數據元素.又比如在一個資料庫(關系式資料庫)中,一個記錄可稱為一個數據元素,而這個元素中的某一欄位就是一個數據項。

數據結構的定義雖然沒有標准,但是它包括以下三方面內容:邏輯結構、存儲結構、和對數據的操作。這一段比較重要,我用自己的語言來說明一下,大家看看是不是這樣。

比如一個表(資料庫),我們就稱它為一個數據結構,它由很多記錄(數據元素)組成,每個元素又包括很多欄位(數據項)組成。那麼這張表的邏輯結構是怎麼樣的呢? 我們分析數據結構都是從結點(其實也就是元素、記錄、頂點,雖然在各種情況下所用名字不同,但說的是同一個東東)之間的關系來分析的,對於這個表中的任一個記錄(結點),它只有一個直接前趨,只有一個直接後繼(前趨後繼就是前相鄰後相鄰的意思),整個表只有一個開始結點和一個終端結點,那我們知道了這些關系就能明白這個表的邏輯結構了。

而存儲結構則是指用計算機語言如何表示結點之間的這種關系。如上面的表,在計算機語言中描述為連續存放在一片內存單元中,還是隨機的存放在內存中再用指針把它們鏈接在一起,這兩種表示法就成為兩種不同的存儲結構。(注意,在本課程里,我們只在高級語言的層次上討論存儲結構。)

第三個概念就是對數據的運算,比如一張表格,我們需要進行查找,增加,修改,刪除記錄等工作,而怎麼樣才能進行這樣的操作呢? 這也就是數據的運算,它不僅僅是加減乘除這些算術運算了,在數據結構中,這些運算常常涉及演算法問題

⑦ 數據結構與演算法試題,高分,求答案啊

給你第一題解法吧:後面的實在是不想做。

先根:ABCDEFGHI

中根:CBEDAGFHI

遍歷的基本方法:先左子樹後右子樹。

1,先根遍歷可以確定根節點為A,

2,依據1步,可以在中根遍歷中確定左子樹為:CBED,右為:GFHI

3,在可以重復1,2步。就可以得到結果。

A

BF

CDGH

I

4,O(n^3)+O(1)

⑧ 數據結構與演算法選擇題!

第一題,DFS(深度優先遍歷)是一個遞歸演算法,在遍歷的過程中,先訪問的點被壓入棧底(棧是先進後出),再說:拓撲有序是指如果點U到點V有一條弧,則在拓撲序列中U一定在V之前。深度優先演算法搜索路徑恰恰是一條弧,棧的輸出是從最後一個被訪問點開始輸出,最後一個輸出的點是第一個被訪問的點。所以是逆的拓撲有序序列
第二題:無向圖路徑長度是指兩個頂點之間弧的條數,如果兩頂點路徑長度有2條弧,則有3個頂點例如A——B——C;
第三題:A:極小連通圖是一棵生成樹,只有N-1條邊,但是連通分量可能有N條邊,例如極小連通圖A—— B——C,連通分量「A」——B——C——「A」(這里的最後一個「A」跟第一個「A」一致):;
B:你查下極大強連通子圖概念就明白了;
C:你看看第二題的例子就明白了,AC之間沒有弧,但他們是一個拓撲序列;
D:例如:環形圖就不滿足,比如長方形,四個頂點,兩種遍歷都能訪問到每個頂點,但不是完全圖

⑨ 演算法與數據結構的題目,求一個自己原創的答案

什麼圖書館管理系統,學生信息管理系統,選課、排課系統等其實都是一個樣,無非就是增刪查改。自己動手做一做就能完成的事情。給你一個學生管理系統,可以參考參考,貼不了鏈接,私發給你。

熱點內容
ts代碼編譯成umd 發布:2024-05-06 13:13:38 瀏覽:722
糧庫存儲糧種類 發布:2024-05-06 13:11:26 瀏覽:51
一般網路的dns伺服器是什麼 發布:2024-05-06 13:02:43 瀏覽:152
壓縮模具設計 發布:2024-05-06 13:02:04 瀏覽:561
逍遙模擬器如何配置網路 發布:2024-05-06 12:21:38 瀏覽:982
伺服器如何檢測硬體地址 發布:2024-05-06 12:12:35 瀏覽:738
伺服器在線訪問數由什麼決定 發布:2024-05-06 11:39:15 瀏覽:678
途觀21款哪個配置值得買 發布:2024-05-06 11:29:00 瀏覽:92
pythonspyder 發布:2024-05-06 11:15:53 瀏覽:167
線上伺服器如何資源監控 發布:2024-05-06 11:15:07 瀏覽:299