数据结构(第二版)习题答案第3章教程文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构(第二版)习题答案第3章
3.1 选择题
第3章线性表的链式存储
(1)两个有序线性表分别具有n个元素与m个元素且n≤m,现将其归并成一个有序表,其最少的比较次数是( A )。
A.n B.m C.n− 1D.m + n
(2)非空的循环单链表 head 的尾结点(由 p 所指向)满足( C )。
A.p->next==NULL B.p==NULL C.p->next==head D.p==head (3)在带头结点的单链表中查找x应选择的程序体是( C )。
A.node *p=head->next; while (p && p->info!=x) p=p->next;
if (p->info==x) return p else return NULL;
B.node *p=head; while (p&& p->info!=x) p=p->next; return p;
C.node *p=head->next; while (p&&p->info!=x) p=p->next; return p;
D.node *p=head; while (p->info!=x) p=p->next ; return p;
(4)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( D )。
A.必须是连续的C.一定是不连续的B.部分地址必须是连续的D.连续不连续都可以
(5)在一个具有n个结点的有序单链表中插入一个新结点并保持单链表仍然有序的时间复杂度是( B )。
A.O(1) B.O(n) C.O(n2) D.O(n log
2n)(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 )。
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;
(10)在一个单链表中,若 p 所指结点不是最后结点,在 p 之后插入 s 所指结点,则执行( B )。
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;
3.2 设计一个算法,求一个单链表中的结点个数。
【答】:单链表存储结构定义如下(相关文件:linklist.h)
仅供学习与交流,如有侵权请联系网站删除谢谢2
#include
11 仅供学习与交流,如有侵权请联系网站删除谢谢3
#include
typedef struct node
{ int data;
struct node *next;
}linknode;
typedef linknode *linklist;
/*尾插法创建带头结点的单链表*/
linklist creatlinklist()
{ linklist head,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->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return head;
}
/*输出带头结点的单链表*/
void print(linklist head)
{ linklist p;
p=head->next;
printf("List is:\n");
while(p)
{ printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
基于上述结构定义,求单链表中的结点个数的算法程序如下:int count(linklist head)
{ int c=0;
linklist p=head;
while (p)
{c++;
仅供学习与交流,如有侵权请联系网站删除谢谢4
12
仅供学习与交流,如有侵权请联系网站删除谢谢5
p=p->next;
}
return c;
}
3.3 设计一个算法,求一个带头结点单链表中的结点个数。
【答】:带头结点的单链表的存储结构定义同题 3.2,实现本题功能的算法程序如下(3_3.c)#include "linklist.h"
int count(linklist head)
{ int c=0;
linklist p=head->next;
while (p)
{c++;
p=p->next;
}
return c;
}
main() /*测试函数*/
{linklist head;
head=creatlinklist();
print(head);
printf("\nLength of head is:%d",count(head));
getch();
}
当输入 5 个数据时,产生的输出结果如下图所示:
3.4 设计一个算法,在一个单链表中值为 y 的结点前面插入一个值为 x 的结点。即使值为 x 的
新结点成为值为 y 的结点的前驱结点。
【答】:
#include "linklist.h"
void insert(linklist head,int y,int x)
{/*在值为 y 的结点前插入一个值为 x 的结点*/
linklist pre,p,s;
pre=head;
p=head->next;
仅供学习与交流,如有侵权请联系网站删除谢谢6