第3章 链表
一、选择题
( )4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用存储方式最节省时间。
A.顺序表B.双链表
C.带头节点的双循环链表D.单循环链表
( ) 5、串是
A)不少于一个字母的序列B)任意个字母的序列
C)不少于一个字符的序列D)有限个字符的序列
()8、串是一种特殊的线形表,其特殊性体现在。
A、可以顺序存储
B、数据元素是一个字符
C、可以连接存储
D、数据元素可以是多个字符
()1、线形表采用链式存储结构时,要求内存中可用存储单元地址。
A、必须是连续的
B、部分地址必须是连续的
C、一定是不连续的
D、连续不连续都可以
()5、不带头结点的单链表head为空的条件是。
A、head = = NULL
B、head ->next = = NULL
C、head ->next = = head
D、head ! = NULL
()6、在一个单链表中,若p所指结点不是最后结点,在p之后插入结点*s,则执行。
A、s->next = p ; p->next = s ;
B、s->next = p->next ; p->next = s ;
C、s->next = p->next ; p = s ;
D、p->next = s ; s->next = p ;
( ) 10、带头结点的单链表L为空的判定条件是。
A)L=NULL B)L-->next=NULL
C)L-->next=L D)L!=NULL
( ) 5、带头结点的循环链表L为空的判定条件是。
A)L=NULL B)L-->next=NULL C)L-->next=L D)L!=NULL
( )11.循环链表H的尾节点*P的特点是。
A.P->next=H B.P->next = H->next C.P=H D.P= H->next
7、()在一个单链表中,已知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 ;
3.线性表采用链式存储结构时,其地址()。
(A) 必须是连续的(B) 部分地址必须是连续的
(C) 一定是不连续的(D) 连续与否均可以
4. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()(A)s->next=p;p->next=s; (B)s->next=p->next;p->next=s;
(C)s->next=p->next;p=s; (D)p->next=s;s->next=p;
5.在一个单链表中,若删除p所指结点的后续结点,则执行()
(A)p->next=p->next->next; (B)p=p->next; p->next=p->next->next;
(C)p->next=p->next; (D)p =p->next->next;
(4)在一个单链表HL中,若要在指针q所指结点的后面插入一个由指针p所指向的结点,则执行____。
A、 q一>next=p一>next;p一>next=q;
B、 q一>next=p一>next;p一>next=q;
C、 p一>next=q一>next;q=p;
D、 p一>next=q一>next;q一>next=p;
(8)线性表若采用链表存储结构时,要求内存中可用存储单元的地址________ A、必须是连续的B、部分地址必须是连续的
C、一定是不连续的D、连续不连续都可以
(15)在具有n个结点的有序单链表中插入一个新结点并使链表仍然有序的时间复杂度是________
A、O(1)
B、O(n)
C、O(nlogn)
D、O(n2)
(8)在一个单链表HL中,若要删除由指针q所指向结点的后继结点,则执行_____。
A、p = q->next ; p->next = q->next; C、p = q->next ; q->next = p->next;
B、p = q->next ; q->next = p; D、q->next = q->next->next; q->next = q;
(15)在具有n个结点的有序单链表中插入一个新结点并使链表仍然有序的时间复杂度是________
A、O(1)
B、O(n)
C、O(nlogn)
D、O(n2)
二、填空题
3、带尾指针的单循环链表的尾指针为R,则头指针为。
8. 在双链表中,在指针P所指结点前插入一个结点*S的语句序列是:
S→next = P;S→prior = P→prior;P→prior = S;。
1.已知P为单链表中的非首尾结点,在P结点后插入S结点的语句为:_______________________ 。
2.顺序表中逻辑上相邻的元素物理位置( )相邻,单链表中逻辑上相邻的元素物理位置_________相邻。
4.在非空双向循环链表中,在结点q的前面插入结点p的过程如下:
p->prior=q->prior;
q->prior->next=p;
p->next=q;
______________________;
5.已知L是无表头结点的单链表,是从下列提供的答案中选择合适的语句序列,分别实现:
(1)表尾插入s结点的语句序列是_______________________________
(2) 表尾插入 s结点的语句序列是_______________________________
1.p->next=s;
2.p=L;
3.L=s;
4.p->next=s->next;
5.s->next=p->next;
6.s->next=L;
7.s->next=null;
8.while(p->next!= Q)? p=p-next;
9.while(p->next!=null) p=p->next;
2、若频繁地对线性表进行插入与删除操作,该线性表应采用______________存储结构。
3、在双向链表中,每个结点含有两个指针域,一个指向_________结点,另一个指向________结点。
5、某带头结点的单链表的头指针head,判定该单链表非空的条件______________。
6、已知指针p指向单链表中某个结点,则语句p->next=p->next->next的作用________。
7、______链表从任何一个结点出发,都能访问到所有结点。
2、若频繁地对线性表进行插入与删除操作,该线性表应采用______________存储结构。
4、链式存储结构中的结点包含________________域,_______________域。
三、判断题
()6、在双向链表中,每个结点有两个指针域:一个指向其前驱结点,一个指向其后继结点。
( )5、在静态链表中存取第i个元素的时间与i无关。
( )6、循环链表不是线性表。
( )8、双循环链表中, 任一节点的后继指针均指向其逻辑后继.
1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。()
2.如果没有提供指针类型的语言,就无法构造链式结构。()
4.语句p=p->next完成了指针赋值并使p指针得到了p指针所指后继结点的数据域值。()
5.要想删除p指针的后继结点,我们应该执行q=p->next ;p->next=q->next;free(q)。()
3、单链表从任何一个结点出发,都能访问到所有结点。()
8、符号p->next出现在表达式中表示p所指的那个结点的内容。()
7、线性链表中各个链结点之间的地址不一定要连续。()
3、单链表从任何一个结点出发,都能访问到所有结点。()
四、应用题
五、算法题
(一)算法理解题
(二)算法填空题
1、下列函数的功能是:在表中第i个元素之前插入元素b;la为指向带头节点的单链表的
头指针。请在空缺处填入合适内容,使其成为一个完整的算法。(每空1分)
LinkList *insert (LinkList *la,int i,datatype b)
{
LinkList *p,*s;int j;
p= ;j= ;
while ( p!=NULL && )
{
p = ;
j=j+1;
}
if (p= =NULL || ) error (‘No this position’)
else {
s = malloc ( sizeof (LinkList) );
s->data=b;s->next=p->next;p->next=s;
}
return la;
}
1.下列算法为删除单链表中值为X的算法,将程序填完整。(8分,每空2分)
void del(struct node *head)
{ q=head;
while((_________)&&(_
p=q->next;________))
{ q=p;
_________;}
if(p= = null) printf(“error”);
else{______________;
free(p);printf(“success!”);}}
2.下列算法完成在一个带头单链表中第i个结点前插入一个结点算法,请将空余处填上。(8分,每空2分)
Void inserti (struct node *head)
{ p =head ->next;k=0;
while(p!=null)&&(k<_______)
{________;
k++;}
if p!=null
{printf(“please input to x”);
scanf(“%d”,&x);
q=(struct node *)malloc(sizeof(struct node));
q->data=x;
_________;
_________;}
else printf(“not found ith node”);}
1.建立一个带头结点、有10个结点的单链表,请将下列算法填完整。(6分,每空2分)Void great( )
{ struct node *head,*p,*s; int i,x;
head = ( struct node *)malloc( sizeof( struct node));
______________
p=head;
for ( i =1; _______ ; i ++)
{ s=(struct node *)malloc(sizeof(struct node));
printf(“请输入数据值”);
scanf(“%d”,&x);
s ->data= x;
s ->next=p->next;
______________;
}}
2.下列算法完成在一个带头单链表中第i个结点前插入一个结点算法,请将空余处填上。(8分,每空2分)
Void inserti (struct node *head)
{ p =head ->next;k=0;
while(p!=null)&&(k<_______)
{________;
k++;}
if p!=null
{printf(“please input to x”);
scanf(“%d”,&x);
q=(struct node *)malloc(sizeof(struct node));
q->data=x;
_________;
_________;
}
else printf(“not found ith node”);}
(三)算法设计题
1、删除带头结点的单链表L中值为x的所有节点。
1.试编写一个求已知单链表的数据域的平均值的函数(数据域数据类型为整型)。
2.已知带有头结点的循环链表中头指针为head,试写出删除并释放数据域值为x的所有结点的c函数。
3.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现出库(销售)m台价格为h的电视机,试编写算法修改原链表。
4.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现新到m台价格为h的电视机,试编写算法修改原链表。
5.线性表中的元素值按递增有序排列,针对顺序表和循环链表两种不同的存储方式,分别编写C函数删除线性表中值介于a与b(a≤b)之间的元素。
7.试编写算法,删除双向循环链表中第k个结点。
8.线性表由前后两部分性质不同的元素组成(a0,a1,...,an-1,b0,b1,...,bm-1),m和n为两部分元素的个数,若线性表分别采用数组和链表两种方式存储,编写算法将两部分元素换位成(b0,b1,...,bm-1,a0,a1,...,an-1),分析两种存储方式下算法的时间和空间复杂度。
9.用循环链表作线性表(a0,a1,...,an-1)和(b0,b1,...,bm-1)的存储结构,头指针分别为ah和bh,设计C函数,把两个线性表合并成形如(a0,b0,a1,b1,…)的线性表,要求不开辟新的动态空间,利用原来循环链表的结点完成合并操作,结构仍为循环链表,头指针为head,并分析算法的时间复杂度。
10.试写出将一个线性表分解为两个带有头结点的循环链表,并将两个循环链表的长度放在各自的头结点的数据域中的C函数。其中,线性表中序号为偶数的元素分解到第一个循环链表中,序号为奇数的元素分解到第二个循环链表中。
11.试写出把线性链表改为循环链表的C函数。
12.己知非空线性链表中x结点的直接前驱结点为y,试写出删除x结点的C函数。
1.分别在顺序存储和一般链接存储两种方式下,用C语言写出实现把串s1复制到串s2的串复制函数strcpy(s1,s2)。
2.在一般链接存储(一个结点存放一个字符)方式下,写出采用简单算法实现串的模式匹配的C 语言函数int L_index(t,p)。