1. 程式人生 > >資料結構--線性表習題及答案

資料結構--線性表習題及答案

第二章 線性表

 一、選擇題 

1、若長度為n的線性表採用順序儲存結構,在其第i個位置插入一個新元素演算法的時間複雜度(   )。

A. O(log2n)           B.O(1)        C. O(n)           D.O(n2)

2、若一個線性表中最常用的操作是取第i個元素和找第i個元素的前趨元素,則採用(   )儲存方式最節省時間。

    A. 順序表          B. 單鏈表         C.  雙鏈表         D. 單迴圈連結串列

3、具有線性結構的資料結構是(   )。

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

4、在一個長度為n的順序表中,在第i個元素之前插入一個新元素時,需向後移動(   )個元素。

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

5、非空的迴圈單鏈表head的尾結點p滿足(   )。

A. p->next==head

            B. p->next==NULL    

C.  p==NULL                   D. p==head

6、連結串列不具有的特點是(   )。

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->next;  

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、線性表採用鏈式儲存時,結點的儲存地址(   )。

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

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

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

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

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

A. 表元素          B. 字元    C. 資料元素 D. 資料項 

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

A. 單鏈表          B. 順序表         C. 迴圈連結串列         D. 靜態連結串列

12、在具有n個結點的單鏈表上查詢值為x的元素時,其時間複雜度為(   )。

A. O(n)           B. O(1)            C. O(n2)       D. O(n-1)

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

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

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

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

D. 除第一個和最後一個元素外,其餘每個元素都由一個且僅有一個直接前驅和直接後繼

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

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

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

    A. 單鏈表      B. 雙鏈表     C. 迴圈連結串列        D. 順序表

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

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

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

C. p =p->next;

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

17、將長度為n的單鏈表連線在長度為m的單鏈表之後的演算法的時間複雜度為(   )。

A. O(1)       B. O(n)       C. O(m)       D. O(m+n)

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

A. 隨機存取     B. 順序存取    C. 索引存取    D. 雜湊存取   

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

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

10、迴圈連結串列的主要優點是(   )。

A. 不再需要頭指標          B. 已知某結點位置後能容易找到其直接前驅

C. 在進行插入、刪除運算時能保證連結串列不斷開

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

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

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

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

12、在下列對順序表進行的操作中,演算法時間複雜度為O(1)的是(   )。

   A. 訪問第i個元素的前驅(1<)       B. 在第i個元素之後插入一個新元素()

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

13、已知指標p和q分別指向某單鏈表中第一個結點和最後一個結點。假設指標s指向另一個單鏈表中某個結點,則在s所指結點之後插入上述連結串列應執行的語句為(   )。

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=qp->next=s->next;

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

    A. 線性表的順序儲存結構優於連結串列儲存結構      

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

    C. 線性表的連結串列儲存結構適用於頻繁插入/刪除資料元素的情況           

D. 線性表的連結串列儲存結構優於順序儲存結構

15、在表長為n的順序表中,當在任何位置刪除一個元素的概率相同時,刪除一個元素所需移動的平均個數為(   )。

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

16、在一個單鏈表中,已知q所指結點是p所指結點的前驅結點,若在q和p之間插入一個結點s,則執行(   )。

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的結點,實現刪除x的後繼的語句是(   )。

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結點之後,則需要執行的語句:  q-next=p-next,p-next=q         

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

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

答案:線性結構  長度

3、寫出帶頭結點的雙向迴圈連結串列L為空表的條件     L-prior=L-next=L             

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

4、帶頭結點的單鏈表head為空的條件是  head-next==null        

答案:head->next==NULL

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

q = p->next;

p->next=_q-next   ___;

答案:q->next

 

                        

三、判斷題

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

2、在具有頭結點的單鏈表中,頭指標指向連結串列的第一個資料結點(的儲存位置)。O

3、用迴圈單鏈表表示的鏈佇列中,可以不設隊頭指標,僅在隊尾設定隊尾指標。P

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

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

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

 

