数据结构第二版习题答案第3章Word文档下载推荐.docx
- 文档编号:15214804
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:17
- 大小:18.82KB
数据结构第二版习题答案第3章Word文档下载推荐.docx
《数据结构第二版习题答案第3章Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构第二版习题答案第3章Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
if(p->
info==x)returnpelsereturnNULL;
B.node*p=head;
while(p&
returnp;
C.node*p=head->
p->
D.node*p=head;
while(p->
next;
(4)线性表若采用链式存储结构时,要求存中可用存储单元的地址(D)。
A.必须是连续的
C.一定是不连续的
B.部分地址必须是连续的
D.连续不连续都可以
(5)在一个具有n个结点的有序单链表中插入一个新结点并保持单链表仍然有序的时间
复杂度是(B)。
A.O
(1)B.O(n)
C.O(n2)
D.O(nlog2n)
(6)用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队
尾结点,则在进行删除操作时(D)。
A.仅修改队头指针
C.队头、队尾指针都要修改
B.仅修改队尾指针
D.队头,队尾指针都可能要修改
(7)若从键盘输入n个元素,则建立一个有序单向链表的时间复杂度为(B)。
A.O(n)
B.O(n2)
C.O(n3)
D.O(n×
log2n)
(8)下面哪个术语与数据的存储结构无关(D)。
A.顺序表B.链表C.散列表
D.队列
(9)在一个单链表中,若删除p所指结点的后续结点,则执行(A)。
next=p->
next->
B.p=p->
C.p->
D.p=p->
(10)在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行(B)。
A.s->
next=p;
next=s;
B.s->
C.s->
p=s;
D.p->
s->
3.2设计一个算法,求一个单链表中的结点个数。
【答】:
单链表存储结构定义如下(相关文件:
linklist.h)
#include<
stdlib.h>
11
stdio.h>
typedefstructnode
{intdata;
structnode*next;
}linknode;
typedeflinknode*linklist;
/*尾插法创建带头结点的单链表*/
linklistcreatlinklist()
{linklisthead,r,x,s;
head=r=(linklist)malloc(sizeof(linknode));
printf("
\n请输入一组以0结束的整数序列:
\n"
);
scanf("
%d"
&
x);
while(x)
{s=(linklist)malloc(sizeof(linknode));
s->
data=x;
r->
r=s;
}
next=NULL;
returnhead;
}
/*输出带头结点的单链表*/
voidprint(linklisthead)
{linklistp;
p=head->
Listis:
while(p)
{printf("
%5d"
p->
data);
p=p->
基于上述结构定义,求单链表中的结点个数的算法程序如下:
intcount(linklisthead)
{intc=0;
linklistp=head;
while(p)
{c++;
12
returnc;
3.3设计一个算法,求一个带头结点单链表中的结点个数。
带头结点的单链表的存储结构定义同题3.2,实现本题功能的算法程序如下(3_3.c)
#include"
linklist.h"
linklistp=head->
main()
/*测试函数*/
{linklisthead;
head=creatlinklist();
print(head);
\nLengthofheadis:
count(head));
getch();
当输入5个数据时,产生的输出结果如下图所示:
3.4设计一个算法,在一个单链表中值为y的结点前面插入一个值为x的结点。
即使值为x的
新结点成为值为y的结点的前驱结点。
voidinsert(linklisthead,inty,intx)
{/*在值为y的结点前插入一个值为x的结点*/
linklistpre,p,s;
pre=head;
13
data!
=y)
{pre=p;
}
if(p)/*找到了值为y的结点*/
pre->
voidmain()
inty,x;
/*测试程序*/
/*创建单链表*/
/*输出单链表*/
\n请输入y与x的值:
%d%d"
y,&
insert(head,y,x);
程序的一种运行结果如下图所示:
3.5设计一个算法,判断一个单链表中各个结点值是否有序。
intissorted(linklisthead,charc)
/*当参数c=’a’时判断链表是否为升序,当参数c=’d’是判断链表是否为降序*/
{intflag=1;
switch(c)
{case'
a'
:
/*判断带头结点的单链表head是否为升序*/
14
next&
flag)
{if(p->
data<
=p->
data)p=p->
elseflag=0;
break;
case'
d'
/*判断带头结点的单链表head是否为降序*/
data>
returnflag;
intmain()/*测试程序*/
{linklisthead;
if(issorted(head,'
))printf("
单链表head是升序排列的!
else
单链表head是降序排列的!
elseprintf("
单链表head是无序的!
程序运行时的三种输出结果如下图所示:
3.6设计一个算法,利用单链表原来的结点空间将一个单链表就地转置。
voidverge(linklisthead)
{/*本函数的功能是就地倒置带头结点的单链表*/
15
linklistp,q;
head->
{q=p;
/*每次从原表取一个结点插入到新表的最前面*/
q->
next=head->
next=q;
intmain()
/*输出原单链表*/
verge(head);
/*就地倒置单链表*/
/*输出倒置后的单链表*/
3.7设计一个算法,将一个结点值自然数的单链表拆分为两个单链表,原表中保留值为偶数的
结点,而值为奇数的结点按它们在原表中的相对次序组成一个新的单链表。
linklistsprit(linklisthead)
{/*将带头结点的单链表head中的奇数值结点删除生成新的单链表并返回*/
linklistL,pre,p,r;
L=r=(linklist)malloc(sizeof(linknode));
r->
pre=head;
p=head->
while(p)
{if(p->
data%2==1)
{pre->
r=p;
p=pre->
}
else
{pre=p;
p=p->
/*删除奇数值结点*/
/*保留偶数值结点*/
16
returnL;
/*置链表结束标记*/
{linklisthead,L;
head=creatlinklist
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第二 习题 答案