绪言和线性表习题
一、 选择题类型
1、.在一个单链表中,若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;
2.与单链表相比,双链表优点之一( ).
A.插入删除操作更简单. B.可随机访问
C.可省略表头指针和表尾指针 D、 顺序访问相临结点更灵活
3.在长度为n的顺序表的第i(1≤i≤n+1)个位置上插入一个元素,元素的移动次数为( )
A、 n-i+1 B.n-i
C.i D.i-1
4.对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为( )
A.顺序表 B.用头指针表示的单循环链表
C、 用尾指针表示的单循环链表 D.单链表
5.在需要经常查找结点的前驱与后继的场合中,使用( )比较合适。
A.单链表 B、 双链表 C.顺序表 D.循环链表
6.下面关于线性表的叙述中,错误的为( )
A.顺序表使用一维数组实现的线性表
B.顺序表必须占用一片连续的存储单元
C.顺序表的空间利用率高于链表
D、 在链表中,每个结点只有一个链域
7.带头结点head的单链表为空的判断条件是( )
A. head=NUIL B、 head->next=NUIL
C. head->next=head D. head!=NUIL
8.线性表通常采用两种存储结构是( )
A、 顺序存储结构和链式存储结构
B.散列方式和索引方式
C.链表存储结构和数组
D.线性存储结构和非线性存储结构
9.线性表采用链式存储时,结点的存储地址( )
A.必须是不连续的
B、 连续与否均可
C.必须是连续的
D.和头结点的存储地址相连续
10.将长度为n的单链表链接在长度为m的单链表之后的算法的时间复杂度为( )
A.O(1) B.O(n) C、 O(m) D.O(m+n)
11、在单链表中,指针p指向元素为x的结点,实现“删除x的后继”的语句是( )
A.p=p->next; B、 p->next=p->next->next;
C.p->next=p; D.p=p->next->next;
12.在头指针为head且表长大于1的单循环链表中,指针p指向表中某个结点,若p->next->next=head,则( )
A.p指向头结点 B.p指向尾结点
C.*p的直接后继是头结点 D、 *P的直接后继是尾
13.为了最快地对线性结构的数据进行某数据元素的读取操作,则其数据存储结构宜采用( )方式。
A、顺序存储 B.链式存储
C.索引存储 D.散列存储
二、判断题(判断下列各小题,正确的在题后括号内打“√”,错的打“╳”。)
1、单链表中的头结点就是单链表的第一个结点。( ╳ )
2、所谓数据的逻辑结构指的是数据元素之间的逻辑关系。(√ )
3、在线性结构中,每个结点都有一个直接前驱和一个直接后继。( ╳ )
三、填空题
1、在单链表中设置头结点的作用_ 简化插入删除算法。
2、.设head为带有头结点的单链表的头指针,则判断单链表为空的条件是:______ head->next= =NULL____。
3、.带头结点的循环链表L为空表的条件是_ L->next=L __ __。带头结点的双循环链表L为空表的条件是_ L->next=L->prior=L 。
4、在如图所示的链表中,若在指针p所指的结点之后插入数据域值相继为a和b的两个结点,则可用下列两个语句实现该操作,它们依次是_ __ s->next->next=p->next ____和_____ p->next=s_____。
5、.通常单链表的头结点指的是_ ____在单链表第一个节点之前增设的一个类型相同的结点___;单链表的首结点指的是__ ___表结点中的第一个结点___。
6、在一个带头结点的单循环链表中,p指向尾结点的直接前驱,则指向头结点的指针head可用p表示为 p->next->next=head 。
7、从顺序表中删除一个元素时,表中所有在被删元素之后的元素均需____ ____向前移动____一个位置。
1、简化插入删除算法.
2、head->next= =NULL_____。
3、 L->next=L ___。L->next=L->prior=L
4、__s->next->next=p->next______和_p->next=s_______。
5、_在单链表第一个结点之前增设的一个类型相同的结点_______; __表结点中的第一个结点______。
6、p->next->next=head 。
7、__向前移动__
四、算法阅读题
1、.以下函数中,h是带头结点的双向循环链表的头指针。
(1)说明程序的功能;
(2)当链表中结点数分别为1和6(不包括头结点)时,请写出程序中while循环体的执行次数。
int f(DListNode *h)
{
DListNode *p,*q;
int j=1;
p=h->next;
q=h->prior;
while((p!=q || p->prior!=q)&&(j!=0))
if(p->data==q->data)
{
p=p->next;
q=q->prior;
}
else j=0;
return j;
}
(1)是否对称
(2)1----0;6---3
2、阅读下面的算法
LinkList mynote(LinkList L)
{//L是不带头结点的单链表的头指针
if(L&&L->next){
q=L;L=L->next;p=L;
S1: while(p->next) p=p->next;
S2: p->next=q;q->next=NULL;
}
return L;
}
请回答下列问题:
(1)说明语句S1的功能;
(2)说明语句组S2的功能;
(3)设链表表示的线性表为(a1,a2, …,an),写出算法执行后的返回值所表示的线性表。
(1)查询表的尾节点
(2)将第一个节点链接到表的尾部成为新的尾节点
(3)(a2,a3,….an,a1)
五、应用题
1、假定在学生的档案中含有:姓名、学号、年龄、性别。如采用线性表作为数据结构来实现档案管理问题,分别给出线性表的在顺序实现下的类型定义和在链接实现下的类型定义。
2.假设以带头结点的单循环链表作非递减有序线性表的存储结构。请设计一个时间复杂度为O(n)的算法,删除表中所有数值相同的多余元素,并释放结点空间。例如:
(7,10,10,21,30,42,42,42,51,70)
经算法操作后变为
(7,10,21,30,42,51,70)
参考答案:
typedef struct node {
int data;
struct node * next;
}LinkList;
Delete_Eq(LinkList * head)
{
LinkList * p, * q, * s;
p=head;
do{
q= p->next;
if(p->data = = q->data)
{ s= q; free(s); q = q->next; }
else
p=q;
}while(p->next != head);
}
2、线性表逆置
void Convers(LinkList *head)
{
LinkList * p, *q, *r;
p = head;
q = p->next;
p->next = NULL;
while ( q!= NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head = p;
}