四、程式分析填空題

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

  

  int GetElem(LinkList L,int i,Elemtype *e){

       LinkList p;int j;

       p=L->next;j=1;

       while(p&&j<i){

             (1)     ;++j;

 }

   if(!p||j>i)  return ERROR;

   *e=    (2)     ;

   return OK;

}

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

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

int ListInsert(LinkList L,int i,ElemType e){

    LNode *p,*s;int j;

    p=L;j=0;

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

       p=p->next;j++;

    }

    if(p==NULL||j>i-1) return ERROR;

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

    s->data=e;

          (1)            ;               

          (2)              ;

    return OK;

}/*ListInsert*/

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

3、函式ListDelete_sq實現順序表刪除演算法,請在空格處將演算法補充完整。

int ListDelete_sq(Sqlist *L,int i){

    int k;

    if(i<1||i>L->length) return ERROR;

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

L->slist[k]=      1      ;

           2          ;                      

    return OK;

}

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

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

int ListDelete(LinkList L,int i,ElemType *s){

    LNode *p,*q;

    int j;

    p=L;j=0;

    while((        1     )&&(j<i-1)){

        p=p->next;j++;

    }

    if(p->next==NULL||j>i-1) return ERROR;

    q=p->next;                 

          2          ;

    *s=q->data;

    free(q);

    return OK;

}/*listDelete*/

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

5、寫出演算法的功能。

int L(head){

       node * head;

       int n=0;

       node *p;

       p=head;

       while(p!=NULL)

       { p=p->next;

          n++;

        }

       return(n);

    }

答案:求單鏈表head的長度

 

五、綜合題

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

答案:void invent(Lnode *head)

    {Lnode *p,*q;

     if(!head->next) return ERROR;

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

     while(q)

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

    }

2、有兩個迴圈連結串列,鏈頭指標分別為L1和L2,要求寫出演算法將L2連結串列鏈到L1連結串列之後,且連線後仍保持迴圈連結串列形式。

答案:void merge(Lnode *L1, Lnode *L2)

    {Lnode *p,*q ;

     while(p->next!=L1)

p=p->next;

while(q->next!=L2)

q=q->next;

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

    }

3、設一個帶頭結點的單向連結串列的頭指標為head,設計演算法,將連結串列的記錄,按照data域的值遞增排序。

答案:void assending(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不帶頭結點的單鏈表改造為一個單向迴圈連結串列,並分析演算法的時間複雜度。

答案:

void linklist_c(Lnode *head)

    {Lnode *p; p=head;

     if(!p) return ERROR;

while(p->next!=NULL)

p=p->next;

p->next=head;

    }

設單鏈表的長度(資料結點數)為N,則該演算法的時間主要花費在查詢連結串列最後一個結點上(演算法中的while迴圈),所以該演算法的時間複雜度為ON)。

5、已知head為帶頭結點的單迴圈連結串列的頭指標,連結串列中的資料元素依次為(a1,a2,a3,a4,…,an),A為指向空的順序表的指標。閱讀以下程式段,並回答問題:

(1)寫出執行下列程式段後的順序表A中的資料元素;

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

if(head->next!=head)

{

p=head->next;

A->length=0;

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插入到順序表的適當位置上,以保持該表的有序性。

答案:

void Insert_sq(Sqlist va[], ElemType x)

    {int i, j, n;

     n=length(va[]);

     if(x>=va[i])

va[n]=x;

else

{i=0;

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

for(j=n-1;j>=I;j--)

va[j+1]=va[j];

va[i]=x; }

n++;

    }

7、假設線性表採用順序儲存結構,表中元素值為整型。閱讀演算法f2,設順序表L=(3,7,3,2,1,1,8,7,3),寫出執行演算法f2後的線性表L的資料元素,並描述該演算法的功能。

  void f2(SeqList *L){ 

int i,j,k;

k=0;

for(i=0;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的元素(若表中存在這樣的元素)同時釋放被刪除結點空間。

答案:

void Delete_list(Lnode *head, ElemType x, ElemType y)

    {Lnode *p, *q;

     if(!head) return ERROR;

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的所有結點。