习题3(链表)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题3(链表)

一、选择题

(1)链接存储的存储结构所占存储空间( A )。

A)分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针

B)只有一部分,存放结点值 C)只有一部分,存储表示结点间关系的指针

D)分两部分,一部分存放结点值,另一部分存放结点所占单元数

(2)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( D )。

A)必须是连续的 B)部分地址必须是连续的 C)一定是不连续的 D)连续或不连续都可以(3)线性表L在( B )情况下适用于使用链式结构实现。

A)需经常修改结点值 B)需不断删除插入 C)含有大量的结点 D)结点结构复杂(4)单链表的存储密度( C )。

A)大于1 B)等于1 C)小于1 D)不能确定

(5)若指定有n个元素的向量,则建立一个有序单链表的时间复杂性的量级是( C )。

A)O(1) B)O(n) C)O(n2) D)O(nlog2n)

(6)在单链表中,要将s所指结点插入到p所指结点之后,其语句应为( D )。

A)s->next=p+1; p->next=s; B)(*p).next=s; (*s).next=(*p).next;

C)s->next=p->next; p->next=s->next; D)s->next=p->next; p->next=s;

(7)在双向链表存储结构中,删除p所指的结点时须修改指针( A )。

A)p->next->prior=p->prior; p->prior->next=p->next;

B)p->next=p->next->next; p->next->prior=p;

C)p->prior->next=p; p->prior=p->prior->prior;

D)p->prior=p->next->next; p->next=p->prior->prior;

(8)在双向循环链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是( C )。

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->prior=p; q->next=p->next; p->next=q; p->next->prior=q;

(9)链表可以带表头结点,也可以不带表头结点,前者最主要的好处是( B )。

A)加快表的遍历 B)使空表和非空表的处理统一 C)节省存储空间 D)提高存取元素的速度(10)在单链表指针p所指向的结点后面插入一个新结点q的操作语句序列为( A )。

A)q->next=p->next; p->next=q; B)p=p->next; p->next=q->next;

C)q=p->next; q->next=p->next; D)p->next=q; q->next=p->next;

(11)在一个单链表中,若要删除p个结点的后继结点,则执行( A )

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

C)free(p->next); D)p=p->next->next;

(12)设rear是指向非空带头结点的循环单链表的尾指针,则删除表首结点的操作可表示为( B ) A)p=rear; B)p= rear->next->next;

Rear=rear->next; rear->next->next=p->next;

free(p); free(p);

C)rear:=rear->next->next; D)rear=rear->next

free(rear); free(rear);

(13)循环链表主要优点是( D )

A)不再需要头指针了

B)已知某个结点的位置后,能够容易找到它的直接前趋

C)在进行插入,删除运算时,能更好地保证链表断开

D)从表中任一结点出发都能扫描到整个链表

(14)用链表表示线性表的优点是( C )

A)便于随机存取 B)花费的存储空间较顺序存储少

C)便于插入和删除操作 D)数据元素的物理顺序和逻辑顺序相同

(15)最常用操作是在最后一个元素之后插入一个元素和删除最后一个元素,则用( B )存储方式最佳。

A)单链表 B)双链表 C)单循环链表 D)带头结点的双循环链表

(16)指针p1和p2分别指向两个无头结点的非空单循环链表中的尾结点,要将两个链表链接成一个新的单循环链表,应执行的操作为( D )

A)p1->next=p2->next;p2->next=p1->next; B)p2->next=p1->next;p1->next=p2->next;

C)p=p2->next; p1->next=p;p2->next=p1->next;

D)p=p1->next; p1->next= p2->next;p2->next=p;

二、填空题

(1)在单向链表某P结点之后插入S结点的操作是( s->next=p->next;p->next=s; )。

(2)对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为( O(1) ),在给定值为x的结点后插入一个新结点的时间复杂度为( O(n) )。

(3)设长度为n的链队列用只设尾指针的单循环链表表示,则出队操作的时间复杂度为( O(1) ),若用只设头指针的单循环链表表示,则出队操作的时间复杂度为( O(1) )。

(4)在双向链表中,每个结点有两个指针域,一个指向(直接后继),另一个指向(直接前驱)。(5)在一个单链表中的p所指结点之后插入一个s所指结点时,执行的操作为(

s->next=p->next;p->next=s; )。

(6)在一个单链表中的p所指结点之前插入一个s所指结点时,执行的操作为(s->next=p;p=s; )。(7)在一个单链表中删除p所指结点时,应执行的操作是(q=p;p=p->next;free(q) )。

(8)对于双向链表,在两个结点之间插入一个新结点需修改的指针共( 4 )个。

(9)带有一个头结点的单链表Head为空的条件是( Head->next=Null )。

(10)非空循环单链表head的尾结点(由p所指向),满足条件( p->next=head )。

(11)对于一个具有n个结点的单链表,在已知p所指结点后插入一个新结点的时间复杂度为( O(1) );在给定值为x的结点后插入一个新结点的时间复杂度为( O(n) )。

(12)循环链表中最后一个结点的(指针域)指向头结点,整个链表形成一个(环)。(13)在单链表中,每个结点有(一个)指针域,最后一个结点的指针域为(空)。(14)已知链表结点定义如下,每个字符占1个字节,指针占4个字节,则该链表的存储密度是( 80% )。

typedef struct node { char data[16]; struct node *next; } LinkStrNode;

(15)下面是对不带头结点的单链表进行就地逆置的算法,该算法用L返回逆置后的链表的头指针。

void reverse(linklist &L)

{ p=null;q=L;

while(q!=null){ ( L=q->next ); q->next=p; p=q;( q=L ); } ( L=p );

}

三、算法设计题

(4)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

相关文档
最新文档