資料結構複習題(三)
一、選擇題(每題1分,共20分)
1.設某資料結構的二元組形式表示為A=(D,R),D={01,02,03,04,05,06,07,08,09},R={r},r={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<03,07>,<03,08>,<03,09>},則資料結構A是( )。
(A)線性結構 (B) 樹型結構 (C) 物理結構 (D) 圖型結構
2.下面程式的時間複雜為( )
for(i=1,s=0; i<=n; i++) {t=1;for(j=1;j<=i;j++) t=t*j;s=s+t;}
(A)O(n) (B)O(n2) (C)O(n3) (D) O(n4)
3.設指標變數p指向單鏈表中結點A,若刪除單鏈表中結點A,則需要修改指標的操作序列為( )。
(A)q=p->next;p->data=q->data;p->next=q->next;free(q);
(B) q=p->next;q->data=p->data;p->next=q->next;free(q);
(C) q=p->next;p->next=q->next;free(q);
(D)q=p->next;p->data=q->data;free(q);
4.設有n個待排序的記錄關鍵字,則在堆排序中需要( )個輔助記錄單元。
(A)1 (B) n (C) nlog2n (D)n2
5.設一組初始關鍵字記錄關鍵字為(20,15,14,18,21,36,40,10),則以20為基準記錄的一趟快速排序結束後的結果為( )。
(A) 10,15,14,18,20,36,40,21
(B)10,15,14,18,20,40,36,21
(C)10,15,14,20,18,40,36,2l
(D)15,10,14,18,20,36,40,21
6.設二叉排序樹中有n個結點,則在二叉排序樹的平均平均查詢長度為( )。
(A)O(1) (B) O(log2n) (C) (D)O(n2)
7.設無向圖G中有n個頂點e條邊,則其對應的鄰接表中的表頭結點和表結點的個數分別為( )。
(A)n,e (B) e,n (C) 2n,e (D) n,2e
8. 設某強連通圖中有n個頂點,則該強連通圖中至少有( )條邊。
(A)n(n-1) (B) n+1 (C) n (D)n(n+1)
9.設有5000個待排序的記錄關鍵字,如果需要用最快的方法選出其中最小的10個記錄關鍵字,則用下列( )方法可以達到此目的。
(A)快速排序 (B) 堆排序 (C) 歸併排序 (D) 插入排序
10.下列四種排序中( )的空間複雜度最大。
(A)插入排序 (B) 氣泡排序 (C) 堆排序 (D) 歸併排序
二、填空殖(每空1分 共20分)
1. 資料的物理結構主要包括_____________和______________兩種情況。
2. 設一棵完全二叉樹中有500個結點,則該二叉樹的深度為__________;若用二叉連結串列作為該完全二叉樹的儲存結構,則共有___________個空指標域。
3. 設輸入序列為1、2、3,則經過棧的作用後可以得到___________種不同的輸出序列。
4. 設有向圖G用鄰接矩陣A[n][n]作為儲存結構,則該鄰接矩陣中第i行上所有元素之和等於頂點i的________,第i列上所有元素之和等於頂點i的________。
5. 設哈夫曼樹中共有n個結點,則該哈夫曼樹中有________個度數為1的結點。
6. 設有向圖G中有n個頂點e條有向邊,所有的頂點入度數之和為d,則e和d的關係為_________。
7. __________遍歷二叉排序樹中的結點可以得到一個遞增的關鍵字序列(填先序、中序或後序)。
8. 設查詢表中有100個元素,如果用二分法查詢方法查詢資料元素X,則最多需要比較________次就可以斷定資料元素X是否在查詢表中。
9. 不論是順序儲存結構的棧還是鏈式儲存結構的棧,其入棧和出棧操作的時間複雜度均為____________。
10. 設有n個結點的完全二叉樹,如果按照從自上到下、從左到右從1開始順序編號,則第i個結點的雙親結點編號為____________,右孩子結點的編號為___________。
11. 設一組初始記錄關鍵字為(72,73,71,23,94,16,5),則以記錄關鍵字72為基準的一趟快速排序結果為___________________________。
12. 設有向圖G中有向邊的集合E={<1,2>,<2,3>,<1,4>,<4,2>,<4,3>},則該圖的一種拓撲序列為____________________。
13. 下列演算法實現在順序散列表中查詢值為x的關鍵字,請在下劃線處填上正確的語句。
structrecord{int key; int others;};
inthashsqsearch(struct record hashtable[ ],int k)
{
inti,j; j=i=k % p;
while(hashtable[j].key!=k&&hashtable[j].flag!=0){j=(____) %m; if (i==j)return(-1);}
if (_______________________ ) return(j); elsereturn(-1);
}
14. 下列演算法實現在二叉排序樹上查詢關鍵值k,請在下劃線處填上正確的語句。
typedefstruct node{int key; struct node *lchild; struct node *rchild;}bitree;
bitree *bstsearch(bitree *t, int k)
{
if (t==0 ) return(0);else while (t!=0)
if (t->key==k)_____________; elseif (t->key>k) t=t->lchild; else_____________;
}
三、計算題(每題10分,共30分)
1.已知二叉樹的前序遍歷序列是AEFBGCDHIKJ,中序遍歷序列是EFAGBCHKIJD,畫出此二叉樹,並畫出它的後序線索二叉樹。
2.已知待雜湊的線性表為(36,15,40,63,22),雜湊用的一維地址空間為[0..6],假定選用的雜湊函式是H(K)= K mod 7,若發生衝突採用線性探查法處理,試:
(1)計算出每一個元素的雜湊地址並在下圖中填寫出散列表:
` 0 1 2 3 4 5 6
(2)求出在查詢每一個元素概率相等情況下的平均查詢長度。
3.已知序列(10,18,4,3,6,12,1,9,18,8)請用快速排序寫出每一趟排序的結果。
四、演算法設計題(每題15分,共30分)
1. 設計在單鏈表中刪除值相同的多餘結點的演算法。
2. 設計一個求結點x在二叉樹中的雙親結點演算法。
參考答案
一、選擇題
1.B 2.B 3.A 4.A 5.A
6.B 7.D 8.C 9.B 10.D
第3小題分析:首先用指標變數q指向結點A的後繼結點B,然後將結點B的值複製到結點A中,最後刪除結點B。
第9小題分析:9快速排序、歸併排序和插入排序必須等到整個排序結束後才能夠求出最小的10個數,而堆排序只需要在初始堆的基礎上再進行10次篩選即可,每次篩選的時間複雜度為O(log2n)。
二、填空題
1. 順序儲存結構、鏈式儲存結構
2. 9,501
3. 5
4. 出度,入度
5. 0
6. e=d
7. 中序
8. 7
9. O(1)
10. i/2,2i+1
11. (5,16,71,23,72,94,73)
12. (1,4,3,2)
13. j+1,hashtable[j].key==k
14. return(t),t=t->rchild
第8小題分析:二分查詢的過程可以用一棵二叉樹來描述,該二叉樹稱為二叉判定樹。在有序表上進行二分查詢時的查詢長度不超過二叉判定樹的高度1+log2n。
三、計算題
1.
2、H(36)=36 mod 7=1; H1(22)=(1+1)mod 7=2; ….衝突
H(15)=15 mod7=1;….衝突 H2(22)=(2+1) mod7=3;
H1(15)=(1+1)mod 7=2;
H(40)=40 mod 7=5;
H(63)=63 mod 7=0;
H(22)=22 mod 7=1; ….衝突
(1) 0 1 2 3 4 5 6
63 |
36 |
15 |
22 |
40 |
(2)ASL=
3、(8,9,4,3,6,1),10,(12,18,18)
(1,6,4,3),8,(9),10,12,(18,18)
1,(3,4,6),8,9,10,12,18,(18)
1,3,(4,6),8,9,10,12,18,18
1,3, 4,6,8,9,10,12,18,18
四、演算法設計題
1. 設計在單鏈表中刪除值相同的多餘結點的演算法。
typedefint datatype;
typedefstruct node {datatype data; struct node *next;}lklist;
voiddelredundant(lklist *&head)
{
lklist *p,*q,*s;
for(p=head;p!=0;p=p->next)
{
for(q=p->next,s=q;q!=0; )
if (q->data==p->data){s->next=q->next; free(q);q=s->next;}
else {s=q,q=q->next;}
}
}
2. 設計一個求結點x在二叉樹中的雙親結點演算法。
typedefstruct node {datatype data; struct node *lchild,*rchild;} bitree;
bitree*q[20]; int r=0,f=0,flag=0;
voidpreorder(bitree *bt, char x)
{
if (bt!=0 && flag==0)
if(bt->data==x) { flag=1; return;}
else{r=(r+1)% 20; q[r]=bt; preorder(bt->lchild,x); preorder(bt->rchild,x); }
}
voidparent(bitree *bt,char x)
{
int i;
preorder(bt,x);
for(i=f+1; i<=r; i++) if(q[i]->lchild->data==x || q[i]->rchild->data) break;
if (flag==0) printf("not foundx\n");
else if (i<=r)printf("%c",bt->data); else printf("not parent");
}