2线性表文档格式.docx
- 文档编号:21351823
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:21
- 大小:33.53KB
2线性表文档格式.docx
《2线性表文档格式.docx》由会员分享,可在线阅读,更多相关《2线性表文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
C.s->
p=s;
D.p->
s->
11、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q所指结点和p所指结点之间插入s结点,则执行()
As->
link=p->
link;
p->
link=s;
Bp->
link=s->
s->
link=p;
Cq->
Dp->
link=q;
12、在循环双链表的p所指结点之后插入s所指结点的操作是()。
right=s;
left=p;
right->
left=s;
right=p->
right;
B.p->
C.s->
D.s->
13、假设双链表结点的类型如下:
typedefstructlinknode
{intdata;
structlinknode*llink;
structlinknode*rlink;
}bnode;
下面给出的算法段是要把一个q所指新结点作为非空双向链表中的p所指结点的前驱结点插入到该双链表中,能正确完成要求的算法段是()。
A.q->
rlink=p;
q->
llink=q->
llink;
llink=q;
llink->
rlink=q;
llink=p->
C.q->
D.以上都不对
14、在一个单链表中,若删除p所指结点的后续结点,则执行()
A.p->
next->
B.p=p->
C.p->
D.p=p->
15.从一个具有n个结点的单链表中查找值等于x的结点时,在查找成功的情况下,需平均比较()个结点。
A.nB.n/2C.(n-1)/2D.(n+1)/2
16.在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()。
A.O
(1)B.O(n)C.O(n2)D.O(nlog2n)
17、给定有n个元素的向量,建立一个有序单链表的时间复杂度是()。
18.一个向量第一个元素的存储地址是100,每个元素的长度为2,则第3个元素的地址是()。
A.106B.108C.104D.120
二、填空题(15题)
1.向量、链表都是线性结构,可以在向量的位置插入和删除元素;
对于栈,只能在插入和删除元素;
对于队列,只能在插入元素和在删除元素。
2、向一个长度为n的向量的第i个元素(1<
=i<
=n+1)之前插入一个元素,需向后移动个元素。
3、从一个长度为n的向量中删除第i个元素(1<
=n),需向前移动个元素。
4.已知L是无头结点的单链表,且P结点即不是首元结点,也不是尾元结点,则在P之后插入结点S的语句序列为:
S->
next=P->
______;
5.已知L是无头结点的单链表,且P结点即不是首元结点,也不是尾元结点,则在P之后插入结点S的语句序列为:
;
P->
next=S;
6、现有如图所示存储结构,每个结点含两个域,data是字符型的数据域,next是指向结点的指针域。
datanext
1)请完成以上结点的类型定义和变量说明。
structlink
{chardata;
}*s,*p,*q;
2)请完成给指针s开辟存储单元的语句。
s=;
3)若现有如图所示的存储结构,要将数据域为‘B’的结点,从链中删除,请写出语句。
;
(或;
)
7、已知L是无头结点的单链表,且p结点即不是首元结点,也不是尾元结点,
则删除p的直接后继结点的语句序列为:
q=;
free();
8、在双链表中,每个结点有两个指针域,一个指向,另一个指向。
9、在一个单链表中的p所指结点之前插入一个s所指结点时,可执行如下操作:
(1)s->
next=;
(2)p->
(3)t=p->
data;
(4)p->
data=;
(5)s->
10、在一个单链表中删除p所指结点时,可执行如下操作:
q=p->
data=p->
或者p->
free(q);
11、带有一个头结点的单链表head为空的条件是:
。
12、不带有一个头结点的单链表head为空的条件是:
13、非空的循环单链表(头指针为head)的尾结点(由p所指向)满足条件。
14、假设在长度大于1的单循环链表中,既无头结点也无头指针,s为指向链表中某个结点的指针,则删除结点*s的直接前趋结点的程序段为:
q=s;
p=s->
while(){q=p;
p=p->
}
free();
15、若现有如图所示的存储结构,要将数据域为‘B’的结点,从链中删除,请写出语句。
三、编程(20题)
1、以下max函数的功能是:
查找带有头结点的单向链表中,结点数据域的最大值,并作为函数值返回。
链表结构如图所示,请填空。
·
head
structnode
{intdata;
structnode*next;
};
intmax(structnode*head)
{
}
2、在一不带头结点的单链表(其头指针为head)中查找值为x的结点,如果找到,将其删除。
(填充部分不限行数)
参考答案:
structlinknode*next;
}node;
voiddelete(head,x)
node*head;
intx;
{node*p,*q;
if(head==NULL)printf(“链表下溢\n”);
if(head->
data==x)
}
else
3、以下min函数的功能是:
查找带有头结点的单向链表中,结点数据域的最小值,并作为函数值返回。
链表结构如图所示,请完成程序。
intmin(structnode*head)
{
4、已知顺序表L,对其进行插入操作。
请完成以下程序段。
typedefintdatatype;
/*datatype是顺序表元素类型*/
#definemaxsize1024/*定义顺序表长度*/
typedefstruct
{datatypedata[maxsize];
/*data是存储顺序表元素的一维数组*/
intlast;
/*last指向顺序表当前终端结点位置*/
}sequentlist;
intINSERT(L,x,i)/*在顺序表L中第i个位置上插入结点x*/
sequentlist*L;
datatypex;
inti;
{intj;
if(((*L).last)>
=maxsize-1)/*表空间溢出*/
{printf(“overflow”);
returnNULL;
else
if(_)|(i>
(*L).last+2))/*非法位置*/
{printf(“error”);
else
{for(j=(*L).last;
j>
=i-1;
j--)/*第i个结点的下标值是i-1*/
___=(*L).data[j];
/*结点后移*/
(*L).data[i-1]=x;
/*插入x*/
___/*表的终端结点位置加1*/
return1;
5、已知顺序表L,对其进行删除操作。
}sequenlist;
intDELETE(L,i)/*从顺序表L中删除第i个位置上的结点*/
sequenlist*L;
{intj;
if(_____________||(i>
(*L).last+1))/*非法位置*/
{for(j=i;
j<
=(*L).last;
j++)/*第i个结点的下标值是i-1*/
___________________=(*L).data[j];
/*结点前移*/
__________________;
/*表的终端结点位置减1*/
6、设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法。
(1)找出最大值结点,且打印该数值;
(2)若该数值是偶数,则将其与直接后继结点的数值交换;
7.设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法。
(1)找出最小值结点,且打印该数值;
(2)若该数值是偶数,则将其直接后继结点删除;
8、已知一个向量A,其中的元素在按值非递减有序排列,编写一个函数插入一个元素x后保持该向量仍按非递减有序排列。
9、已知一个向量A,其中的元素在按值非递减有序排列,编写一个函数删除向量中多余的值相同的元素。
10、编写一个函数,将一个向量A(有n个元素,且任何元素均不为0)分拆成两个向量,使A中大于0的元素存放在B中,小于0的元素存放在C中。
11、编写一个函数从一个给定的向量A中删除元素值在x到y(x<
=y)之间的所有元素。
12、有两个向量A(有m个元素)和B(n个元素),其元素均以从小到大的升序排列,编写函数将它们合并成一个向量C,要求C的元素也是从小到大升序排列。
13、有一个单链表(不同结点的数据域值可能相同),其头指针为head,编写一个函数计算数据域为x的结点个数。
14、已知L1和L2分别指向两个单链表的头指针,且已知其长度分别为m和n。
编写算法将这两个链表连接在一起。
15、有一个单链表L(至少有1个结点),其头结点指针为head,编写一个函数将L逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。
16、有一个递增有序的单链表,头指针为head,编写函数向该单链表中插入一个元素为x的结点,使插入后该链表仍然有序。
17、有一个元素值非递减排列有序的单链表,编写函数删除表中多余的元素值相同的结点。
18、假设有两个已排好序的单链表A和B,编写函数将它们合并成一个链表C而不改变其有序性。
19、将顺序表(a0,a1,a2,a3,…,an-1)就地逆置。
20、编写算法在单链表上实现线性表的ListLength(head)运算。
2、线性表部分答案
1.C2.B3.B4.B5.B6.A7.C8.B9.A
10.B11.C12.D13.C14.A15.D16.B17.B18.C
1.任何栈顶队尾队尾
2.n-i+1
3.n-i
4._P->
next=S____
5.S->
next
6.1)structlink*next;
2)s=(structlink*)malloc(sizeof(structlink));
3)p->
next=q->
(或(*p).next=(*q).next;
free(q);
)
7.q=p->
next;
free(q);
8.直接前驱结点直接后续结点
9.p->
s->
data;
t;
10.p->
next;
q->
11.head->
next==NULL。
12.head==NULL。
13.p->
next==head。
14.p->
next!
=sq->
next=s;
free(p);
15.p->
1.
structnode
{structnode*p;
intm;
p=head->
m=p->
for(p=p->
p!
=’\0’;
p=p->
next)
if(m>
data)m=p->
returnm;
2.
{p=head;
head=head->
free(p);
{q=head;
p=head->
while(p!
=NULL&
&
data!
=x)
if(p->
{q=p;
if(p!
=NULL)
{q->
free(p);
}
else
printf(“未找到!
\n”);
3.
{structnode*p;
intm;
=NULL;
if(m>
4.
if(__i<
1__)|(i>
__(*L).data[j+1]__=(*L).data[j];
_(*L).last++;
__/*表的终端结点位置加1*/
5.
if(_____________||(i>
6.
typedefstructnode
{
intdata;
structnode*link;
}NODE;
voidfun(NODE*head)
intmax,t;
NODE*p,*q;
if(p!
{p=head;
max=p->
while(p!
{
if(max<
data){max=p->
q=p;
printf(“max=%d\n”,max);
if(max%2==0)
t=q->
data=q->
link->
data=t;
7.
intmin,t;
if(min>
data){min=p->
printf(“min=%d\n”,min);
if(min%2==0){
8.
voidinsert(vectorA,intn,intx)
{inti,j;
if(x>
=A[n])A[n+1]=x;
{i=0;
while(x>
A[i])I++;
for(j=n-1;
j>
=i;
j--)A[j+1]=A[j];
A[i]=x;
n++;
9、
voiddel(vectorA,intn)
{inti=0,j;
while(i<
n-1)
if(A[i]!
=A[i+1]i++;
{for(j=(i+2);
n;
j++)A[j-1]=A[j];
n--;
10、
voidret(vectorA,intn,vectorB,intp,vectorC,intq)
{inti;
p=0;
q=0;
for(i=0;
i<
=n-1;
i++)
{if(A[i]>
0)
{B[p]=A[i];
p++;
if(A[i]<
{C[q]=A[i];
q++;
11、
voiddel(vectorA,intn,intx,inty)
{inti,k;
if(A[i]>
=x&
A[i]<
=y)A[i]=0;
for(i=n-1;
i>
=0;
i--)
if(A[i]==0)
{for(k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性