資料結構--線性表習題及答案
第二章 線性表
一、選擇題
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
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=q;p->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;
}
答案:(1)L->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迴圈),所以該演算法的時間複雜度為O(N)。
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的所有結點。