第二章作業題3-鏈表(2)

一、判斷題
1-1
在具有N個結點的單鏈表中,訪問結點和增加結點的時間複雜度分別對應爲O(1)和O(N)。 F

訪問節點的時間複雜度爲O(N)

1-2
若用鏈表來表示一個線性表,則表中元素的地址一定是連續的。F

1-3
將長度分別爲m,n的兩個單鏈表合併爲一個單鏈表的時間複雜度爲O(m+n)。 F

時間複雜度爲O(1),如果是兩個有序鏈表合成一個有序鏈表的時間複雜度爲O(M + N)

1-4
單鏈表不是一種隨機存取的存儲結構。T

二、選擇題
2-1
對於一非空的循環單鏈表,h和p分別指向鏈表的頭、尾結點,則有:A

A p->next == h
B p->next == NULL
C p == NULL
D p == h

2-2
在雙向循環鏈表結點p之後插入s的語句是: D

A p->next=s; s->prior=p; p->next->prior=s ; s->next=p->next;
B p->next->prior=s; p->next=s; s->prior=p; s->next=p->next;
C s->prior=p; s->next=p->next; p->next=s; p->next->prior=s;
D s->prior=p; s->next=p->next; p->next->prior=s; p->next=s;

2-3
在雙向鏈表存儲結構中,刪除p所指的結點,相應語句爲:C

A p->prior=p->prior->prior; p->prior->next=p;
B p->next->prior=p; p->next=p->next->next;
C p->prior->next=p->next; p->next->prior=p->prior;
D p->next=p->prior->prior; p->prior=p->next->next;

2-4
某線性表中最常用的操作是在最後一個元素之後插入一個元素和刪除第一個元素,則採用什麼存儲方式最節省運算時間? B

A 單鏈表
B 僅有尾指針的單循環鏈表
C 僅有頭指針的單循環鏈表
D 雙鏈表

2-5
若某表最常用的操作是在最後一個結點之後插入一個結點或刪除最後一個結點。則採用哪種存儲方式最節省運算時間? D

A 單鏈表
B 雙鏈表
C 單循環鏈表
D 帶頭結點的雙循環鏈表

2-6
將線性表La和Lb頭尾連接,要求時間複雜度爲O(1),且佔用輔助空間儘量小。應該使用哪種結構? C

A 單鏈表
B 單循環鏈表
C 帶尾指針的單循環鏈表
D 帶頭結點的雙循環鏈表

2-7
在鏈表中若經常要刪除表中最後一個結點或在最後一個結點之後插入一個新結點,則宜採用(C)存儲方式。

A 順序表
B 用頭指針標識的循環單鏈表
C 用尾指針標識的循環單鏈表
D 雙向鏈表

2-8
非空的循環單鏈表head的尾結點(由p所指向)滿足(C)。 (2分)

A p->next == NULL
B p == NULL
C p->next == head
D p == head

2-9
在循環雙鏈表的p所指結點之前插入s所指結點的操作是(D)。 (2分)

A p->prior = s; s->next = p; p->prior->next = s; s->prior = p->prior;
B p->prior = s; p->prior->next = s; s->next = p; s->prior = p->prior;
C s->next = p; s->prior = p->prior; p->prior = s; p->right->next = s;
D s->next = p; s->prior = p->prior; p->prior->next = s; p->prior = s;

2-10
若某表最常用的操作是在最後一個結點之後插入一個結點或刪除最後一個結點,則採用(D)存儲方式最節省運算時間。 (2分)

A 單鏈表
B 給出表頭指針的單循環鏈表
C 雙鏈表
D 帶表頭附加結點的雙循環鏈表

2-11
某線性表最常用的操作是在最後一個結點之後插入一個結點或刪除第一個結點,故採用(D)存儲方式最節省運算時間。 (2分)

A 單鏈表
B 僅有頭結點的單循環鏈表
C 雙鏈表
D 僅有尾指針的單循環鏈表

2-12
在一個長度爲n(n>1)的單鏈表上,設有頭和尾兩個指針,執行(B)操作與鏈表的長度有關。 (2分)

A 刪除單鏈表中的第一個元素
B 刪除單鏈表中的最後一個元素
C 在單鏈表第一個元素前插入一個新元素
D 在單鏈表最後一個元素後插入一個新元素

2-13
如果對線性表的運算只有4種,即刪除第一個元素,刪除最後一個元素,在第一個元素前面插入新元素,在最後一個元素的後面插入新元素,則最好使用(C)。 (2分)

