1. 程式人生 > >北京理工大學-資料結構期末考試試題(二)

北京理工大學-資料結構期末考試試題(二)

資料結構試卷(二)

一、選擇題(24分)

1.下面關於線性表的敘述錯誤的是(  )。

   (A) 線性表採用順序儲存必須佔用一片連續的儲存空間

(B) 線性表採用鏈式儲存不必佔用一片連續的儲存空間

(C) 線性表採用鏈式儲存便於插入和刪除操作的實現

(D) 線性表採用順序儲存便於插入和刪除操作的實現

2.設哈夫曼樹中的葉子結點總數為m,若用二叉連結串列作為儲存結構,則該哈夫曼樹中總共有(  )個空指標域。

   (A)2m-1         (B) 2m          (C) 2m+1        (D) 4m

3.設順序迴圈佇列Q[0:M-1]的頭指標和尾指標分別為F和R,頭指標F總是指向隊頭元素的前一位置,尾指標R總是指向隊尾元素的當前位置,則該迴圈佇列中的元素個數為(  )。

   (A)R-F          (B) F-R         (C) (R-F+M)%M  (D) (F-R+M)%M

4.設某棵二叉樹的中序遍歷序列為ABCD,前序遍歷序列為CABD,則後序遍歷該二叉樹得到序列為(  )。

   (A)BADC         (B) BCDA        (C) CDAB        (D) CBDA

5.設某完全無向圖中有n個頂點,則該完全無向圖中有(  )條邊。

   (A)n(n-1)/2     (B) n(n-1)      (C) n2

         (D) n2-1

6.設某棵二叉樹中有2000個結點,則該二叉樹的最小高度為(  )。

   (A)9            (B) 10          (C) 11          (D) 12

7.設某有向圖中有n個頂點,則該有向圖對應的鄰接表中有(  )個表頭結點。

   (A)n-1          (B) n           (C) n+1         (D) 2n-1

8.設一組初始記錄關鍵字序列(5,2,6,3,8),以第一個記錄關鍵字5為基準進行一趟快速排序的結果為(  )。

   (A)2,3,5,8,6                                (B)3,2,5,8,6

   (C)3,2,5,6,8                                (D)2,3,6,5,8

 

二、填空題(24分)

1.  為了能有效地應用HASH查詢技術,必須解決的兩個問題是____________________和__________________________。

2.  下面程式段的功能實現資料x進棧,要求在下劃線處填上正確的語句。

typedefstruct {int s[100]; int top;} sqstack;

voidpush(sqstack &stack,int x)

{

if(stack.top==m-1) printf(“overflow”);

else{____________________;_________________;}

}

3.  中序遍歷二叉排序樹所得到的序列是___________序列(填有序或無序)。

4.  快速排序的最壞時間複雜度為___________,平均時間複雜度為__________。

5.  設某棵二叉樹中度數為0的結點數為N0,度數為1的結點數為N1,則該二叉樹中度數為2的結點數為_________;若採用二叉連結串列作為該二叉樹的儲存結構,則該二叉樹中共有_______個空指標域。

6.  設某無向圖中頂點數和邊數分別為n和e,所有頂點的度數之和為d,則e=_______。

7.  設一組初始記錄關鍵字序列為(55,63,44,38,75,80,31,56),則利用篩選法建立的初始堆為___________________________。

8. 已知一有向圖的鄰接表儲存結構如下:從頂點1出發,DFS遍歷的輸出序列是

           ,BFS遍歷的輸出序列是           

 

 

三 應用題(36分)

1. 設一組初始記錄關鍵字序列為(45,80,48,40,22,78),則分別給出第4趟簡單選擇排序和第4趟直接插入排序後的結果。

2. 設指標變數p指向雙向連結串列中結點A,指標變數q指向被插入結點B,要求給出在結點A的後面插入結點B的操作序列(設雙向連結串列中結點的兩個指標域分別為llink和rlink)。

3. 設一組有序的記錄關鍵字序列為(13,18,24,35,47,50,62,83,90),查詢方法用二分查詢,要求計算出查詢關鍵字62時的比較次數並計算出查詢成功時的平均查詢長度。

4. 設一棵樹T中邊的集合為{(A,B),(A,C),(A,D),(B,E),(C,F),(C,G)},要求用孩子兄弟表示法(二叉連結串列)表示出該樹的儲存結構並將該樹轉化成對應的二叉樹。

5. 設有無向圖G,要求給出用普里姆演算法構造最小生成樹所走過的邊的集合。

 

6. 設有一組初始記錄關鍵字為(45,80,48,40,22,78),要求構造一棵二叉排序樹並給出構造過程。

四、演算法設計題(16分)

1.  設有一組初始記錄關鍵字序列(K1,K2,…,Kn),要求設計一個演算法能夠在O(n)的時間複雜度內將線性表劃分成兩部分,其中左半部分的每個關鍵字均小於Ki,右半部分的每個關鍵字均大於等於Ki

2.  設有兩個集合A和集合B,要求設計生成集合C=A∩B的演算法,其中集合A、B和C用鏈式儲存結構表示。

 

參考答案

 

一、選擇題

1.D     2.B     3.C     4.A     5.A     6.C     7.B     8.C

 

二、填空題

1.   構造一個好的HASH函式,確定解決衝突的方法

2.   stack.top++,stack.s[stack.top]=x

3.   有序

4.   O(n2),O(nlog2n)

5.   N0-1,2N0+N1

6.   d/2

7.   (31,38,54,56,75,80,55,63)

8.   (1,3,4,5,2),(1,3,2,4,5)

 

三、應用題

1.   (22,40,45,48,80,78),(40,45,48,80,22,78)

2.       q->llink=p;q->rlink=p->rlink; p->rlink->llink=q; p->rlink=q;

3.   2,ASL=91*1+2*2+3*4+4*2)=25/9

4.   樹的鏈式儲存結構略,二叉樹略

5.       E={(1,3),(1,2),(3,5),(5,6),(6,4)}

6.       略

 

四、演算法設計題

1.  設有一組初始記錄關鍵字序列(K1,K2,…,Kn),要求設計一個演算法能夠在O(n)的時間複雜度內將線性表劃分成兩部分,其中左半部分的每個關鍵字均小於Ki,右半部分的每個關鍵字均大於等於Ki

void quickpass(int r[], int s,int t)

{

 int i=s, j=t, x=r[s];

 while(i<j){

while (i<j &&r[j]>x) j=j-1; if (i<j) {r[i]=r[j];i=i+1;}

    while (i<j && r[i]<x) i=i+1;if (i<j) {r[j]=r[i];j=j-1;}

 }

 r[i]=x;

}

2.     設有兩個集合A和集合B,要求設計生成集合C=A∩B的演算法,其中集合A、B和C用鏈式儲存結構表示。

typedef struct node {int data;struct node *next;}lklist;

void intersection(lklist*ha,lklist *hb,lklist *&hc)

{

lklist *p,*q,*t;

for(p=ha,hc=0;p!=0;p=p->next)

{ for(q=hb;q!=0;q=q->next) if (q->data==p->data) break;

if(q!=0){ t=(lklist*)malloc(sizeof(lklist)); t->data=p->data;t->next=hc; hc=t;}

}

}