第二章 线性表 练习题

  • 格式:doc
  • 大小:65.50 KB
  • 文档页数:9

一、选择题

1.线性表的链接实现有利于( A )运算。

(A)插入 (B)读表元 (C)查找 (D)定位

2.设单链表中指针p指向结点A,若要删除A之后的结点(若存在),则修改指针的

操作为( A)。

(A)P一>next=p一>next一>next (B)p=P一>next

(C)p=P一>next一>next (D)p一>next=p

3.线性表采用链式存储时,其地址( D )。

(A)必须是连续的 (B)部分地址必须是连续的

(c)一定是不连续的 (D)连续与否均可以

4.在一个具有n个结点的单链表中查找其值等于x的结点.在查找成功的情况下需平均比较( c)个元素结点。

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

5.在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是( B )。

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

6.已知一个有序表为(13,18,24,35,47,50,62,83,90,115,134),当二分查找值为90的元素时,需( D )次比较可查找成功。

(A)1 (B)2 (C)3 (D)4

7.在顺序存储的线性表R[029]上进行顺序查找的平均查找长度为(①),进行二

分查找的平均查找长度为(②),讲行分块查找(设分为5块)的平均查找长度为(③)

①(A)15 (B)15.5 (C)16 (D)20

②(A)4 (B)62/15 (C)64/15 (D)25/6

③(A)6 (B)11 (C)5 (D)6.5

8.若线性表最常用的操作是存取第i个元素及其前驱元素的值,则采用( B )存储方式最节省时间。

(A)单链表 (B)双向链表 (C)单循环链表 (D)顺序表

二、填空题

1.循环链表的主要优点是__表的处理方便________________。

2.在双向循环链表中,在指针p所指的结点之后插入指针f所指的结点,其操作为______ f->prior=p; f->next=p->next; p->next=f; p->next->prior=f__________

3.双向循环链表的主要优点是____克服单链表的单向性__________。

4.在双向循环表中,在p所指的结点之后插入指针f所指的结点,其操作为_____f->prior_=p;f一>next=p一>next;_ p->next->prior =f;p一>next=f。

5.若要在一个单链表的*p结点之前插入一个*s结点时,可执行下列操作 s->next=____p->next________; p->next=s;t=p->data;p->data=_ s->data _;s->data=____t _____。

6.假定对线性表R[059]进行分块查找,共分10块,每块长度等于6。若假定查找索引表和块均用顺序查找法,则查找每一个元素的平均查找时间为___________。

7.在一个长度为n的顺序表中插入一个元素,最少需要移动_0_个元素,最多需要移动____n____个元素。

8.如果某线性表的每一个元素都没有后继元素,则其长度最多是_1______________。

9.设单链表中指针p指着结点A,若要删除A之后的结点(假设存在), 则需要修改指针的操作为__p->next=p->next->next_____________。

三、判断题

1.具有线性序关系的集合中,若a,b是集合中的任意两个元素,则必有a

2.在单链表中任何两个元素的存储位置之间都有固定的联系,因此可以从首结点进行查找任何一个元素。(错 )

3.如果某数据结构的每一个元素都最多只有一个直接前驱,则必为线性表。(错 )

4.一个有序的单链表不能采用折半查找法进行查找。(错)

5.线性表的惟一存储形式就是链表。( 错 )

四、读程序填空

1.以下函数ins的功能是在顺序表a中找到第一个值为x的元素,然后在该元素之前插入一个值为y的元素。如果找不到值为x的元素,则新元素成为顺序表的最后一个元素。插入成功返回1,否则返回0。完成以下程序。(8分)

typedef struct {

int elem[100];

int length;

}SQ;

int ins(SQ *a, int x, int y)

{

int k,i;

if( _a=NULL_ )

return 0;

for(k=0; klength; k++)

if(a->elem[k]==x)

break;

if(k==a->length) k--;

else

for(i=a->length-1; i>k; i--) ____a->elem[i+1]=a->elem[i]__________ ;

____a->elem[k]__ =y;

return 1;

}

2.在单链表(表首指针为head)的元素中找出最后一个值为e的元素,返回其指针;如果找不到,返回NULL。完成以下程序。(6分)

Typedef struct LinkNode{

int data;

Struct LinkNode *next;

}Node;

Node *search_link(Node *head, int e)

{

Node *p, *q;

q=____head___ ;

for(p=head; __p->next!=NULL_ ; p=p->next)

if(p->data==e) ____q=p____________;

return q;

}

3.已知单链表的表首指针为head,下面的函数delete是从单链表中删除指针为p的结点,并返回新的表首指针。请完成如下程序。(4分)

typedef struct LinkNode{

int data;

struct LinkNode *next;

}Node;

Node *delete(Node *head, Node *p)

{

Node *pf;

if(head==p){

head=______head->next____________;

free(p);}

else{

for(pf=head; pf->next!=p; pf=pf->next);

_____p_ = p->next;

free(p);}

}

return head;

}

4.以下算法是将线性表L中所有负数元素删除,返回被删除的元素个数。完成以下算法。(7分)

typedef struct{

int elem[100];

int length;

}SQ;

int deln(SQ *L)

{

/* 算法思路是,对每个元素做以下循环,如果第i个元素大于等于0,且前面有c个小于0的元素,则将它前移c个位置*/

int i,c; /* c将记录小于0的元素个数 */ for(i=0,c=0; ilength; i++)

{

if(__SQ->elem[i]_<0) c++;

else if(c>0) x->e[i - ____c______]=x->e[i];

}

x->length=_x->length-c_____;

return c;

}

5.以下算法将元素递增排列的顺序存储线性表A和B的元素的交集存人线性表C中。在空格处填上合适的语句或表达式完成该算法。(每空2分)

void SqList_Intersect(SqList A, SqList B, SqList &C

{ int i=1,j=1,k=0; /* 下标初始化,A、B、C的下标都从1开始 */

while(i<=A.num && j<=B.num) /* A、B表均末到表尾 */

{if(A.elem[i]

____i++_________;

if(_A.elem[i]>B.elem[j]_) j++;

if(A.elem[i]==B.elem[j]) /* 当发现了一个在A和B中都存在的元素 */

{C.elem[_k++_]=A.elem[i]; /* 添加到C中 */

i++; j++;

}

}/* while */

C.num=k; /* C表长度置位 */

} /* SqList_Intersect */

6.已知一个单链表的表首指针为h,每个结点含元素值data和下一结点的地址next。链表一共有5个结点,其元素值分别为100,200,300,400,500,经过下列语句后,输出什么结果?(3分)

for(p=h; p->data<300; p=p->next);

p->next=p->next->next;

printf("%d", p->data);

答案:300

五、简答题

1.排序

(1)写出线性表(26,45,12,z0,30,5,15,29,16,2,18)采用基数排序后,第一趟结束时的结果。(4分)

(2)线性表采用简单选择排序算法对线性表(26,15,12,16,5,30)进行排序,进行交换的第一对元素是哪两个元素,在什么情况下,第一趟不需要进行元素的交换?(6分)

2.线性表有顺序表和链表两种存储结构,简述各自的优缺点。(4分)

 顺序存储结构的特点:以数据元素在计算机内“物理位置相邻”来表示顺序表中数据元素之间的逻辑关系,能随机存取顺序表中任一数据元素。但它也使得插入和删除操作需移动大量的数据元素。由于顺序表需要一组地址连续的存储单元,对于长度可变的线性表就需要预分配足够的空间,有可能使一部分存储空间长期闲置不能充分利用。也可能由于估计不足,当表长超过预分配的空间而造成溢出,在这种情况下,又难于扩充连续的存储空间。