A 只有表尾指針沒有表頭指針的循環單鏈表
B 只有表尾指針沒有表頭指針的非循環雙鏈表
C 只有表頭指針沒有表尾指針的循環雙鏈表
D 既有表頭指針也有表尾指針的循環單鏈表

2-14
如果對線性表的運算只有2種,即刪除第一個元素,在最後一個元素的後面插入新元素,則最好使用(B)。 (2分)

A 只有表頭指針沒有表尾指針的循環單鏈表
B 只有表尾指針沒有表頭指針的循環單鏈表
C 非循環雙鏈表
D 循環雙鏈表

2-15
在雙向循環鏈表中,在p所指的結點之後插入s指針所指的結點,其操作是(D)。 (2分)

A p->next = s; s->prior = p; (p->next)->prior = s; s->next = p->next;
B s->prior = p; s->next = p->next; p->next = s; p->next->prior = s;
C p->next = s; p->next->prior = s; s->prior = p; s->next = p->next;
D s->prior = p; s->next = p->next; p->next->prior = s; p->next = s;

2-16
帶表頭附加結點的雙向循環鏈表爲空的判斷條件是頭指針L滿足條件(D)。 (2分)

A L= =NULL
B L->right= =NULL
C L->left = =NULL
D L->right= =L

2-17
循環鏈表的主要優點是(D)。 (2分)

A 不再需要頭指針了
B 已知某個結點的位置後,能夠很容易找到它的直接前驅
C 在進行插入、刪除運算時,能更好的保證鏈表不斷開
D 從表中的任意結點出發都能掃描到整個鏈表

2-18
已知指針ha和hb分別是兩個單鏈表的頭指針,下列算法將這兩個鏈表首尾相連在一起,並形成一個循環鏈表(即ha的最後一個結點鏈接hb的第一個結點,hb的最後一個結點指向ha),返回該循環鏈表的頭指針。請將該算法補充完整。 (4分) B

typedef struct node{
ElemType data;
    struct node *next;
}LNode;
LNode *merge(LNode *ha, LNode *hb) {
LNode *p=ha;
     if (ha==NULL || hb==NULL) {
cout<<”one or two link lists are empty!<<endl;
          return NULL;
     }
     while ( p->next!=NULL ) 
           p=p->next;
     p->next=hb;
     while ( p->next!=NULL ) 
           p=p->next;
           __________         
}
A ha=p->next; return ha;
B p->next=ha; return ha;
C ha=p->next; return p;
D p->next=ha; return p;

2-19
設有一個雙向循環鏈表,每個結點中除有left、data和right三個域外,還增設了一個訪問頻度域freq,freq 的初值爲零。每當鏈表進行一次查找操作後,被訪問結點的頻度域值便增1,同時調整鏈表中結點的次序,使鏈表按結點頻度值非遞增有序的次序排列。下列算法是符合上述要求的查找算法,請將該算法補充完整。 (4分) C

typedef struct Node{
ElemType  data; 
   struct Node *left;  
   struct Node *right; 
intfreq;          
} DNode;
DNode *locate_DList(DNode *&L, ElemType x)
{ //在表L中查找元素x,查找成功則調整結點頻度域值及結點位置,並返回結點地址;
//查找不成功則返回NULL
DNode *p=L, *q;
   if (L==NULL)  return NULL;
   while (p->data!=x && p->right!=L)  p=p->right;
   if (p->data!=x)  return NULL;
   p->freq++; 
   q=p->left;
   while (q!=L && q->freq<=p->freq)  q=q->left;  //查找插入位置
   if (q==L && q->freq<=p->freq) {  //需將p結點插在頭結點L前
//將p結點先從鏈表中摘下來
p->left->right=p->right; 
      p->right->left=p->left;   
               //將p結點插在L結點前
      p->right=L;
      p->left=L->left;
      L->left->right=p;
      L->left=p;
      L=p;
   }
   else if (q!=p->left ) {  //若q不是p的前驅,則需調整結點位置,將p結點插在q結點後
//將p結點先從鏈表中摘下來
      p->left->right=p->right; 
      p->right->left=p->left;
      ______________ //將p結點插在q結點後         
   }
   return p;
}
A p->left=q; p->right=q->right;
B p->left=q; q->right=p;
C p->left=q; p->right=q->right; q->right->left=p; q->right=p;
D p->left=q; q->right=p; p->right=q->right; q->right->left=p;

2-20
與單鏈表相比,雙鏈表的優點之一是(D)。 (2分)

A 插入、刪除操作更加簡單
B 可隨機訪問
C 可以省略表頭指針或表尾指針
D 順序訪問相鄰結點更加靈活

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章