數據結構試題集(包含答案)_第1頁
數據結構試題集(包含答案)_第2頁
數據結構試題集(包含答案)_第3頁
數據結構試題集(包含答案)_第4頁
數據結構試題集(包含答案)_第5頁
已閱讀5頁,還剩72頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第一章概論

一、選擇題

1、研究數據結構就是研究(D)0

A.數據的邏輯結構B.數據的存儲結構

C.數據的邏輯結構和存儲結構D.數據的邏輯結構、存儲結構

及其基本操作

2、算法分析的兩個主要方面是(A)o

A.空間復雜度和時間復雜度B.正確性和簡單性C.可

讀性和文檔性D.數據復雜性和程序復雜性

3、具有線性結構的數據結構是(D)。

A.圖B.樹C.廣義表D.棧

4、計算機中的算法指的是解決某一個問題的有限運算序列,它必須具備

輸入、輸出、(B)等5個特性。

A.可執行性、可移植性和可擴充性B.可執行性、有窮性和

確定性

C.確定性、有窮性和穩定性D.易讀性、穩定性和確定

5、下面程序段的時間復雜度是(C)。

for(i=0;i<m;i++)

for(j=0;j<n;j++)

a[i][j]=i*j;

A.0(m2)B.0(n2)C.O(m*n)D.

O(m+n)

6、算法是(D)0

A.計算機程序B.解決問題的計算方法C.排

序算法D.解決問題的有限運算序列

7、某算法的語句執行頻度為(3n+n1og2n+n2+8),其時間復雜度表示

(C)o

A.0(n)B.0(nlog2n)C.0(n2)

D.O(log2n)

8、下面程序段的時間復雜度為(C)o

i=l;

while(i<=n)

i=i*3;

A.O(n)B.O(3n)C.O(log3n)D.

O(n3)

9、數據結構是一門研究非數值計算的程序設計問題中計算機的數據元素

以及它們之間的()和運算等的學科。

A.結構B,關系C.運算D.算法

10.下面程序段的時間復雜度是(A工

i=s=0;

while(s<n){

i++;s+=i;

)

2

A.0(n)B.0(n)C.O(log2n)D.

O(n3)

11、抽象數據類型的三個組成部分分別為(A)o

A.數據對象、數據關系和基本操作B.數據元素、邏輯

結構和存儲結構

C.數據項、數據元素和數據類型D.數據元素、數據結構

和數據類型

12、通常從正確性、易讀性、健壯性、高效性等4個方面評價算法的質量,

以下解釋錯誤的是()。

A.正確性算法應能正確地實現預定的功能

B.易讀性算法應易于閱讀和理解,以便調試、修改和擴充

C.健壯性當環境發生變化時,算法能適當地做出反應或進行處理,

不會產生不需要的運行結果

D.高效性即達到所需要的時間性能

13、下列程序段的時間復雜度為(B)0

x=n;y=0;

while(x>=(y+1)*(y+1))

y=y+l;

A.0(n)B.0(加C.0(1)D.0(n2)

二、填空題

1、程序段"i=l;while(i<=n)的時間復雜度為

2、數據結構的四種基本類型中,樹形結構的元素是一對多關

系。

三、綜合題

23N

1、將數量級0(1),0(N),0(N),0(N),0(NL0G2N),0(L0G2N),0(2)

按增長率由小到大排序。

23N

答案:0(1)O(log2N)O(N)O(Nlog2N)O(N)O(N)0(2)

第二章線性表

一、選擇題

1、若長度為n的線性表采用順序存儲結構,在其第i個位置插入一個新

元素算法的時間復雜度()o

2

A.0(log2n)B.0(l)C.0(n)D.0(n)

2、若一個線性表中最常用的操作是取第i個元素和找第i個元素的前趨

元素,則采用()存儲方式最節省時間。

A.順序表B.單鏈表C.雙鏈表D.單

循環鏈表

3、具有線性結構的數據結構是()o

A.圖B.樹C.廣義表D.棧

4、在一個長度為n的順序表中,在第i個元素之前插入一個新元素時,

需向后移動()個元素。

A.n-iB.n-i+1C.n-i-1D.i

5、非空的循環單鏈表head的尾結點p滿足()o

A.p->next==headB.p->next==NULL

C?p==NULLD.p==head

6、鏈表不具有的特點是()o

A.可隨機訪問任一元素B.插入刪除不需要移動元素

C.不必事先估計存儲空間D.所需空間與線性表長度成正比

7、在雙向循環鏈表中,在p指針所指的結點后插入一個指針q所指向的新

結點,修改指針的操作是()。

A.

p->next=q;q->prior=p;p->next->prior=q;q->next=q;

B.

p->next=q;p->next->prior=q;q->prior=p;q->next=p->nex

t;

C.

q->prior=p;q->next=p->next;p->next->prior=q;p->next=

q;

D.q->next=p->next;q->prior=p;p->next=q;p->next=q;

8、線性表采用鏈式存儲時,結點的存儲地址()o

A.必須是連續的B.必須是不連續的

C.連續與否均可D.和頭結點的存儲地址相連續

9、在一個長度為n的順序表中刪除第i個元素,需要向前移動()個

元素。

A.n-iB.n-i+1C.n-i-1D.

i+1

10、線性表是n個()的有限序列。

A.表兀素B.字符C.數據元素D.數

據項

11、從表中任一結點出發,都能掃描整個表的是()o

A.單鏈表B.順序表C.循環鏈表D.

靜態鏈表

12、在具有n個結點的單鏈表上查找值為x的元素時,其時間復雜度為

()o

A.0(n)B.0(1)C.0(n2)D.0(n-l)

13、線性表L=(al,a2,...,an),下列說法正確的是(

A.每個元素都有一個直接前驅和一個直接后繼

B.線性表中至少要有一個元素

C.表中諸元素的排列順序必須是由小到大或由大到小

D.除第一個和最后一個元素外,其余每個元素都由一個且僅有一個

直接前驅和直接后繼

14、一個順序表的第一個元素的存儲地址是90,每個元素的長度為2,

則第6個元素的存儲地址是()o

A.98B.100C.102D.106

15、在線性表的下列存儲結構中,讀取元素花費的時間最少的是()。

A.單鏈表B.雙鏈表C.循環鏈表D.順

序表

16、在一個單鏈表中,若刪除p所指向結點的后續結點,則執行()o

A.p->next=p->next->next;

B,p=p->next;p->next=p->next->next;

C.p=p->next;

D,p=p->next->next;

;、將長度為n的單鏈表連接在長度為m的單鏈表之后的算法的時間復雜

度為()o

A.0(1)B,0(n)C.0(m)D.0(m+n)

18、線性表的順序存儲結構是一種()存儲結構。

A.隨機存取B.順序存取C.索引存取D.散列存取

19、順序表中,插入一個元素所需移動的元素平均數是()o

A.(n-1)/2B.nC.n+1D.(n+1)/2

10>循環鏈表的主要優點是()o

A.不再需要頭指針B.已知某結點位置后能容易找到其

直接前驅

C.在進行插入、刪除運算時能保證鏈表不斷開

D.在表中任一結點出發都能掃描整個鏈表

11、不帶頭結點的單鏈表head為空的判定條件是(A)o

A.head==NULLB.

head->next==NULL

C.head->next==headD.head!=NULL

答案B是帶頭結點的

12、在下列對順序表進行的操作中,算法時間復雜度為0(1)的是()o

A.訪問第i個元素的前驅(l<i<n)B.在第i個元素之后插入

一個新元素(iKiVn)

C.刪除第i個元素(l?i<n)D.對順序表中元素進行排序

答案是A.

假設順序表L,長度為n,求第i個節點L[i],直接前驅L[i-1],因此為0

(1)

答案B需要移動n-i+l個節點,因此為0(n)

答案C也需要移動n-i個節點

答案D根據排序方法不同最慢0(rT2),最快O(nlogn)

13、已知指針p和q分別指向某單鏈表中第一個結點和最后一個結點。假

設指針s指向另一個單鏈表中某個結點,則在s所指結點之后插入上述鏈

表應執行的語句為()o

A.q->next=s->next;s->next=p;

B.s->next=p;q->next=s->next;

C.p->next=s->next;s->next=q;

D.s->next=q;p->next=s->next;

14、在以下的敘述中,正確的是()o

A.線性表的順序存儲結構優于鏈表存儲結構

B.線性表的順序存儲結構適用于頻繁插入/刪除數據元素的情況

C.線性表的鏈表存儲結構適用于頻繁插入/刪除數據元素的情況

D.線性表的鏈表存儲結構優于順序存儲結構

15、在表長為n的順序表中,當在任何位置刪除一個元素的概率相同時,

刪除一個元素所需移動的平均個數為()。

A.(n-l)/2B.n/2C.(n+l)/2

D.n

16、在一個單鏈表中,已知q所指結點是p所指結點的前驅結點,若在q

和p之間插入一個結點s,則執行()o

A.s->next=p->next;p->next=s;

B.p->next=s->next;s->next=p;

C.q->next=s;s->next=p;

D.p->next=s;s->next=q;

17、在單鏈表中,指針p指向元素為*的結點,實現刪除x的后繼的語句是

()o

A.p=p->next;B.p->next=p->next->next;

C.p->next=p;D.p=p->next->next;

18、在頭指針為head且表長大于1的單循環鏈表中,指針p指向表中某個

結點,^p->next->next==head,則()。

A.p指向頭結點B.p指向尾結點C.p的直接后繼是

頭結點

D.p的直接后繼是尾結點

二、填空題

1、設單鏈表的結點結構為(data,next)。已知指針p指向單鏈表中的

結點,q指向新結點,欲將q插入到p結點之后,則需要執行的語

句:;O

答案:q->next=p->nextp->next=q

2、線性表的邏輯結構是,其所含元素的個數稱為線性表

的o

答案:線性結構長度

3、寫出帶頭結點的雙向循環鏈表L為空表的條件o

答案:L->prior==L->next==L

4、帶頭結點的單鏈表head為空的條件是o

答案:head->next==NULL

5、在一個單鏈表中刪除p所指結點的后繼結點時,應執行以下操作:

q=p->next;

p->next=__q->next;

三、判斷題

1、單鏈表不是一種隨機存儲結構。/

2、在具有頭結點的單鏈表中,頭指針指向鏈表的第一個數據結點。x

3、用循環單鏈表表示的鏈隊列中,可以不設隊頭指針,僅在隊尾設置隊

尾指針。/

4、順序存儲方式只能用于存儲線性結構。x

5、在線性表的順序存儲結構中,邏輯上相鄰的兩個元素但是在物理位置

上不一定是相鄰的c又

6、鏈式存儲的線性表可以隨機存取。X

四、程序分析填空題

1、函數GetElem實現返回單鏈表的第i個元素,請在空格處將算法補充

完整。

intGetElem(LinkListLzinti,Elemtype*e){

LinkListp;intj;

p=L->next;j=l;

while(p&&j<i){

(1);++i;

)

if(!p||j>i)returnERROR;

*e=(2);

returnOK;

)

答案:(l)p=p->next(2)p->data

2、函數實現單鏈表的插入算法,請在空格處將算法補充完整。

intListinsert(LinkListL,intizElemTypee){

LNode*p,*s;intj;

p=L;j=0;

while((p!=NULL)&&(j<i-l)){

p=p->next;j++;

}

if(p==NULL||j>i-l)returnERROR;

s=(LNode*)malloc(sizeof(LNode));

s->data=e;

(1)_____________;

(2)_____________;

returnOK;

}/*ListInsert*/

答案:(1)s->next=p->next(2)p->next=s

3、函數ListDele七e_sq實現順序表刪除算法,請在空格處將算法補充

完整。

intListDelete_sq(Sqlist*L,inti){

intk;

if(i<l||i>L->length)returnERROR;

for(k=i-l;k<L->length-l;k++)

L->slist[k]=(1);

⑵;

returnOK;

)

答案:(1)L->slist[k+l](2)-L->Length

4、函數實現單鏈表的刪除算法,請在空格處將算法補充完整。

intListDelete(LinkListL,inti,ElemType*s){

LNode*pA*q;

intj;

p=L;j=0;

while(((1))&&){

p=p->next;j++;

)

if(p->next==NULL||j>i-l)returnERROR;

q=p->next;

(2)___________;

*s=q->data;

free(q);

returnOK;

}/*listDelete*/

答案:(1)p->next!=NULL(2)p->next=q->next

5、寫出算法的功能。

intL(head){

node*head;

intn=0;

node*p;

p=head;

while(p!=NULL)

{p=p->next;

n++;

)

return(n);

}

答案:求單鏈表head的長度

五、綜合題

1、編寫算法,實現帶頭結點單鏈表的逆置算法。

答案:voidinvent(Lnode*head)

{Lnode*p,*q;

if(!head->next)returnERROR;

p=head->next;q=p->next;p->next=NULL;

while(q)

{p=q;q=q->next;p->next=head->next;head->next=p;}

2、有兩個循環鏈表,鏈頭指針分別為LI和L2,要求寫出算法將L2鏈

表鏈到L1鏈表之后,且連接后仍保持循環鏈表形式。

答案:voidmerge(Lnode*L1,Lnode*L2)

{Lnode*p,*q;

while(p->next!=Ll)

p=p->next;

while(q->next!=L2)

q=q->next;

q->next=Ll;p->next=L2;

)

3、設一個帶頭結點的單向鏈表的頭指針為head,設計算法,將鏈表的記

錄,按照data域的值遞增排序。

答案:voidassending(Lnode*head)

{Lnode*p,*q,*r,*s;

p=head->next;q=p->next;p->next=NULL;

while(q)

{r=q;q=q->next;

if(r->data<=p->data)

{r->next=p;head->next=r;p=r;}

else

{while(!p&&r->data>p->data)

{s=p;p=p->next;}

r->next=p;s->next=r;}

p=head->next;}

4、編寫算法,將一個頭指針為head不帶頭結點的單鏈表改造為一個單向

循環鏈表,并分析算法的時間復雜度。

答案:

voidlinklist_c(Lnode*head)

{Lnode*p;p=head;

if(!p)returnERROR;

while(p->next!=NULL)

p=p->next;

p->next=head;

設單鏈表的長度(數據結點數)為N,則該算法的時間主要花費在查找鏈

表最后一個結點上(算法中的while循環),所以該算法的時間復雜度

為。(N)o

5、已知head為帶頭結點的單循環鏈表的頭指針,鏈表中的數據元素依

次為(al,a2,a3,a4,…,an),A為指向空的順序表的指針。閱讀以下

程序段,并回答問題:

(1)寫出執行下列程序段后的順序表A中的數據元素;

(2)簡要敘述該程序段的功能。

if(head->next!=head)

(

p=head->next;

A->length=O;

while(p->next!=head)

(

p=p->next;

A->data[A->length++]=p->data;

if(p->next!=head)p=p->next;

)

}

答案:

(1)(a2,a4,…,)(2)將循環單鏈表中偶數結點位置的元素值寫

入順序表A

6、設順序表va中的數據元數遞增有序。試寫一算法,將x插入到順序

表的適當位置上,以保持該表的有序性。

答案:

voidInsert_sq(Sqlistva[],Elemiypex)

{inti,j,n;

n=length(va[]);

if(x>=va[i])

va[n]=x;

else

{i=0;

while(x>va[i])i++;

for(j=n-l;j>=I;j?)

va[j+l]=va[j];

va[i]=x;}

n++;

}

7、假設線性表采用順序存儲結構,表中元素值為整型。閱讀算法£2,設

順序表L=(3,7,3,2,1,1,8,7,3),寫出執行算法£2后的線性表L的數

據元素,并描述該算法的功能。

voidf2(SeqList*L){

inti,j,k;

k=0;

for(i=O;i<L->length;i++){

for(j=0;j<k&&L->data[i]?=L->data[j];j++);

if(j==k){

if(k!=i)L->data[k]=L->data[i];

k++;

}

}

L->length=k;

)

答案:

(3,7,2,1,8)刪除順序表中重復的元素

8、已知線性表中的元素以值遞增有序排列,并以單鏈表作存儲結構。試

寫一算法,刪除表中所有大于x且小于y的元素(若表中存在這樣的元

素)同時釋放被刪除結點空間。

答案:

voidDelete_list(Lnode*head,ElemTypex,ElemTypey)

{Lnode*p,*q;

if(!head)returnERROR;

p=head;q=p;

while(!p)

{if(p->data>x)&&(p->data<y)}i++;

if(p==head)

{head=p->next;free(p);

p=head;q=p;}

else

{q->next=p->next;free(p);

p=q->next;}

else

{q=P;p=p->next;}

9、在帶頭結點的循環鏈表L中,結點的數據元素為整型,且按值遞增有

序存放。給定兩個整數a和b,且a<b,編寫算法刪除鏈表L中元素值大

于a且小于b的所有結點。

第三章棧和隊列

一、選擇題

1、一個棧的輸入序列為:a,b,c,d,e,則棧的不可能輸出的序列是

A.a,b,c,d,eB.d,e,c,b,a

C.d,c,e,a,bD.e,d,c,b,a

2、判斷一個循環隊列Q(最多n個元素)為滿的條件是()。

A.Q->rear==Q->frontB.

Q->rear==Q->front+l

C.Q->front==(Q->rear+l)%nD.

Q->front==(Q->rear-l)%n

3、設計一個判別表達式中括號是否配對的算法,采用()數據結構

最佳。

A.順序表B.鏈表C.隊列D.棧

4、帶頭結點的單鏈表head為空的判定條件是()。

A.head==NULLB.head->next==NULL

C.head->next!=NULLD.head!=NULL

5、一個棧的輸入序列為:1,2,3,4,則棧的不可能輸出的序列是()o

A.1243B.2134C.1432D.4312

E.3214

6、若用一個大小為6的數組來實現循環隊列,且當rear和front的值分

別為0,3o當從隊列中刪除一個元素,再加入兩個元素后,rear和front

的值分別為()c

A.1和5B.2和4C.4和2D.5

和1

7、隊列的插入操作是在(

A.隊尾B.隊頭C.隊列任意位置D.隊

頭元素后

8、循環隊列的隊頭和隊尾指針分別為t和rear,則判斷循環隊列

為空的條件是()o

A.front==rearB.front==0

C.rear==OD.front=rear+l

9、一個順序棧S,其棧頂指針為top,則將元素e入棧的操作是()o

A.*S->top=e;S->top++;B.

S->top++;*S->top=e;

C.*S->top=eD.S->top=e;

10、表達式a*(b+c)-d的后綴表達式是()o

A.abcd+-B.abc+*d-C.abc*+d-D.

-+*abcd

11、將遞歸算法轉換成對應的非遞歸算法時,通常需要使用()來保

存中間結果。

A.隊列B.棧C.鏈表D.樹

12、棧的插入和刪除操作在()0

A.棧底B.棧頂C.任意位置D.

指定位置

13、五節車廂以編號1,2,3,4,5順序進入鐵路調度站(棧),可以得

到()的編組。

A.3,4,5,1,2B.2,4,1,3,5

C.3,5,4,2,1D.1,3,5,2,4

14、判定一個順序棧S(棧空間大小為n)為空的條件是()o

A.S->top==0B.S->top!=0

C.S->top==nD.S->top!=n

15、在一個鏈隊列中,front和rear分別為頭指針和尾指針,則插入一

個結點s的操作為()o

A.front=front->nextB.s->next=rear;rear=s

C.rear->next=s;rear=s;D.

s->next=front;front=s;

16、一個隊列的入隊序列是1,2,3,4,則隊列的出隊序列是()。

A.1,2,3,4B.4,3,2,1

C.1,4,3,2D.3,4,1,2

17、依次在初始為空的隊列中插入元素a,b,c,d以后,緊接著做了兩次

刪除操作,此時的隊頭元素是()o

A.aB.bC.cD.d

18、正常情況下,刪除非空的順序存儲結構的堆棧的棧頂元素,棧頂指

針top的變化是()o

A.top不變B.top=0C.top=top+lD.

top=top-l

19、判斷一個循環隊列Q(空間大小為M)為空的條件是()。

A.Q->front==Q->rearB.

Q->rear-Q->front-l==M

C.Q->front+l=Q->rearD.

Q->rear+l=Q->front

20、設計一個判別表達式中左右括號是否配對出現的算法,采用()

數據結構最佳。

A.線性表的順序存儲結構B.隊列C.棧D.線性

表的鏈式存儲結構

21、當用大小為N的數組存儲順序循環隊列時,該隊列的最大長度為

()o

A.NB.N+lC.N-lD.N-2

22、隊列的刪除操作是在()o

A.隊首B.隊尾C.隊前D.隊后

23、若讓元素L2,3依次進棧,則出棧次序不可能是()o

A.3,2,1B.2,1,3C.3,1,2D.1,3,

2

24、循環隊列用數組A[0,m-l]存放其元素值,已知其頭尾指針分別是

front和rear,則當前隊列中的元素個數是()。

A.(rear-front+m)%mB.rear-front+1

C.rear-front-1D.rear-front

25、在解決計算機主機和打印機之間速度不匹配問題時,通常設置一個

打印數據緩沖區,主機將要輸出的數據依次寫入該緩沖區,而打印機則

從該緩沖區中取走數據打印。該緩沖區應該是一個()結構。

A.堆棧B.隊列C.數組D.線性表

26、棧和隊列都是(

A.鏈式存儲的線性結構B.鏈式存儲的非線性結構

C.限制存取點的線性結構D.限制存取點的非線性結構

27、在一個鏈隊列中,假定front和rear分別為隊頭指針和隊尾指針,刪

除一個結點的操作是()o

A.front=front->nextB.rear=rear->next

C?rear->next=frontD?front->next=rear

28、隊和棧的主要區別是()o

A.邏輯結構不同B.存儲結構不同

C.所包含的運算個數不同D.限定插入和刪除的位置

不同

二、填空題

1、設棧S和隊列Q的初始狀態為空,元素81,62,03,?4,05,06依次通

過棧S,一個元素出棧后即進入隊列Q,若6個元素出隊的序列是

e2,e4,e3,e6,e5,el,則棧的容量至少應該是。

答案:3

2、一個循環隊列Q的存儲空間大小為M,其隊頭和隊尾指針分別為front

和rear,則循環隊列中元素的個數為:。

答案:(rear-front+M)%M

3、在具有n個元素的循環隊列中,隊滿時具有個元素。

答案:n-1

4、設循環隊列的容量為70,現經過一系列的入隊和出隊操作后,front

為20,rear為",則隊列中元素的個數為。

答案:61

5、已知循環隊列的存儲空間大小為20,且當前隊列的頭指針和尾指針的

值分別為8和3,且該隊列的當前的長度為o

三、判斷題

1、棧和隊列都是受限的線性結構。/

2、在單鏈表中,要訪問某個結點,只要知道該結點的地址即可;因此,

單鏈表是一種隨機存取結構。乂

3、以鏈表作為棧的存儲結構,出棧操作必須判別棧空的情況。,

四、程序分析填空題

1、已知棧的基本操作函數:

intInitStack(SqStack*S);〃構造空棧

intStackEmpty(SqStack*S);//判斷棧空

intPush(SqStack*SrElemTypee);//入棧

intPop(SqStack*SzElemType*e);//出棧

函數conversion實現十進制數轉換為八進制數,請將函數補充完整。

voidconversion(){

InitStack(S);

scanf(、'%d〃,&N);

while(N){

(1);

N=N/8;

)

while((2)){

Pop(S,&e);

printf(x'%dz\e);

)

}//conversion

答案:(1)Push⑸N%8)(2)IStackEmpty(S)

2、寫出算法的功能。

intfunction(SqQueue*Q,ElemType*e){

if(Q->front==Q->rear)

returnERROR;

*e=Q->base[Q->front];

Q->front=(Q->front+l)%MAXSIZE;

returnOK;

)

3、閱讀算法£2,并回答下列問題:

(1)設隊列Q=(1,3,5,2,4,6)0寫出執行算法£2后的隊列Q;

(2)簡述算法£2的功能。

voidf2(Queue*Q){

DataTypee;

if(!QueueEmpty(Q)){

e=DeQueue(Q);

EnQueue(Q,e);

答案:(1)6,425,3,1(2)將隊列倒置

五、綜合題

1、假設以帶頭結點的循環鏈表表示隊列,并且只設一個指針指向隊尾結

點,但不設頭指針,請寫出相應的入隊列算法(用函數實現)。

答案:voidEnQueue(Lnode*rear,ElemTypee)

{Lnode*new;

New=(Lnode*)malloc(sizeof(Lnode));

If(!new)returnERROR;

new->data=e;nevv->next=rear->next;

rear->next=new;rear=new;

2、已知Q是一個非空隊列,S是一個空棧。編寫算法,僅用隊列和棧的

ADT函數和少量工作變量,將隊列Q的所有元素逆置。

棧的ADT函數有:

voidmakeEmpty(SqStacks);置空棧

voidpush(SqStackszElemTypee);元素e入棧

ElemTypepop(SqStacks);出棧,返回棧頂元素

intisEmpty(SqStacks);判斷棧空

隊列的ADT函數有:

voidenQueue(QueueqzElemTypee);元素e入隊

ElemTypedeQueue(Queueq);出隊,返回隊頭元素

intisEmpty(Queueq);判斷隊空

答案:voidQueueInvent(Queueq)

{ElemTypex;

makeEmpty(SqStacks);

while(!isEmpty(Queueq))

{x=deQueue(Queueq);

push(SqStacks,ElemTypex);}

while(!isEmpty(SqStacks))

{x=pop(SqStacks);

enQueue(Queueq,ElemTypex);}

)

3、對于一個棧,給出輸入項A,B,C,D,如果輸入項序列為A,B,C,D,

試給出全部可能的輸出序列。

答案:出棧的可能序列:

ABCDABDCACDBACBDADCBBACDBADC

BCADBCDA

CBDACBADCDBADCBA

第四章串

一、選擇題

1、設有兩個串S1和S2,求串S2在S1中首次出現位置的運算稱作(C)o

A.連接B.求子串C.模式匹配D.判斷

子串

2、已知串S=,aaab\貝!Jnex七數組值為(A)o

A.0123B.1123C.1231D.

1211

3、串與普通的線性表相比較,它的特殊性體現在(C)o

A.順序的存儲結構B.鏈式存儲結構C.數

據元素是一個字符D.數據元素任意

4、設串長為n,模式串長為m,則KMP算法所需的附加空間為(A)o

A.0(m)B.0(n)C.0(m*n)

D.O(nlog2m)

5、空串和空格串(B)<>

A.相同B.不相同可能相同

D.無法確定

6、與線性表相比,串的插入和刪除操作的特點是()o

A.通常以串整體作為操作對象B.需要更多的輔助空

C.算法的時間復雜度較高D.涉及移動的元素更多

7、設SUBSTR(S,i,k)是求S中從第i個字符開始的連續k個字符組成的

子串的操作,貝!|對于5=,88巧[]19&1^11:)1119,,SUBSTR(S,4,5)=

(B)o

A.,ijing'B.'jing&'C.'ingNa'D.

Sng&N9

二、判斷題

()1、造成簡單模式匹配算法BF算法執行效率低的原因是有回溯存

在。

(J)2、KMP算法的最大特點是指示主串的指針不需要回溯。

(?)3、完全二叉樹某結點有右子樹,則必然有左子樹。

三、填空題

1、求子串在主串中首次出現的位置的運算稱為模式匹配。

2、設s="—AM—A—TEACHER:其長度是。

3、兩個串相等的充分必要條件是兩個串的長度相等且對應位置

字符相同o

四、程序填空題

1、函數kmp實現串的模式匹配,請在空格處將算法補充完整。

intkmp(sqstring*s,sqstring*tzintstart,int

next[]){

inti=start-l,j=0;

while(i<s->len&&j<t->len)

if(j==-l||s->data[i]==t->data[j]){

i++;j++;

)

elsej=;

if(j>=t->len)

return();

else

return(-1);

)

2、函數實現串的模式匹配算法,請在空格處將算法補充完整。

intindex_bf(sqstring*s,sqstring*t,intstart){

inti=start-l,j=0;

while(i<s->len&&j<t->len)

if(s->data[i]==t->data[j]){

i++;j++;

}else{

i=i-j+l;j=0;

)

if(j>=t->len)

returni-t->len+l;

else

return-1;

}}/*listDelete*/

3、寫出下面算法的功能。

intfunction(SqString*sl,SqString*s2){

inti;

for(i=0;i<sl->length&&i<sl->length;i++)

if(s->data[i]!=s2->data[i])

returnsl->data[i]-s2->data[i];

returnsl->length-s2->length;

)

答案:.串比較算法

4、寫出算法的功能。

intfun(sqstring*srsqstring*tzintstart){

inti=start-l,j=0;

while(i<s->len&&j<t->len)

if(s->data[i]==t->data[j]){

i++;j++;

}else{

i=i-j+l;j=0;

)

if(j>=t->len)

returni-t->len+l;

else

return-1;

)

答案:串的模式匹配算法

第五章數組和廣義表

一、選擇題

1、設廣義表L=((a,b,c)),貝UL的長度和深度分別為(C)o

A.1和1B.1和3C.1和2D.2和3

2、廣義表((a),a)的表尾是(B

A.aB.(a)C.()D.((a))

3、稀疏矩陣的常見壓縮存儲方法有(C)兩種。

A.二維數組和三維數組B.三元組和散列表C.三

元組和十字鏈表D.散列表和十字鏈表

4、一個非空廣義表的表頭(D)o

A.不可能是子表B.只能是子表C.只能是原子

D.可以是子表或原子

5、數組A[0..5,0??6]的每個元素占5個字節,將其按列優先次序存儲

在起始地址為1000的內存單元中,則元素A[5][5]的地址是()。

A.1175B.1180C.1205D.1210

6、廣義表G=(a,b(c,d,(e,f)),g)的長度是(A

A.3B.4C.7D.8

7、采用稀疏矩陣的三元組表形式進行壓縮存儲,若要完成對三元組表進

行轉置,只要將行和列對換,這種說法(B)o

A.正確B.錯誤C.無法確定D.以上

均不對

8、廣義表(a,b,c)的表尾是(B)。

A.bzcB.(bzc)C.cD.(c)

9、常對數組進行兩種基本操作是()o

A.建立和刪除B.索引和修改C.查找和修改

D.查找與索引

10、對一些特殊矩陣采用壓縮存儲的目的主要是為了(D)o

A.表達變得簡單B.對矩陣元素的存取變得簡單

C.去掉矩陣中的多余元素D.減少不必要的存儲空間的

開銷

11、設有一個10階的對稱矩陣A,采用壓縮存儲方式,以行序為主存儲,

all為第一個元素,其存儲地址為1,每元素占1個地址空間,貝!Ja85的地

址為()o

A.13B.33C.18D.40

12、設矩陣A是一個對稱矩陣,為了節省存儲,將其下三角部分按行序存

放在一維數組B[l,n(n-l)/2]中,對下三角部分中任一元素

aizj(i>=j),在一維數組B的下標位置k的值是(B)o

A.i(i-l)/2+j-lB.i(i-l)/2+jC.

i(i+l)/2+j-lD.i(i+l)/2+j

13、廣義表A=((a),a)的表頭是(B)。

A.aB.(a)C.bD.((a))

14、稀疏矩陣一般的壓縮存儲方法有兩種,即(C

A.二維數組和三維數組B.三元組和散列C.三元

組和十字鏈表D.散列和十字鏈表

15、假設以三元組表表示稀疏矩陣,則與如圖所示三元組表對應的4X5

的稀疏矩陣是(注:矩陣的行列下標均從1開始)(B)o

'0-8060、0-8060、

7000070003

A.B.012-8

00000-50400

1146

「5040°,00002217

3253

0—8060、'0—8060、431-5

5334

C.00003D.70000

70000-50403

-5040°,0000

16、以下有關廣義表的表述中,正確的是()o

A.由0個或多個原子或子表構成的有限序列B.至少

有一個元素是子表

C.不能遞歸定義D.不能為空表

17對廣義表L=((a,b),((czd),(ezf)))執行

head(七a土工(head(七ail(L))))操作的結果是()。

A.的B.eC.(e)D.(e,f)

二、判斷題

()1、廣義表中原子個數即為廣義表的長度。

()2、一個稀疏矩陣采用三元組表示,若把三元組中有關行下標與列

下標的值互換,并把mu和nu的值進行互換,則完成了矩陣轉置。

(J)3、稀疏矩陣壓縮存儲后,必會失去隨機存取功能。

()4、廣義表的長度是指廣義表中括號嵌套的層數。

(J)5、廣義表是一種多層次的數據結構,其元素可以是單原子也可

以是子表。

三、填空題

1、已知二維數組A[m][n]采用行序為主方式存儲,每個元素占k個存儲單

元,并且第一個元素的存儲地址是LOC(A[0][0]),則的地址是一

Loc(A[0][0])+(i*N+j)*k。

2、廣義表運算式HEAD(TA工L((a,b,c),(x,y,z)))的結果是:

(x,y,z)o

3、二維數組,可以按照兩種不同的存儲方

式。

4、稀疏矩陣的壓縮存儲方式有:和o

四、綜合題

1、現有一個稀疏矩陣,請給出它的三元組表。

-0310-

1000

0210

00-20

答案:

第六章樹

一、選擇題

1、二叉樹的深度為k,則二叉樹最多有(C)個結點。

A.2kB.2k-1C.2k-lD.2k-l

2、用順序存儲的方法,將完全二叉樹中所有結點按層逐個從左到右的順

序存放在一維數組RC..N]中,若結點R[i]有右孩子,則其右孩子是

(B)<>

A.R[2i-1]B.R[2i+1]C.R[2i]

D.R[2/i]

3、設a,b為一棵二叉樹上的兩個結點,在中序遍歷時,a在b前面的條件

是(B)o

A.a在b的右方B.a在b的左方C.a是b的祖

先D.a是b的子孫

4、設一棵二叉樹的中序遍歷序列:badce,后序遍歷序列:bdeca,則

二叉樹先序遍歷序列為()。

A.adbceB.decabC.debacD.abcde

5、在一棵具有5層的滿二叉樹中結點總數為()。

A.31B.32C.33D.16

6、由二叉樹的前序和后序遍歷序列(B)惟一確定這棵二叉樹。

A.能B.不能

7、某二叉樹的中序序列為ABCDEFG,后序序列為BDCAFGE,則其左子

樹中結點數目為(C)。

A.3B.2C.4D.5

8、若以{4,5,6,7,8}作為權值構造哈夫曼樹,則該樹的帶權路徑長度

為(C)o

A.67B.68C.69D.70

9、將一棵有100個結點的完全二叉樹從根這一層開始,每一層上從左到

右依次對結點進行編號,根結點的編號為1,則編號為49的結點的左孩子

編號為(A)o

A.98B.99C.50D.48

10、表達式a*(b+c)-d的后綴表達式是(B)o

A.abcd+-B.abc+*d-C.abc*+d-D.

-+*abcd

11、對某二叉樹進行先序遍歷的結果為ABDEFC,中序遍歷的結果為

DBFEAC,則后序遍歷的結果是(B)<>

A.DBFEACB.DFEBCAC.BDFECAD.BDEFAC

12、樹最適合用來表示(C)o

A.有序數據元素B.無序數據元素C.元素之間具

有分支層次關系的數據D.元素之間無聯系的數據

13>表達式A*(B+C)/(D-E+F)的后綴表達式是(C)。

A.A*B+C/D-E+FB.AB*C+D/E-F+C.ABC+*DE-F+/

D.ABCDED*+/-+

14、在線索二叉樹中,t所指結點沒有左子樹的充要條件是()。

A.t->left==NULLB.t->ltag==lC.

t->1tag==l&&t->left==NULLD.以上都不對

15、任何一棵二叉樹的葉結點在先序、中序和后序遍歷序列中的相對次

序()o

A.不發生改變B.發生改變C.不能確定

D.以上都不對

16、假定在一棵二叉樹中,度為2的結點數為15,度為1的結點數為30,

則葉子結點數為()個。

A.15B.16C.17D.47

17、在下列情況中,可稱為二叉樹的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論