《数据结构》系统答案严蔚敏李冬梅人民邮电出版社

合集下载

数据结构(C语言版)第2版习题答案—严蔚敏

数据结构(C语言版)第2版习题答案—严蔚敏

数据结构(C语言版)(第2版)课后习题答案李冬梅2015.3目录第1章绪论 (1)第2章线性表 (5)第3章栈和队列 (14)第4章串、数组和广义表 (27)第5章树和二叉树 (34)第6章图 (44)第7章查找 (55)第8章排序 (66)第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

第1章4.答案:(1)顺序存储结构顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。

(2)链式存储结构顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。

但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。

所以链式存储结构通常借助于程序设计语言的指针类型来描述。

5. 选择题(1)~(6):CCBDDA6.(1)O(1) (2)O(m*n) (3)O(n2)(4)O(log3n) (5)O(n2) (6)O(n)第2章1.选择题(1)~(5):BABAD (6)~(10):BCABD (11)~(15):CDDAC 2.算法设计题(1)将两个递增的有序链表合并为一个递增的有序链表。

要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。

表中不允许有重复的数据。

[题目分析]合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的最后。

如果两个表中的元素相等,只摘取La表中的元素,删除Lb表中的元素,这样确保合并后表中无重复的元素。

当一个表到达表尾结点,为空时,将非空表的剩余元素直接链接在Lc表的最后。

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){//合并链表La和Lb,合并后的新表使用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa && pb){ if(pa->data<pb->data){pc->next=pa; pc=pa; pa=pa->next;}//取较小者La中的元素,将pa链接在pc的后面,pa指针后移else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移else //相等时取La中的元素,删除Lb中的元素{pc->next=pa;pc=pa;pa=pa->next;q=pb->next; delete pb ; pb =q;}}pc->next=pa?pa:pb; //插入剩余段delete Lb; //释放Lb的头结点}(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。

数据结构答案(严蔚敏版)

数据结构答案(严蔚敏版)

InitQueue(Q);
// 置空的辅助队列 Q
if (T) EnQueue(Q, T); // 根结点入队列
while (!QueueEmpty(Q)) {
DeQueue(Q, p); // 队头元素出队并置为 p
Visit(p);
if (p->Lchild)
EnQueue(Q, p->Lchild); // 左子树根入队列
Void exchg_tree(BiTree BT)
{if (BT!=null)
/*非空*/
{exchg_tree(BT->lchild); /*交换左子树所有结点指针*/
exchg_tree(BT->rchild); /*交换右子树所有结点指针*/
p=BT->lchild;
/*交换根结点左右指针*/
1
9.左边是前驱右边是后继
六、算法设计题 1.解:思路:输出叶子结点比较简单,用任何一种遍历递归算法,凡是左右指针均空者,则为叶子,将其打印出来。 法一:核心部分为: LeafCount (BiTree T) /*中序遍历 递归函数*/ {if(T!=NULL) {if((T ->lchild==NULL)&&( T ->rchild==NULL)){sum++; printf("%d\n", T ->data);}
递归程序执行完毕之后才能出栈,这样才能实现逆序。
7. 解:方案 1;哈夫曼编码先将概率放大 100 倍,以方便构造哈夫曼树。
w={7,19,2,6,32,3,21,10},按哈夫曼规则:【[(2,3),6], (7,10)】, ……19, 21, 32

数据结构课后答案,严蔚敏版

数据结构课后答案,严蔚敏版

void change ( SqList &L ) //写法1 { for(i=1, j=L.length; i<j; i++, j--) L.elem[i] ↔ L.elem[j]; }
习题2.22 单链表逆序 typedef struct LNode { int data; struct LNode *next; } *LinkList; void Inverse(LinkList &L) { LinkList p, q; p=L->next; while( p->next!=NULL) { q=p->next; p->next=q->next; q->next=L->next; L->next=q; } }
习题2.25 方法3
int Intersection(SqList La, SqList Lb, SqList &Lc) { int i, j, k;
if(La.length==0||Lb.length==0) return(0); //Lc.listsize=La.length<Lb.length?La.length:Lb.length; //Lc.elem=(int *)malloc(Lc.listsize*sizeof(int));
void main( ) { LinkList L1, L2, L3; int num; printf("\n初始化集合1,请输入集合1的元素个数:\n"); scanf("%d", &num); CreateList (L1, num); printf("输出集合1: "); OutputList(L1); printf("\n初始化集合2,请输入集合2的元素个数: \n"); scanf("%d", &num); CreateList(L2, num); printf("输出集合2: "); OutputList(L2); Intersection(L1, L2, L3); printf("\n输出集合1和集合2的交运算结果: "); OutputList(L3); }

严蔚敏版数据结构课后习题答案-完整版

严蔚敏版数据结构课后习题答案-完整版

第1章绪论1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

解:数据是对客观事物的符号表示。

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

是对一般数据类型的扩展。

1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。

一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。

抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。

在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

1.3 设有数据结构(D,R),其中{}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r =试按图论中图的画法惯例画出其逻辑结构图。

解:1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。

解:ADT Complex{数据对象:D={r,i|r,i 为实数}数据关系:R={<r,i>}基本操作: InitComplex(&C,re,im)操作结果:构造一个复数C ,其实部和虚部分别为re和imDestroyCmoplex(&C)操作结果:销毁复数CGet(C,k,&e)操作结果:用e返回复数C的第k元的值Put(&C,k,e)操作结果:改变复数C的第k元的值为eIsAscending(C)操作结果:如果复数C的两个元素按升序排列,则返回1,否则返回0IsDescending(C)操作结果:如果复数C的两个元素按降序排列,则返回1,否则返回0Max(C,&e)操作结果:用e返回复数C的两个元素中值较大的一个Min(C,&e)操作结果:用e返回复数C的两个元素中值较小的一个}ADT ComplexADT RationalNumber{数据对象:D={s,m|s,m为自然数,且m不为0}数据关系:R={<s,m>}基本操作:InitRationalNumber(&R,s,m)操作结果:构造一个有理数R,其分子和分母分别为s和mDestroyRationalNumber(&R)操作结果:销毁有理数RGet(R,k,&e)操作结果:用e返回有理数R的第k元的值Put(&R,k,e)操作结果:改变有理数R的第k元的值为eIsAscending(R)操作结果:若有理数R的两个元素按升序排列,则返回1,否则返回0IsDescending(R)操作结果:若有理数R的两个元素按降序排列,则返回1,否则返回0Max(R,&e)操作结果:用e返回有理数R的两个元素中值较大的一个Min(R,&e)操作结果:用e返回有理数R的两个元素中值较小的一个}ADT RationalNumber1.5 试画出与下列程序段等价的框图。

【课后习题及答案】严蔚敏-数据结构课后习题及答案解析

【课后习题及答案】严蔚敏-数据结构课后习题及答案解析

6.算 法 的 五 个 重 要 特 性 是 _______、_______、______、_______、_______。 7.数据结构的三要素是指______、_______和________。 8.链式存储结构与顺序存储结构相比较,主要优点是 ________________________________。 9.设有一批数据元素,为了最快的存储某元素,数据结构宜用_________ 结构,为了方便插入一个元素,数据结构宜用____________结构。
四、算法分析题
for(i=1; i<=n; i++) for(j =1; j <=i ; j++) x=x+1; 分 析 :该 算 法 为 一 个 二 重 循 环 ,执 行 次 数 为 内 、外 循 环 次 数 相 乘 ,但 内 循环次数不固定,与外循环有关,因些,时间频度 T(n)=1+2+3+…+n=n*(n+1)/2 有 1/4≤T(n)/n2≤1,故它的时间复杂度为O(n2), 即T(n)与 n2 数 量级相同。 2、分析下列算法段的时间频度及时间复杂度 for (i=1;i<=n;i++) for (j=1;j<=i;j++) for ( k=1;k<=j;k++) x=i+j-k; 分析算法规律可知时间频度 T(n)=1+(1+2)+(1+2+3)+...+(1+2+3+…+n) 由于有 1/6 ≤ T(n)/ n3 ≤1,故时间复杂度为O(n3)
精品课程
课后习题答案数据结构-严来自敏 课后习题及答案解析第一章 绪论

严蔚敏数据结构课后习题及答案解析

严蔚敏数据结构课后习题及答案解析

第一章绪论一、选择题1.组成数据的基本单位是()(A)数据项(B)数据类型(C)数据元素(D)数据变量2.数据结构是研究数据的()以及它们之间的相互关系。

(A)理想结构,物理结构(B)理想结构,抽象结构(C)物理结构,逻辑结构(D)抽象结构,逻辑结构3.在数据结构中,从逻辑上可以把数据结构分成()(A)动态结构和静态结构(B)紧凑结构和非紧凑结构(C)线性结构和非线性结构(D)内部结构和外部结构4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。

①(A)数据元素(B)计算方法(C)逻辑存储(D)数据映像②(A)结构(B)关系(C)运算(D)算法5.算法分析的目的是()。

(A)找出数据结构的合理性(B)研究算法中的输入和输出的关系(C)分析算法的效率以求改进(D)分析算法的易懂性和文档性6.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。

①(A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法②(A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性(C)确定性、有穷性和稳定性(D)易读性、稳定性和安全性二、判断题1.数据的机内表示称为数据的存储结构。

()2.算法就是程序。

()3.数据元素是数据的最小单位。

()4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。

()5.算法的时间复杂度取决于问题的规模和待处理数据的初态。

()三、填空题1.数据逻辑结构包括________、________、_________ 和_________四种类型,其中树形结构和图形结构合称为_____。

2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后续结点,其余每个结点有且只有_______个后续结点。

3.在树形结构中,树根结点没有_______结点,其余每个结点有且只有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________。

严蔚敏版数据结构课后习题答案-完整版

严蔚敏版数据结构课后习题答案-完整版

第1章 绪论之巴公井开创作简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和笼统数据类型.解:数据是对客观事物的符号暗示.在计算机科学中是指所有能输入到计算机中并被计算机法式处置的符号的总称.数据元素是数据的基本单元,在计算机法式中通常作为一个整体进行考虑和处置.数据对象是性质相同的数据元素的集合,是数据的一个子集. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合.存储结构是数据结构在计算机中的暗示.数据类型是一个值的集合和界说在这个值集上的一组把持的总称.笼统数据类型是指一个数学模型以及界说在该模型上的一组把持.是对一般数据类型的扩展.试描述数据结构和笼统数据类型的概念与法式设计语言中数据类型概念的区别.解:笼统数据类型包括一般数据类型的概念,但含义比一般数据类型更广、更笼统.一般数据类型由具体语言系统内部界说,直接提供给编程者界说用户数据,因此称它们为预界说数据类型.笼统数据类型通常由编程者界说,包括界说它所使用的数据和在这些数据上所进行的把持.在界说笼统数据类型中的数据部份和把持部份时,要求只界说到数据的逻辑结构和把持说明,不考虑数据的存储结构和把持的具体实现,这样笼统条理更高,更能为其他用户提供良好的使用接口.1.3 设有数据结构(D,R),其中{}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r =试按图论中图的画法惯例画出其逻辑结构图.解:1.4 试仿照三元组的笼统数据类型分别写出笼统数据类型复数和有理数的界说(有理数是其分子、分母均为自然数且分母不为零的分数).解:ADT Complex{数据对象:D={r,i|r,i为实数}数据关系:R={<r,i>}基本把持:InitComplex(&C,re,im)把持结果:构造一个复数C,其实部和虚部份别为re和imDestroyCmoplex(&C)把持结果:销毁复数CGet(C,k,&e)把持结果:用e返回复数C的第k元的值Put(&C,k,e)把持结果:改变复数C的第k元的值为eIsAscending(C)把持结果:如果复数C的两个元素按升序排列,则返回1,否则返回0IsDescending(C)把持结果:如果复数C的两个元素按降序排列,则返回1,否则返回0Max(C,&e)把持结果:用e返回复数C的两个元素中值较年夜的一个Min(C,&e)把持结果:用e返回复数C的两个元素中值较小的一个}ADT ComplexADT RationalNumber{数据对象:D={s,m|s,m为自然数,且m不为0}数据关系:R={<s,m>}基本把持:InitRationalNumber(&R,s,m)把持结果:构造一个有理数R,其分子和分母分别为s和mDestroyRationalNumber(&R)把持结果:销毁有理数RGet(R,k,&e)把持结果:用e返回有理数R的第k元的值Put(&R,k,e)把持结果:改变有理数R的第k元的值为eIsAscending(R)把持结果:若有理数R的两个元素按升序排列,则返回1,否则返回0IsDescending(R)把持结果:若有理数R的两个元素按降序排列,则返回1,否则返回0Max(R,&e)把持结果:用e返回有理数R的两个元素中值较年夜的一个Min(R,&e)把持结果:用e返回有理数R的两个元素中值较小的一个}ADT RationalNumber1.5 试画出与下列法式段等价的框图.(1) product=1; i=1;while(i<=n){product *= i;i++;}(2) i=0;do {i++;} while((i!=n) && (a[i]!=x));(3) switch {case x<y: z=y-x; break;case x=y: z=abs(x*y); break;default: z=(x-y)/abs(x)*abs(y);}1.6 在法式设计中,经常使用下列三种分歧的犯错处置方式:(1) 用exit语句终止执行并陈说毛病;(2) 以函数的返回值区别正确返回或毛病返回;(3) 设置一个整型变量的函数参数以区别正确返回或某种毛病返回.试讨论这三种方法各自的优缺点.解:(1)exit经常使用于异常毛病处置,它可以强行中断法式的执行,返回把持系统.(2)以函数的返回值判断正确与否经常使用于子法式的测试,便于实现法式的局部控制.(3)用整型函数进行毛病处置的优点是可以给犯毛病类型,便于迅速确定毛病.1.7 在法式设计中,可采纳下列三种方法实现输出和输入:(1) 通过scanf和printf语句;(2) 通过函数的参数显式传递;(3) 通过全局变量隐式传递.试讨论这三种方法的优缺点.解:(1)用scanf和printf直接进行输入输出的好处是形象、直观,但缺点是需要对其进行格式控制,较为烦琐,如果呈现毛病,则会引起整个系统的解体.(2)通过函数的参数传递进行输入输出,便于实现信息的隐蔽,减少犯错的可能.(3)通过全局变量的隐式传递进行输入输出最为方便,只需修改变量的值即可,但过多的全局变量使法式的维护较为困难.1.8 设n为正整数.试确定下列各法式段中前置以记号@的语句的频度:(1) i=1; k=0;while(i<=n-1){@ k += 10*i;i++;}(2) i=1; k=0;do {@ k += 10*i;i++;} while(i<=n-1);(3) i=1; k=0;while (i<=n-1) { i++;@ k += 10*i;}(4) k=0;for(i=1; i<=n; i++) {for(j=i; j<=n; j++)@ k++;}(5) for(i=1; i<=n; i++) {for(j=1; j<=i; j++) {for(k=1; k<=j; k++)@ x += delta;}(6) i=1; j=0;while(i+j<=n) { @ if(i>j) j++;else i++;}(7) x=n; y=0; // n是不小于1的常数while(x>=(y+1)*(y+1)) {@ y++;}(8) x=91; y=100;while(y>0) {@ if(x>100) { x -= 10; y--; }else x++;}解:(1) n-1(2) n-1(3) n-1(4) n+(n-1)+(n-2)+...+1=2)1(+ n n(5) 1+(1+2)+(1+2+3)+...+(1+2+3+...+n)=∑=+ nii i12)1(=∑∑∑∑====+=+=+ninininiiiiii i1121212121)(21)1(21=)32)(1(121)1(41)12)(1(121++=++++nnnnnnnn(6) n(7)⎣⎦n向下取整(8) 11001.9 假设n为2的乘幂,而且n>2,试求下列算法的时间复杂度及变量count的值(以n的函数形式暗示).int Time(int n) { count = 0;x=2; while(x<n/2) { x *= 2;count++; }return count; }解:)(log 2n o count=2log 2-n1.11 已知有实现同一功能的两个算法,其时间复杂度分别为()nO 2和()10n O ,假设现实计算机可连续运算的时间为710秒(100多天),又每秒可执行基本把持(根据这些把持来估算算法时间复杂度)510次.试问在此条件下,这两个算法可解问题的规模(即n 值的范围)各为几多?哪个算法更适宜?请说明理由.解:12102=n n=40 121010=n n=16则对同样的循环次数n,在这个规模下,第二种算法所花费的价格要年夜很多.故在这个规模下,第一种算法更适宜. 1.12 设有以下三个函数:()10002124++=n n n f ,()3450015n n n g +=,()n n n n h log 5005.3+= 请判断以下断言正确与否:(1) f(n)是O(g(n)) (2) h(n)是O(f(n)) (3) g(n)是O(h(n)) (4) h(n)是O(n)(5) h(n)是O(nlogn)解:(1)对 (2)错 (3)错 (4)对 (5)错1.13 试设定若干n 值,比力两函数2n 和n n 2log 50的增长趋势,并确定n 在什么范围内,函数2n 的值年夜于n n 2log 50的值.解:2n 的增长趋势快.但在n 较小的时候,n n 2log 50的值较年夜. 当n>438时,n n n 22log 50>1.14 判断下列各对函数()n f 和()n g ,那时∞→n ,哪个函数增长更快?(1) ()()310!ln 102nn n n f ++=,()724++=n n n g(2)()()()25!ln +=n n f ,()5.213n n g =(3)()141.2++=n n n f ,()()()n n n g +=2!ln (4) ()()()2223n n n f +=,()()52n n n g n +=解:(1)g(n)快 (2)g(n)快 (3)f(n)快 (4) f(n)快5 试用数学归纳法证明: (1) ()()6/12112++=∑=n n n ini ()0≥n(2) ()()1/11--=+=∑x xx n ni i()0,1≥≠n x(3) 12211-=∑=-n ni i ()1≥n(4) ()2112n i n i =-∑=()1≥n1.16 试写一算法,自年夜至小依次输出顺序读入的三个整数X,Y 和Z 的值解:int max3(int x,int y,int z) {if(x>y)if(x>z) return x; else return z; elseif(y>z) return y; else return z; }1.17 已知k 阶斐波那契序列的界说为0=f ,01=f ,…,02=-k f ,11=-k f ;kn n n n f f f f ---+++= 21, ,1,+=k k n试编写求k 阶斐波那契序列的第m 项值的函数算法,k 和m 均以值调用的形式在函数参数表中呈现.解:k>0为阶数,n 为数列的第n 项 int Fibonacci(int k,int n) {if(k<1) exit(OVERFLOW);int *p,x;p=new int[k+1];if(!p) exit(OVERFLOW);int i,j;for(i=0;i<k+1;i++){if(i<k-1) p[i]=0;else p[i]=1;}for(i=k+1;i<n+1;i++){x=p[0];for(j=0;j<k;j++) p[j]=p[j+1];p[k]=2*p[k-1]-x;}return p[k];}1.18 假设有A,B,C,D,E五个高等院校进行田径对立赛,各院校的,并输出.解:typedef enum{A,B,C,D,E} SchoolName;typedef enum{Female,Male} SexType;typedef struct{char event[3]; //项目SexType sex;SchoolName school;int score;} Component;typedef struct{int MaleSum;//男团总分int FemaleSum;//女团总分int TotalSum;//团体总分} Sum;Sum SumScore(SchoolName sn,Component a[],int n){Sum temp;temp.MaleSum=0; temp.FemaleSum=0; temp.TotalSum=0; int i;for(i=0;i<n;i++){ if(a[i].school==sn){if(a[i].sex==Male) temp.MaleSum+=a[i].score;if(a[i].sex==Female) temp.FemaleSum+=a[i].score; } }temp.TotalSum=temp.MaleSum+temp.FemaleSum; return temp; }1.19 试编写算法,计算ii 2!*的值并存入数组a[0..arrsize-1]的第i-1个分量中(i=1,2,…,n).假设计算机中允许的整数最年夜值为maxint,则当n>arrsize 或对某个()n k k ≤≤1,使int max 2!>•kk 时,应按犯错处置.注意选择你认为较好的犯错处置方法.解:#include<iostream.h> #include<stdlib.h> #define MAXINT 65535 #define ArrSize 100 int fun(int i); int main() {int i,k;int a[ArrSize]; cout<<"Enter k:"; cin>>k;if(k>ArrSize-1) exit(0); for(i=0;i<=k;i++){ if(i==0) a[i]=1; else{if(2*i*a[i-1]>MAXINT) exit(0); else a[i]=2*i*a[i-1]; }}for(i=0;i<=k;i++){if(a[i]>MAXINT) exit(0); else cout<<a[i]<<" "; }return 0; }1.20 试编写算法求一元多项式的值()∑==ni ii n x a x P 0的值()0x P n ,并确定算法中每一语句的执行次数和整个算法的时间复杂度.注意选择你认为较好的输入和输出方法.本题的输入为()n i a i ,,1,0 =,0x 和n ,输出为()0x P n .解:#include<iostream.h> #include<stdlib.h> #define N 10double polynomail(int a[],int i,double x,int n); int main() {double x; int n,i; int a[N];cout<<"输入变量的值x:"; cin>>x;cout<<"输入多项式的阶次n:"; cin>>n;if(n>N-1) exit(0);cout<<"输入多项式的系数a[0]--a[n]:"; for(i=0;i<=n;i++) cin>>a[i]; cout<<"The polynomail value is"<<polynomail(a,n,x,n)<<endl; return 0; }double polynomail(int a[],int i,double x,int n) {if(i>0) return a[n-i]+polynomail(a,i-1,x,n)*x;else return a[n];}本算法的时间复杂度为o(n).第2章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点).解:头指针是指向链表中第一个结点的指针.首元结点是指链表中存储第一个数据元素的结点.头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的把持.它可以对空表、非空表以及首元结点的把持进行统一处置.2.2 填空题.解:(1) 在顺序表中拔出或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关.(2) 顺序表中逻辑上相邻的元素的物理位置肯定紧邻.单链表中逻辑上相邻的元素的物理位置纷歧定紧邻.(3) 在单链表中,除首元结点外,任一结点的存储位置由其前驱结点的链域的值指示.(4) 在单链表中设置头结点的作用是拔出和删除首元结点时不用进行特殊处置.2.3 在什么情况下用顺序表比链表好?解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取.2.4 对以下单链表分别执行下列各法式段,并画出结果示意图.解:2.5 画出执行下列各行语句后各指针及链表的示意图.L=(LinkList)malloc(sizeof(LNode));P=L;for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode));P=P->next;P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的谜底中选择合适的语句序列.a. 在P结点后拔出S结点的语句序列是__________________.b. 在P结点前拔出S结点的语句序列是__________________.c. 在表首拔出S结点的语句序列是__________________.d. 在表尾拔出S结点的语句序列是__________________.(1) P->next=S;(2) P->next=P->next->next;(3) P->next=S->next;(4) S->next=P->next;(5) S->next=L;(6) S->next=NULL;(7) Q=P;(8) while(P->next!=Q) P=P->next;(9) while(P->next!=NULL) P=P->next;(10) P=Q;(11) P=L;(12) L=S;(13) L=P;解:a. (4) (1)b. (7) (11) (8) (4) (1)c. (5) (12)d. (9) (1) (6)2.7 已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的谜底中选择合适的语句序列.a. 删除P结点的直接后继结点的语句序列是____________________.b. 删除P结点的直接前驱结点的语句序列是____________________.c. 删除P结点的语句序列是____________________.d. 删除首元结点的语句序列是____________________.e. 删除尾元结点的语句序列是____________________.(1) P=P->next;(2) P->next=P;(3) P->next=P->next->next;(4) P=P->next->next;(5) while(P!=NULL) P=P->next;(6) while(Q->next!=NULL) { P=Q; Q=Q->next; }(7) while(P->next!=Q) P=P->next;(8) while(P->next->next!=Q) P=P->next;(9) while(P->next->next!=NULL) P=P->next;(10) Q=P;(11) Q=P->next;(12) P=L;(13) L=L->next;(14) free(Q);解:a. (11) (3) (14)b. (10) (12) (8) (3) (14)c. (10) (12) (7) (3) (14)d. (12) (11) (3) (14)e. (9) (11) (3) (14)2.8 已知P结点是某双向链表的中间结点,试从下列提供的谜底中选择合适的语句序列.a. 在P结点后拔出S结点的语句序列是_______________________.b. 在P结点前拔出S结点的语句序列是_______________________.c. 删除P结点的直接后继结点的语句序列是_______________________.d. 删除P结点的直接前驱结点的语句序列是_______________________.e. 删除P结点的语句序列是_______________________.(1) P->next=P->next->next;(2) P->priou=P->priou->priou;(3) P->next=S;(4) P->priou=S;(5) S->next=P;(6) S->priou=P;(7) S->next=P->next;(8) S->priou=P->priou;(9) P->priou->next=P->next;(10) P->priou->next=P;(11) P->next->priou=P;(12) P->next->priou=S;(13) P->priou->next=S;(14) P->next->priou=P->priou;(15) Q=P->next;(16) Q=P->priou;(17) free(P);(18) free(Q);解:a. (7) (3) (6) (12)b. (8) (4) (5) (13)c. (15) (1) (11) (18)d. (16) (2) (10) (18)e. (14) (9) (17)2.9 简述以下算法的功能.(1) Status A(LinkedList L) { //L是无表头结点的单链表if(L && L->next) {Q=L;L=L->next;P=L;while(P->next) P=P->next;P->next=Q;Q->next=NULL;}return OK;}(2) void BB(LNode *s, LNode *q) {p=s;while(p->next!=q) p=p->next;p->next =s;}void AA(LNode *pa, LNode *pb) {//pa和pb分别指向单循环链表中的两个结点BB(pa,pb);BB(pb,pa);}解:(1) 如果L的长度不小于2,将L的首元结点酿成尾元结点.(2) 将单循环链表拆成两个单循环链表.2.10 指出以下算法中的毛病和低效之处,并将它改写为一个既正确又高效的算法.Status DeleteK(SqList &a,int i,int k){//本过程从顺序存储结构的线性表a中删除第i个元素起的k 个元素if(i<1||k<0||i+k>a.length) return INFEASIBLE;//参数分歧法else {for(count=1;count<k;count++){//删除第一个元素for(j=a.length;j>=i+1;j--) a.elem[j-i]=a.elem[j];a.length--;}return OK;}解:Status DeleteK(SqList &a,int i,int k){//从顺序存储结构的线性表a中删除第i个元素起的k个元素//注意i的编号从0开始int j;if(i<0||i>a.length-1||k<0||k>a.length-i) return INFEASIBLE;for(j=0;j<=k;j++)a.elem[j+i]=a.elem[j+i+k];a.length=a.length-k;return OK;}2.11 设顺序表va中的数据元素递增有序.试写一算法,将x拔出到顺序表的适当位置上,以坚持该表的有序性.解:Status InsertOrderList(SqList &va,ElemType x){//在非递加的顺序表va中拔出元素x并使其仍成为顺序表的算法int i;if(va.length==va.listsize)return(OVERFLOW);for(i=va.length;i>0,x<va.elem[i-1];i--)va.elem[i]=va.elem[i-1];va.elem[i]=x;va.length++;return OK;}2.12 设()m a a A ,,1 =和()n b b B ,,1 =均为顺序表,A '和B '分别为A 和B 中除去最年夜共同前缀后的子表.若='='B A 空表,则B A =;若A '=空表,而≠'B 空表,或者两者均不为空表,且A '的首元小于B '的首元,则B A <;否则B A >.试写一个比力A ,B 年夜小的算法.解:Status CompareOrderList(SqList &A,SqList &B){int i,k,j;k=A.length>B.length?A.length:B.length;for(i=0;i<k;i++){if(A.elem[i]>B.elem[i]) j=1;if(A.elem[i]<B.elem[i]) j=-1;}if(A.length>k) j=1;if(B.length>k) j=-1;if(A.length==B.length) j=0;return j;}2.13 试写一算法在带头结点的单链表结构上实现线性表把持Locate(L,x);解:int LocateElem_L(LinkList &L,ElemType x){int i=0;LinkList p=L;while(p&&p->data!=x){p=p->next;i++;}if(!p) return 0;else return i;}2.14 试写一算法在带头结点的单链表结构上实现线性表把持Length(L).解://返回单链表的长度int ListLength_L(LinkList &L) {int i=0;。

数据结构C语言版严蔚敏人民邮电出版社课后习题答案(精品课件)

数据结构C语言版严蔚敏人民邮电出版社课后习题答案(精品课件)

数据结构(C语言版)(第2版)课后习题答案李冬梅2015.3目录第1章绪论 (1)第2章线性表 (11)第3章栈和队列 (34)第4章串、数组和广义表 (67)第5章树和二叉树 (86)第6章图 (109)第7章查找 (132)第8章排序 (157)第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

1 / 184数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

严蔚敏数据结构课后习题及答案解析

严蔚敏数据结构课后习题及答案解析

第一章绪论一、选择题1.组成数据的基本单位是A数据项B数据类型C数据元素D数据变量2.数据结构是研究数据的以及它们之间的相互关系;A理想结构,物理结构B理想结构,抽象结构C物理结构,逻辑结构D抽象结构,逻辑结构3.在数据结构中,从逻辑上可以把数据结构分成A动态结构和静态结构B紧凑结构和非紧凑结构C线性结构和非线性结构D内部结构和外部结构4.数据结构是一门研究非数值计算的程序设计问题中计算机的①以及它们之间的②和运算等的学科;① A数据元素B计算方法C逻辑存储D数据映像② A结构B关系C运算D算法5.算法分析的目的是;A 找出数据结构的合理性B研究算法中的输入和输出的关系C分析算法的效率以求改进D分析算法的易懂性和文档性6.计算机算法指的是①,它必须具备输入、输出和②等5个特性;① A计算方法B排序方法C解决问题的有限运算序列D调度方法② A可执行性、可移植性和可扩充性B可行性、确定性和有穷性C确定性、有穷性和稳定性D易读性、稳定性和安全性二、判断题1.数据的机内表示称为数据的存储结构;2.算法就是程序;3.数据元素是数据的最小单位;4.算法的五个特性为:有穷性、输入、输出、完成性和确定性;5.算法的时间复杂度取决于问题的规模和待处理数据的初态;三、填空题1.数据逻辑结构包括________、________、_________ 和_________四种类型,其中树形结构和图形结构合称为_____;2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后续结点,其余每个结点有且只有_______个后续结点;3.在树形结构中,树根结点没有_______结点,其余每个结点有且只有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________;4.在图形结构中,每个结点的前驱结点数和后续结点数可以_________;5.线性结构中元素之间存在________关系,树形结构中元素之间存在______关系,图形结构中元素之间存在_______关系;6.算法的五个重要特性是_______、_______、______、_______、_______;7.数据结构的三要素是指______、_______和________;8.链式存储结构与顺序存储结构相比较,主要优点是________________________________;9.设有一批数据元素,为了最快的存储某元素,数据结构宜用_________结构,为了方便插入一个元素,数据结构宜用____________结构;四、算法分析题1.求下列算法段的语句频度及时间复杂度参考答案:一、选择题1. C 3. C 4. A、B 5. C 、B二、判断题:1、√2、×3、×4、×5、√三、填空题1、线性、树形、图形、集合;非线性网状2、没有;1;没有;13、前驱;1;后继;任意多个4、任意多个5、一对一;一对多;多对多6、有穷性;确定性;可行性;输入;输出7、数据元素;逻辑结构;存储结构8、插入、删除、合并等操作较方便9、顺序存储;链式存储四、算法分析题fori=1; i<=n; i++forj =1; j <=i ; j++x=x+1;分析:该算法为一个二重循环,执行次数为内、外循环次数相乘,但内循环次数不固定,与外循环有关,因些,时间频度Tn=1+2+3+…+n=nn+1/2有1/4≤Tn/n2≤1,故它的时间复杂度为On2, 即Tn与n2 数量级相同; 2、分析下列算法段的时间频度及时间复杂度for i=1;i<=n;i++for j=1;j<=i;j++for k=1;k<=j;k++x=i+j-k;分析算法规律可知时间频度Tn=1+1+2+1+2+3+...+1+2+3+…+n由于有1/6 ≤ Tn/ n3 ≤1,故时间复杂度为On3第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是A110 B108C100 D1202. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动个元素;A64B63 C D73.线性表采用链式存储结构时,其地址;A 必须是连续的B 部分地址必须是连续的C 一定是不连续的D 连续与否均可以4. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行As->next=p;p->next=s; B s->next=p->next;p->next=s;Cs->next=p->next;p=s; Dp->next=s;s->next=p;5.在一个单链表中,若删除p所指结点的后续结点,则执行Ap->next=p->next->next; Bp=p->next; p->next=p->next->next;Cp->next=p->next; Dp =p->next->next;6.下列有关线性表的叙述中,正确的是A线性表中的元素之间隔是线性关系B线性表中至少有一个元素C线性表中任何一个元素有且仅有一个直接前趋D线性表中任何一个元素有且仅有一个直接后继7.线性表是具有n个的有限序列n≠0A表元素B字符C数据元素D数据项二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同;2.如果没有提供指针类型的语言,就无法构造链式结构;3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继;4.语句p=p->next完成了指针赋值并使p指针得到了p指针所指后继结点的数据域值;5.要想删除p指针的后继结点,我们应该执行q=p->next ;p->next=q->next;freeq;三、填空题1.已知P为单链表中的非首尾结点,在P结点后插入S结点的语句为:_______________________ ;2.顺序表中逻辑上相邻的元素物理位置相邻, 单链表中逻辑上相邻的元素物理位置_________相邻;3.线性表L=a1,a2,...,an采用顺序存储,假定在不同的n+1个位置上插入的概率相同,则插入一个新元素平均需要移动的元素个数是________________________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.whilep->next= Q p=p-next;9.whilep->next=null p=p->next;四、算法设计题1.试编写一个求已知单链表的数据域的平均值的函数数据域数据类型为整型;2.已知带有头结点的循环链表中头指针为head,试写出删除并释放数据域值为x的所有结点的c函数;3.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域;现出库销售m台价格为h的电视机,试编写算法修改原链表;4.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域;现新到m台价格为h的电视机,试编写算法修改原链表;5.线性表中的元素值按递增有序排列,针对顺序表和循环链表两种不同的存储方式,分别编写C函数删除线性表中值介于a与ba≤b之间的元素;6.设A=a0,a1,a2,...,an-1,B=b0,b1,b2,...,bm-1是两个给定的线性表,它们的结点个数分别是n和m,且结点值均是整数;若n=m,且ai= bi 0≤i<n ,则A=B;若n<m ,且ai=bi 0≤i<n ,则A<B;若存在一个j, j<m ,j<n ,且ai=bi 0≤i<j , 若aj<bj,则A<B,否则A>B;试编写一个比较A和B的C函数,该函数返回-1或0或1,分别表示A<B或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. B 3. D 4. B 5. A 7、C二、判断题:参考答案:1、×2、√3、×4、×5、√三、填空题1、s->next=p->next; p->next=s;2、一定;不一定3、n/24、q->prior=p;5、16 32 2 91 7四、算法设计题1、include ""include ""typedef struct node{int data;struct node link;}NODE;int averNODE head{int i=0,sum=0,ave; NODE p;p=head;whilep=NULL{p=p->link;++i;sum=sum+p->data;}ave=sum/i;return ave;}2、include ""include ""typedef struct node{int data; / 假设数据域为整型/struct node link;}NODE;void del_linkNODE head,int x / 删除数据域为x的结点/ {NODE p,q,s;p=head;q=head->link;whileq=head{ifq->data==x{p->link=q->link;s=q;q=q->link;frees;}else{p=q;q=q->link;}}}3、void delNODE head,float price,int num {NODE p,q,s;p=head;q=head->next;whileq->price<price&&q=head{p=q;q=q->next;}ifq->price==priceq->num=q->num-num; elseprintf"无此产品"; ifq->num==0{p->next=q->next; freeq;}}4、include ""include ""typedef struct node {float price;int num;struct node next;}NODE;void insNODE head,float price,int num {NODE p,q,s;p=head;q=head->next;whileq->price<price&&q=head{p=q;q=q->next;}ifq->price==priceq->num=q->num+num;else{s=NODE mallocsizeofNODE;s->price=price;s->num=num;s->next=p->next;p->next=s;}}5、顺序表:算法思想:从0开始扫描线性表,用k记录下元素值在a与b之间的元素个数,对于不满足该条件的元素,前移k个位置,最后修改线性表的长度;void delelemtype list,int n,elemtype a,elemtype b{int i=0,k=0;whilei<n{iflisti>=a&&listi<=b k++;elselisti-k=listi;i++;}n=n-k; / 修改线性表的长度/}循环链表:void delNODE head,elemtype a,elemtype b{NODE p,q;p= head;q=p->link; / 假设循环链表带有头结点/ whileq=head && q->data<a{p=q;q=q->link;}whileq=head && q->data<b{r=q;q=q->link;freer;}ifp=qp->link=q;}6、define MAXSIZE 100int listAMAXSIZE,listBMAXSIZE; int n,m;int compareint a,int b{int i=0;whileai==bi&&i<n&&i<mi++;ifn==m&&i==n return0;ifn<m&&i==n return-1;ifn>m&&i==m return1;ifi<n&&i<mifai<bi return-1;else ifai>bi return1;}7、void delDUNODE head,int i{DUNODE p;{head=head->next;head->prior=NULL;return0;}Else{forj=0;j<i&&p=NULL;j++p=p->next;ifp==NULL||j>i return1;p->prior->next=p->next;p->next->prior=p->proir;freep;return0;}8.顺序存储:void convertelemtype list,int l,int h / 将数组中第l个到第h个元素逆置/ {elemtype temp;fori=h;i<=l+h/2;i++{temp=listi;listi=listl+h-i;listl+h-i=temp;}}void exchangeelemtype list,int n,int m; {convertlist,0,n+m-1;convertlist,0,m-1;convertlist,m,n+m-1;}该算法的时间复杂度为On+m,空间复杂度为O1 链接存储:不带头结点的单链表typedef struct node{elemtype data;struct node link;}NODE;void convertNODE head,int n,int m{NODE p,q,r;int i;p=head;q=head;fori=0;i<n-1;i++q=q->link; /q指向an-1结点/r=q->link;q->link=NULL;whiler->link=NULLr=r->link; /r指向最后一个bm-1结点/head=q;r->link=p;}该算法的时间复杂度为On+m,但比顺序存储节省时间不需要移动元素,只需改变指针,空间复杂度为O1typedef struct node{elemtype data;struct node link;}NODE;NODE unionNODE ah,NODE bh {NODE a,b,head,r,q;head=ah;a=ah;b=bh;whilea->link=ah&&b->link=bh {r=a->link;q=b->link;a->link=b;b->link=r;a=r;}ifa->link==ah /a的结点个数小于等于b的结点个数/{a->link=b;whileb->link=bhb=b->link;b->link=head;}ifb->link==bh /b的结点个数小于a的结点个数/{r=a->link;a->link=b;b->link=r;}returnhead;}该算法的时间复杂度为On+m,其中n和m为两个循环链表的结点个数.10.typedef struct node{elemtype data;struct node link;}NODE;void analyzeNODE a{NODE rh,qh,r,q,p;int i=0,j=0;/i为序号是奇数的结点个数j为序号是偶数的结点个数/ p=a;rh=NODE mallocsizeofNODE;/rh为序号是奇数的链表头指针/qh=NODE mallocsizeofNODE; /qh为序号是偶数的链表头指针/r=rh;q=qh;whilep=NULL{r->link=p;r=p;i++;p=p->link;ifp=NULL{q->link=p;q=p;j++;p=p->link;}}rh->data=i;r->link=rh;qh->data=j;q->link=qh;}11.typedef struct node {elemtype data;struct node link;}NODE;void changeNODE head {NODE p;p=head;ifhead=NULL{whilep->link=NULLp=p->link;p->link=head;}}12.typedef struct node {elemtype data;struct node link;}NODE;void delNODE x,NODE y{NODE p,q;elemtype d1;p=y;q=x;whileq->next=NULL / 把后一个结点数据域前移到前一个结点/ {p->data=q->data;q=q->link;p=q;p->link=NULL; / 删除最后一个结点/freeq;}第三章栈和队列一、选择题1. 一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是;A edcbaBdecbaCdceab Dabcde2.栈结构通常采用的两种存储结构是;A 线性存储结构和链表存储结构B散列方式和索引方式C链表存储结构和数组D线性存储结构和非线性存储结构3.判定一个栈ST最多元素为m0为空的条件是;A ST-〉top=0 BST-〉top==0CST-〉top=m0 DST-〉top=m04.判定一个栈ST最多元素为m0为栈满的条件是;AST->top=0 BST->top==0CST->top=m0-1DST->top==m0-15.一个队列的入列序列是1,2,3,4,则队列的输出序列是;A4,3,2,1B1,2,3,4C1,4,3,2D3,2,4,16.循环队列用数组A0,m-1存放其元素值,已知其头尾指针分别是front和rear则当前队列中的元素个数是Arear-front+m%m B rear-front+1 Crear-front-1Drear-front7.栈和队列的共同点是A 都是先进后出B都是先进先出C只允许在端点处插入和删除元素D没有共同点8.表达式ab+c-d的后缀表达式是;Aabcd+-Babc+d- Cabc+d-D-+abcd个元素a1,a2,a3和a4依次通过一个栈,在a4进栈前,栈的状态,则不可能的出栈序是Aa4,a3,a2,a1 Ba3,a2,a4,a1Ca3,a1,a4,a2 Da3,a4,a2,a110.以数组Q0..m-1存放循环队列中的元素,变量rear和qulen分别指示循环队列中队尾元素的实际位置和当前队列中元素的个数,队列第一个元素的实际位置是Arear-qulen Brear-qulen+mCm-qulen D1+rear+m-qulen% m二、填空题1.栈的特点是_______________________,队列的特点是__________________________;2.线性表、栈和队列都是_____________________结构,可以在线性表的______________位置插入和删除元素,对于栈只能在________插入和删除元素,对于队列只能在_______插入元素和_________删除元素;3.一个栈的输入序列是12345,则栈有输出序列12345是____________;正确/错误4.设栈S和队列Q的初始状态皆为空,元素a1,a2,a3,a4,a5和a6依次通过一个栈,一个元素出栈后即进入队列Q,若6个元素出队列的顺序是a3,a5,a4,a6,a2,a1则栈S至少应该容纳_____个元素;三、算法设计题1.假设有两个栈s1和s2共享一个数组stackM,其中一个栈底设在stack0处,另一个栈底设在stackM-1处;试编写对任一栈作进栈和出栈运算的C函数pushx,i和popi,i=l,2;其中i=1表示左边的栈,,i=2表示右边的栈;要求在整个数组元素都被占用时才产生溢出;2.利用两个栈s1,s2模拟一个队列时,如何用栈的运算来实现该队列的运算写出模拟队列的插入和删除的C函数;一个栈s1用于插入元素,另一个栈s2用于删除元素.参考答案:一、选择题1. C 3. B 4. B 5. B 7、C 8、C 9、C 10、D二、填空题1、先进先出;先进后出2、线性;任何;栈顶;队尾;对头3、正确的4、3三、算法设计题1.define M 100elemtype stackM;int top1=0,top2=m-1;int pushelemtype x,int i{iftop1-top2==1 return1; /上溢处理/elseifi==1 stacktop1++=x;ifi==2stacktop2--=x;return0;}int popelemtype px,int iifi==1iftop1==0 return1; else{top1--;px=stacktop1;return0;}elseifi==2iftop2==M-1 return1; else{top2++;px=stacktop2;return0;}}elemtype s1MAXSIZE,s2MAZSIZE; int top1,top2;void enqueueelemtype x{iftop1==MAXSIZE return1;else{pushs1,x;return0;}}void dequeueelemtype px{elemtype x;top2=0;whileemptys1{pops1,&x;pushs2,x;pops2,&x;whileemptys2{pops2,&x;pushs1,x;}}第四章串一、选择题1.下列关于串的叙述中,正确的是A一个串的字符个数即该串的长度B一个串的长度至少是1C空串是由一个空格字符组成的串D两个串S1和S2若长度相同,则这两个串相等2.字符串"abaaabab"的nextval值为A0,1,01,1,0,4,1,0,1 B0,1,0,0,0,0,2,1,0,1C0,1,0,1,0,0,0,1,1 D0,1,0,1,0,1,0,1,13.字符串满足下式,其中head和tail的定义同广义表类似,如head‘xyz’=‘x’,tail‘xyz’= ‘yz’,则s= ; concatheadtails,headtailtails= ‘dc’; Aabcd Bacbd Cacdb Dadcb4.串是一种特殊的线性表,其特殊性表现在A可以顺序存储B数据元素是一个字符C可以链式存储D数据元素可以是多个字符5.设串S1=‘ABCDEFG’,s2=‘PQRST’,函数CONCATX,Y返回X和Y串的连接串,SUBSTRS,I,J 返回串S从序号I开始的J个字符组成的字串,LENGTHS返回串S的长度,则CONCATSUBSTRS1,2,LENGTHS2,SUBSTRS1,LENGTHS2,2的结果串是ABCDEF B BCDEFG CBCPQRST DBCDEFEF二、算法设计1.分别在顺序存储和一般链接存储两种方式下,用C语言写出实现把串s1复制到串s2的串复制函数strcpys1,s2;2.在一般链接存储一个结点存放一个字符方式下,写出采用简单算法实现串的模式匹配的C 语言函数int L_indext,p;参考答案:一、选择题1. A 3. D 4. D 5. D二、算法设计1.顺序存储:include ""define MAXN 100char sMAXN;int S_strlenchar s{int i;fori=0;si='\0';i++;returni;}void S_strcpychar s1,char s2 include "" typedef struct node{char data;struct node link;}NODE;int L_indexNODE t,NODE p{NODE t1,p1,t2;int i;t1=t;i=1;whilet1=NULL{p1=p;t2=t1->link;whilep1->data==t1->data&&p1=NULL{p1=p1->link;t1=t1->link;}ifp1==NULL returni;i++;t1=t2;}return0;}第五章数组和广义表一、选择题1. 常对数组进行的两种基本操作是A建立与删除B索引和修改C查找和修改D查找与索引2.二维数组M的元素是4个字符每个字符占一个存储单元组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M35的起始地址与M按列存储时元素的起始地址相同;AM24BM34CM35DM443.数组A810中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元数是;A80B100C240D2704.数组A810中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A74的起始地址为;ASA+141BSA+144CSA+222DSA+2255.数组A810中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按列存放时,元素A47的起始地址为;ASA+141BSA+180CSA+222DSA+2256.稀疏矩阵一般的压缩存储方法有两种,即;A 二维数组和三维数组B三元组和散列C三元组和十字链表D散列和十字链表7.若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点;A正确B错误8.设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B1,nn-1/2中,对下三角部分中任一元素ai,ji<=j,在一组数组B的下标位置k的值是;Aii-1/2+j-1Bii-1/2+jCii+1/2+j-1 Dii+1/2+j二、填空题1.己知二维数组Amn采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOCA00,则A00的地址是_____________________;2.二维数组A1020采用列序为主方式存储,每个元素占一个存储单元,并且A00的存储地址是200,则A612的地址是________________;3.有一个10阶对称矩阵A,采用压缩存储方式以行序为主,且A00=1,则A85的地址是__________________;4.设n行n列的下三角矩阵A已压缩到一维数组S1..nn+1/2中,若按行序为主存储,则Aij对应的S中的存储位置是________________;5.若A是按列序为主序进行存储的4×6的二维数组,其每个元素占用3个存储单元,并且A00的存储地址为1000,元素A13的存储地址为___________,该数组共占用_______________个存储单元;三、算法设计1.如果矩阵A中存在这样的一个元素Aij满足条件:Aij是第i行中值最小的元素,且又是第j 列中值最大的元素,则称之为该矩阵的一个马鞍点;编写一个函数计算出1×n的矩阵A的所有马鞍点;只猴子要选大王,选举办法如下:所有猴子按1,2,...,n编号围坐一圈,从1号开始按1、2、...、m报数,凡报m号的退出到圈外,如此循环报数,直到圈内剩下只猴子时,这只猴子就是大王;n 和m由键盘输入,打印出最后剩下的猴子号;编写一程序实现上述函数;3.数组和广义表的算法验证程序编写下列程序:1求广义表表头和表尾的函数head和tail;2计算广义表原子结点个数的函数count_GL;3计算广义表所有原子结点数据域设数据域为整型〉之和的函数sum_GL;参考答案:一、选择题1. C 3. C 4. C 5. B 7、B 8、B二、填空题1、locA00+ni+jk2、3323、424、ii+1/2+j+15、1039;72三、算法设计题1.算法思想:依题意,先求出每行的最小值元素,放入minm之中,再求出每列的最大值元素,放入maxn之中,若某元素既在mini中,又在maxj中,则该元素Aij便是马鞍点,找出所有这样的元素,即找到了所有马鞍点;因此,实现本题功能的程序如下:include <>define m 3define n 4void minmaxint amn{int i1,j,have=0;int minm,maxn;fori1=0;i1<m;i1++/计算出每行的最小值元素,放入minm之中/{mini1=ai10;forj=1;j<n;j++ifai1j<mini1 mini1=ai1j;}forj=0;j<n;j++/计算出每列的最大值元素,放入maxn之中/{maxj=a0j;fori1=1;i1<m;i1++ifai1j>max j maxj=ai1j;}fori1=0;i1<m;i1++forj=0;j<n;j++ifmini1==maxj{printf"%d,%d:%d\n",i1,j,ai1j;have=1;}ifhave printf"没有鞍点\n";}2.算法思想:本题用一个含有n个元素的数组a,初始时ai中存放猴子的编号i,计数器似的值为0;从ai开始循环报数,每报一次,计数器的值加1,凡报到m时便打印出ai值退出圈外的猴子的编号,同时将ai的值改为O以后它不再参加报数,计数器值重新置为0;该函数一直进行到n 只猴子全部退出圈外为止,最后退出的猴子就是大王;因此,现本题功能的程序如下:include ""main{int a100;int count,d,j,m,n; scanf"%d %d",&m,&n;/ n>=m/ forj=0;j<n;j++aj=j+1;count=0;d=0;whiled<nforj=0;j<n;j++ifaj=0{count++;ifcount==m{printf"% d ",aj;aj=0;count=0;}}}3.include ""include ""typedef struct node { int tag;union{struct node sublist; char data;}dd;struct node link;}NODE;NODE creat_GLchar s {NODE h;char ch;s++;ifch='\0'{h=NODEmallocsizeofNODE; ifch==''{h->tag=1;h->=creat_GLs;}Else{h->tag=0;h->=ch;}}elseh=NULL;ch=s;s++;ifh=NULLifch==','h->link =creat_GLs; elseh->link=NULL; returnh;}void prn_GLNODE p {ifp=NULL{ifp->tag==1{printf"";ifp-> ==NULL printf" ";elseprn_GLp-> ;}elseprintf"%c",p->;ifp->tag==1printf"";ifp->link=NULL{printf",";prn_GLp->link;}}}NODE copy_GLNODE p{NODE q;ifp==NULL returnNULL;q=NODE mallocsizeofNODE; q->tag=p->tag;ifp->tagq-> =copy_GLp-> ;elseq-> =p->;q->link=copy_GLp->link;returnq;}NODE headNODE p /求表头函数/{returnp->;}NODE tailNODE p /求表尾函数/{returnp->link;}int sumNODE p /求原子结点的数据域之和函数/ { int m,n;ifp==NULL return0;else{ ifp->tag==0 n=p->;elsen=sump->;ifp->link=NULLm=sump->link;else m=0;returnn+m;}}int depthNODE p /求表的深度函数/ {int h,maxdh;NODE q;ifp->tag==0 return0;elseifp->tag==1&&p->==NULL return 1; else{maxdh=0;whilep=NULL{ifp->tag==0 h=0; else{q=p->;h=depthq;}ifh>maxdhmaxdh=h; p=p->link;}returnmaxdh+1;}}main{NODE hd,hc;char s100,p;p=getss;hd=creat_GL&p; prn_GLheadhd;prn_GLtailhd;hc=copy_GLhd;printf"copy after:";prn_GLhc;printf"sum:%d\n",sumhd;printf"depth:%d\n",depthhd;}第六章树和二叉树一、选择题1.在线索化二叉树中,t所指结点没有左子树的充要条件是At-〉left==NULL Bt-〉ltag==1Ct-〉ltag=1且t-〉left=NULLD以上都不对2.二叉树按某种顺序线索化后,任一结点均有指向其前趋和后继的线索,这种说法A正确B错误C不同情况下答案不确定3.二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法A正确B错误C不同情况下答案不确定4.由于二叉树中每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法A正确B错误C不同情况下答案不确定5.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为;A2h B2h-1C2h+1Dh+16.已知某二叉树的后序遍历序列是dabec;中序遍历序列是debac,它的前序遍历序列是;Aacbed BdecabCdeabc Dcedba7.如果T2是由有序树T转换而来的二叉树,那么T中结点的前序就是T2中结点的A前序B中序C后序D层次序8.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是;Abdgcefha Bgdbecfha Cbdgaechf Dgdbehfca9.二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值;这种说法A正确B错误C不同情况下答案不确定10.按照二叉树的定义,具有3个结点的二叉树有种;A3B4C5D611.在一非空二叉树的中序遍历序列中,根结点的右边A只有右子树上的所有结点B只有右子树上的部分结点C只有左子树上的部分结点D只有左子树上的所有结点12.树最适合用来表示;A有序数据元素B无序数据元素C元素之间具有分支层次关系的数据D元素之间无联系的数据13.任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序A不发生改变B发生改变C不能确定D.以上都不对14.实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用存储结构;A二叉链表B广义表存储结构C三叉链表D顺序存储结构15.对一个满二叉树,m个树叶,n个结点,深度为h,则An=h+m Bh+m=2nCm=h-1Dn=2h-116.如果某二叉树的前序为stuwv,中序为uwtvs,那么该二叉树的后序为Auwvts BvwutsCwuvts Dwutsv17.具有五层结点的二叉平衡树至少有个结点;A10B12C15D17二、判断题1.二叉树中任何一个结点的度都是2;2.由二叉树结点的先根序列和后根序列可以唯一地确定一棵二叉树;3.一棵哈夫曼树中不存在度为1的结点;4.平衡二叉排序树上任何一个结点的左、右子树的高度之差的绝对值不大于2三、填空题1.指出树和二叉树的三个主要差别___________,___________,_______________;2.从概念上讲,树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是____________3.若结点A有三个兄弟包括A本身,并且B是A的双亲结点,B的度是_______________4.若一棵具有n个结点的二叉树采用标准链接存储结构,那么该二叉树所有结点共有_______个空指针域;5.已知二叉树的前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC,写出后序序列_______________;6.已知二叉树的后序序列为FGDBHECA,中序序列为BFDGAEHC ,并写出前序序列_________________;7.找出满足下列条件的二叉树1先序和中序遍历,得到的结点访问顺序一样;_________________________2后序和中序遍历,得到的结点访问顺序一样;_________________________3先序和后序遍历,得到的结点访问顺序一样;__________________________8.一棵含有n个结点的k叉树,可能达到的最大深度和最小深度各是多少____________________9.一棵二叉树有67个结点,这些结点的度要么是0,要么是2;这棵二叉树中度为2的结点有______________________个;10.含有100个结点的树有_______________________________________条边;四、问答题1.一棵深度为h的满m叉树具有如下性质:第h层上的结点都是叶结点,其余各层上每个结点都有m棵非空子树;若按层次从上到下,每层从左到右的顺序从1开始对全部结点编号,试计算:1第k层结点数1≤k≤h;2整棵树结点数;3编号为i的结点的双亲结点的编号;4编号为i的结点的第j个孩子结点若有的编号;2.证明:一个满k叉树上的叶子结点数n0和非叶子结点数n1之间满足以下关系:n0=k-1n1+13.已知一组元素为50,28,78,65,23,36,13,42,71,请完成以下操作:1画出按元素排列顺序逐点插入所生成的二叉排序树BT;2分别计算在BT中查找各元素所要进行的元素间的比较次数及平均比较次数;3画出在BT中删除23〉后的二叉树;4.有七个带权结点,其权值分别为3,7,8,2,6,10,14,试以它们为叶结点构造一棵哈夫曼树请按照每个结点的左子树根结点的权小于等于右子树根结点的权的次序构造〉,并计算出带权路径长度WPL及该树的结点总数;5.有一电文共使用五种字符a,b,c,d,e,其出现频率依次为4,7,5,2,9;1试画出对应的编码哈夫曼树要求左子树根结点的权小于等于右子树根结点的权;2求出每个字符的晗夫曼编码;3求出传送电文的总长度;4并译出编码系列101的相应电文;五、算法设计已知一棵具有n个结点的完全二叉树被顺序存储在一维数组An中,试编写一个算法输出Ai结点的双亲和所有孩子;参考答案:一、选择题1. B 3. A 4. B 5. B 7、A 8、D 9、B 10、C 11、A 12、C 13、A 14、C 15、D 16、C 17 C。

数据结构(c语言版)习题答案严蔚敏李冬梅吴伟民23490数据结构习题答案

数据结构(c语言版)习题答案严蔚敏李冬梅吴伟民23490数据结构习题答案

第1章绪论习题1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。

3.简述逻辑结构的四种基本关系并画出它们的关系图。

4.存储结构由哪两种基本的存储方法实现?5.选择题(1)在数据结构中,从逻辑上可以把数据结构分成()。

A.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.内部结构和外部结构(2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。

A.存储结构B.存储实现C.逻辑结构D.运算实现(3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。

A.数据具有同一特点B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致C.每个数据元素都一样D.数据元素所包含的数据项的个数要相等(4)以下说法正确的是()。

A.数据元素是数据的最小单位B.数据项是数据的基本单位C.数据结构是带有结构的各数据项的集合D.一些表面上很不相同的数据可以有相同的逻辑结构(5)以下与数据的存储结构无关的术语是()。

A.顺序队列 B. 链表 C.有序表 D. 链栈(6)以下数据结构中,()是非线性数据结构A.树B.字符串C.队D.栈6.试分析下面各程序段的时间复杂度。

(1)x=90; y=100;while(y>0)if(x>100){x=x-10;y--;}else x++;(2)for (i=0; i<n; i++)for (j=0; j<m; j++)a[i][j]=0;(3)s=0;for i=0; i<n; i++)for(j=0; j<n; j++)s+=B[i][j];sum=s;(4)i=1;while(i<=n)i=i*3;(5)x=0;for(i=1; i<n; i++)for (j=1; j<=n-i; j++)x++;(6)x=n; //n>1y=0;while(x≥(y+1)* (y+1))y++;(1)O(1)(2)O(m*n)(3)O(n2)(4)O(log3n)(5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O(n2)(6)O(n)第2章线性表1.选择题(1)一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()。

数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构( C语言版)(第 2版)课后习题答案李冬梅2015.3目录第 1 章绪论 (1)第 2 章线性表 (5)第 3 章栈和队列 (13)第 4 章串、数组和广义表 (26)第 5 章树和二叉树 (33)第 6 章图 (43)第 7 章查找 (54)第 8 章排序 (65)第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0 ,± 1,± 2,, } ,字母字符数据对象是集合C={‘A’,‘B’, , ,‘Z’,‘ a’,‘ b’, , ,‘z ’} ,学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

《数据结构》系统答案 严蔚敏 李冬梅 人民邮电出版社

《数据结构》系统答案 严蔚敏 李冬梅 人民邮电出版社

;LLUN nruter )LLUN==txen>-L(fi {) L tsiLkniL( xaM epyTmelE 。点结的大最值定确中表链单在历遍趟一过通�法算个一计设�6� 。 �点结的表 A 用利表 C、B 求要�型整为型类素 元的 A 表链�点结的零于大值中表 A 为点结的表 C 而�点结的零于小值中表 A 为点结的表 B 中其�C、B 表链的构结同相有具个两为解分 A 表链单的点结头带个一将法算计设�5� 点结除删∥ }�u eteled �txen>-p=p �p=u 。除删应�点结的同相值素元中 B�A 理处∥ �txen>-p=txen>-erp{ esle 。移后针指点结前当中表链 B∥ �txen>-q=q�atad>-q>atad>-p�fi esle 。移后针指点结前当中表链 A ∥ }�++n*�txen>-p=p�p=erp{�atad>-q<atad>-p�fi �llun=!q && llun=!p�elihw 。针指的点结驱前的点结指所 p 中 A 为 erp∥ �A=erp �txen>-B=q 。针指作工的 B 和 A 表链是别分 q 和 p∥ �txen>-A=p{ 0 为时用调�数个素元中合集果结是 n*�中 A 表链单于储存�集 差的合集两求法算本�合集个一了储存别分�表链单的序有增递的点结头带是均 B 和 A∥ �n*�B�A tsiLdekniL�ecnereffiD diov 。数个素元的合集该回返时同�储存式形 的样同以并� �合集的成构所素元的现出中 B 在不而现出中 A 在由仅即�集差的 B 和 A 合集 个两出求法算计设请。列排增递素元其�合集个两示表别分 B 和 A 表链个两知已�4� 理处的间空放释作不表 B 对可也中法算本 �注∥ ;bL eteled 。记标尾表链置∥;llun=txen>-cp 间空点结放释∥};u eteled ;txen>-bp=bp ;bp=u{ )bp(elihw 间空点结放释 ∥};u eteled ;txen>-ap=ap ;ap=u {)ap(elihw };u eteled ;txen>-bp=bp ;bp=u{ esle };u eteled ;txen>-ap=ap;ap=u{ )atad>-bp<atad>-ap(fi esle };u eteled ;txen>-bp=bp;bp=u ;txen>-ap=ap;ap=cp;ap=txen>-cp { 。中表果结入并集交∥)atad>-bp==atad>-ap(fi )bp&&ap(elihw 点结头的 cL 为作点结头的 aL 用// ;aL=cp=cL �bp 和 ap 针指作工设∥;txen>-bl=bp;txen>-al=ap { ) ,cL &tsiLkniL ,bL &tsiLkniL ,aL &tsiLkniL(xiM diov 。中表链 A 于放存并�集交的 B 与 A 出求法算计设请。列排增递素元其�合集个两示表别分 B 和 A 表链个两知已�3� }点结头的 bL 放释// ;bL eteled } 入插 // ;q = txen>-cL ;txen>-cL = txen>-q } ;txen>-bp = bp ;bp = q { esle } ;txen>-ap = ap ;ap = q { ) atad>-bp =< atad>-ap( fi esle } ;txen>-ap = ap ;ap = q { ) bp! ( fi esle } ;txen>-bp = bp ;bp = q { ) ap! ( fi { ) bp || ap ( elihw

严蔚敏版数据结构课后习题集答案解析~完整版

严蔚敏版数据结构课后习题集答案解析~完整版

第1章绪论1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

解:数据是对客观事物的符号表示。

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

是对一般数据类型的扩展。

1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。

一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。

抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。

在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

1.3 设有数据结构(D,R),其中{}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r =试按图论中图的画法惯例画出其逻辑结构图。

解:1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。

解:ADT Complex{数据对象:D={r,i|r,i 为实数}数据关系:R={<r,i>}基本操作: InitComplex(&C,re,im)操作结果:构造一个复数C ,其实部和虚部分别为re和imDestroyCmoplex(&C)操作结果:销毁复数CGet(C,k,&e)操作结果:用e返回复数C的第k元的值Put(&C,k,e)操作结果:改变复数C的第k元的值为eIsAscending(C)操作结果:如果复数C的两个元素按升序排列,则返回1,否则返回0IsDescending(C)操作结果:如果复数C的两个元素按降序排列,则返回1,否则返回0Max(C,&e)操作结果:用e返回复数C的两个元素中值较大的一个Min(C,&e)操作结果:用e返回复数C的两个元素中值较小的一个}ADT ComplexADT RationalNumber{数据对象:D={s,m|s,m为自然数,且m不为0}数据关系:R={<s,m>}基本操作:InitRationalNumber(&R,s,m)操作结果:构造一个有理数R,其分子和分母分别为s和mDestroyRationalNumber(&R)操作结果:销毁有理数RGet(R,k,&e)操作结果:用e返回有理数R的第k元的值Put(&R,k,e)操作结果:改变有理数R的第k元的值为eIsAscending(R)操作结果:若有理数R的两个元素按升序排列,则返回1,否则返回0IsDescending(R)操作结果:若有理数R的两个元素按降序排列,则返回1,否则返回0Max(R,&e)操作结果:用e返回有理数R的两个元素中值较大的一个Min(R,&e)操作结果:用e返回有理数R的两个元素中值较小的一个}ADT RationalNumber1.5 试画出与下列程序段等价的框图。

数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据构造(C说话版)(第2版)课后习题答案李冬梅目录第1章绪论1第2章线性表4第3章栈和队列12第4章串.数组和广义表25第5章树和二叉树32第6章图41第7章查找52第8章排序63第1章绪论1.简述下列概念:数据.数据元素.数据项.数据对象.数据构造.逻辑构造.存储构造.抽象数据类型.答案:数据:是客不雅事物的符号暗示,指所有能输入到盘算机中并被盘算机程序处理的符号的总称.如数学盘算顶用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形.图像.声音.动画等经由过程特别编码界说后的数据.数据元素:是数据的根本单位,在盘算机中平日作为一个整体进行斟酌和处理.在有些情形下,数据元素也称为元素.结点.记载等.数据元素用于完全地描写一个对象,如一个学生记载,树中棋盘的一个格局(状况).图中的一个极点等.数据项:是构成数据元素的.有自力寄义的.不成朋分的最小单位.例如,学生根本信息表中的学号.姓名.性别等都是数据项.数据对象:是性质雷同的数据元素的集合,是数据的一个子集.例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’, ‘a’,‘b’,…,‘z’},学生根本信息表也可是一个数据对象.数据构造:是互相之间消失一种或多种特定关系的数据元素的集合.换句话说,数据构造是带“构造”的数据元素的集合,“构造”就是指数据元素之间消失的关系.逻辑构造:从逻辑关系上描写数据,它与数据的存储无关,是自力于盘算机的.是以,数据的逻辑构造可以看作是从具体问题抽象出来的数学模子.存储构造:数据对象在盘算机中的存储暗示,也称为物理构造.抽象数据类型:由用户界说的,暗示运用问题的数学模子,以及界说在这个模子上的一组操纵的总称.具体包含三部分:数据对象.数据对象上关系的集合和对数据对象的根本操纵的集合.2.试举一个数据构造的例子,论述其逻辑构造和存储构造两方面的寄义和互相关系.答案:例若有一张学生根本信息表,包含学生的学号.姓名.性别.籍贯.专业等.每个学生根本信息记载对应一个数据元素,学生记载按次序号分列,形成了学生根本信息记载的线性序列.对于全部表来说,只有一个开端结点(它的前面无记载)和一个终端结点(它的后面无记载),其他的结点则各有一个也只有一个直接前趋和直接后继.学生记载之间的这种关系就肯定了学生表的逻辑构造,即线性构造.这些学生记载在盘算机中的存储暗示就是存储构造.假如用持续的存储单元(如用数组暗示)来存放这些记载,则称为次序存储构造;假如存储单元不持续,而是随机存放各个记载,然后用指针进行链接,则称为链式存储构造.即雷同的逻辑构造,可以对应不合的存储构造.3.简述逻辑构造的四种根本关系并画出它们的关系图.答案:(1)集合构造数据元素之间除了“属于统一集合”的关系外,别无其他关系.例如,肯定一逻辑学生是否为班级成员,只需将班级看做一个集合构造.(2)线性构造数据元素之间消失一对一的关系.例如,将学生信息数据按照其入学报到的时光先后次序进行分列,将构成一个线性构造.(3)树构造数据元素之间消失一对多的关系.例如,在班级的治理系统中,班长治理多个组长,每位组长治理多名组员,从而构成树形构造.(4)图构造或网状构造数据元素之间消失多对多的关系.例如,多位同窗之间的同伙关系,任何两位同窗都可所以同伙,从而构成图形构造或网状构造.个中树构造和图构造都属于非线性构造.四类根本逻辑构造关系图4.存储构造由哪两种根本的存储办法实现?答案:(1)次序存储构造次序存储构造是借助元素在存储器中的相对地位来暗示数据元素之间的逻辑关系,平日借助程序设计说话的数组类型来描写.(2)链式存储构造次序存储构造请求所有的元素依次存放在一片持续的存储空间中,而链式存储构造,无需占用一整块存储空间.但为了暗示结点之间的关系,须要给每个结点附加指针字段,用于存放后继元素的存储地址.所以链式存储构造平日借助于程序设计说话的指针类型来描写.5.选择题(1)在数据构造中,从逻辑上可以把数据构造分成().A.动态构造和静态构造 B.紧凑构造和非紧凑构造C.线性构造和非线性构造 D.内部构造和外部构造答案:C(2)与数据元素本身的情势.内容.相对地位.个数无关的是数据的().A.存储构造 B.存储实现C.逻辑构造 D.运算实现答案:C(3)平日请求统一逻辑构造中的所稀有据元素具有雷同的特征,这意味着().A.数据具有统一特色B.不但数据元素所包含的数据项的个数要雷同,并且对应数据项的类型要一致C.每个数据元素都一样D.数据元素所包含的数据项的个数要相等答案:B(4)以下说法准确的是().A.数据元素是数据的最小单位B.数据项是数据的根本单位C.数据构造是带有构造的各数据项的集合D.一些概况上很不雷同的数据可以有雷同的逻辑构造答案:D解释:数据元素是数据的根本单位,数据项是数据的最小单位,数据构造是带有构造的各数据元素的集合.(5)算法的时光庞杂度取决于().A.问题的范围B.待处理数据的初态C.盘算机的设置装备摆设D.A和B答案:D解释:算法的时光庞杂度不但与问题的范围有关,还与问题的其他身分有关.如某些排序的算法,其履行时光与待排序记载的初始状况有关.为此,有时会对算法有最好.最坏以及平均时光庞杂度的评价.(6)以下数据构造中,()长短线性数据构造A.树 B.字符串 C.队列 D.栈答案:A6.试剖析下面各程序段的时光庞杂度.(1)x=90; y=100;while(y>0)if(x>100){x=x-10;y--;}else x++;答案:O(1)解释:程序的履行次数为常数阶.(2)for (i=0; i<n; i++)for (j=0; j<m; j++)a[i][j]=0;答案:O(m*n)解释:语句a[i][j]=0;的履行次数为m*n.(3)s=0;for i=0; i<n; i++)for(j=0; j<n; j++)s+=B[i][j];sum=s;答案:O(n2)解释:语句s+=B[i][j];的履行次数为n2.(4)i=1;while(i<=n)i=i*3;答案:O(log3n)解释:语句i=i*3;的履行次数为⎣log3n⎦.(5)x=0;for(i=1; i<n; i++)for (j=1; j<=n-i; j++)x++;答案:O(n2)解释:语句x++;的履行次数为n-1+n-2+……+1= n(n-1)/2.(6)x=n; //n>1y=0;while(x≥(y+1)* (y+1))y++;答案:O(n)解释:语句y++;的履行次数为⎣n⎦.第2章线性表1.选择题(1)次序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是().A.110 B.108 C.100 D.120答案:B解释:次序表中的数据持续存储,所以第5个元素的地址为:100+2*4=108.(2)在n个结点的次序表中,算法的时光庞杂度是O(1)的操纵是().A.拜访第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)B.在第i个结点后拔出一个新结点(1≤i≤n)C.删除第i个结点(1≤i≤n)D.将n个结点从小到大排序答案:A解释:在次序表中拔出or delete一个结点的时光庞杂度都是O(n),排序的时光庞杂度为O(n2)或O(nlog2n).次序表是一种随机存取构造,拜访第i个结点和求第i个结点的直接前驱都可以直接经由过程数组的下标直接定位,时光庞杂度是O(1).(3)向一个有127个元素的次序表中拔出一个新元素并保持本来次序不变,平均要移动的元素个数为().A.8 B.63.5 C.63 D.7答案:B解释:平均要移动的元素个数为:n/2.(4)链接存储的存储构造所占存储空间().A.分两部分,一部分存放结点值,另一部分存放暗示结点间关系的指针B.只有一部分,存放结点值C.只有一部分,存储暗示结点间关系的指针D.分两部分,一部分存放结点值,另一部分存放结点所占单元数答案:A(5)线性表若采取链式存储构造时,请求内存中可用存储单元的地址().A.必须是持续的 B.部分地址必须是持续的C.必定是不持续的 D.持续或不持续都可以答案:D(6)线性表L在()情形下实用于运用链式构造实现.A.需经常修正L中的结点值B.需不竭对L进行删除拔出C.L中含有大量的结点D.L中结点构造庞杂答案:B解释:链表最大的长处在于拔出和删除时不须要移动数据,直接修正指针即可.(7)单链表的存储密度().A.大于1 B.等于1 C.小于1 D.不克不及肯定答案:C解释:存储密度是指一个结点数据本身所占的存储空间和全部结点所占的存储空间之比,假设单链表一个结点本身所占的空间为D,指针域所占的空间为N,则存储密度为:D/(D+N),必定小于1.(8)将两个各有n个元素的有序表归并成一个有序表,其起码的比较次数是().A.n B.2n-1 C.2n D.n-1答案:A解释:当第一个有序表中所有的元素都小于(或大于)第二个表中的元素,只须要用第二个表中的第一个元素依次与第一个表的元素比较,总计比较n次.(9)在一个长度为n的次序表中,在第i个元素(1≤i≤n+1)之前拔出一个新元素时须向后移动()个元素.A.n-i B.n-i+1 C.n-i-1 D.I答案:B(10) 线性表L=(a1,a2,……a n),下列说法准确的是().A.每个元素都有一个直接前驱和一个直接后继B.线性表中至少有一个元素C.表中诸元素的分列必须是由小到大或由大到小D.除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继.答案:D(11) 创建一个包含n个结点的有序单链表的时光庞杂度是().A.O(1) B.O(n) C.O(n2) D.O(nlog2n)答案:C解释:单链表创建的时光庞杂度是O(n),而要树立一个有序的单链表,则每生成一个新结点时须要和已有的结点进行比较,肯定合适的拔出地位,所以时光庞杂度是O(n2).(12) 以下说法错误的是().A.求表长.定位这两种运算在采取次序存储构造时实现的效力不比采取链式存储构造时实现的效力低B.次序存储的线性表可以随机存取C.因为次序存储请求持续的存储区域,所以在存储治理上不敷灵巧D.线性表的链式存储构造优于次序存储构造答案:D解释:链式存储构造温柔序存储构造各有优缺陷,有不合的实用处合.(13) 在单链表中,要将s所指结点拔出到p所指结点之后,其语句应为().A.s->next=p+1;p->next=s;B.(*p).next=s;(*s).next=(*p).next;C.s->next=p->next;p->next=s->next;D.s->next=p->next;p->next=s;答案:D(14) 在双向链表存储构造中,删除p所指的结点时须修正指针().A.p->next->prior=p->prior;p->prior->next=p->next;B.p->next=p->next->next;p->next->prior=p;C.p->prior->next=p;p->prior=p->prior->prior;D.p->prior=p->next->next;p->next=p->prior->prior;答案:A(15) 在双向轮回链表中,在p指针所指的结点后拔出q所指向的新结点,其修正指针的操纵是().A.p->next=q; q->prior=p;p->next->prior=q;q->next=q;B.p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;C.q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;D.q->prior=p;q->next=p->next;p->next=q;p->next->prior=q;答案:C2.算法设计题(1)将两个递增的有序链表归并为一个递增的有序链表.请求成果链表仍运用本来两个链表的存储空间, 不别的占用其它的存储空间.表中不许可有反复的数据.[标题剖析]归并后的新表运用头指针Lc指向,pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取个中较小者从新链接在Lc表的最后.假如两个表中的元素相等,只摘取La表中的元素,删除Lb表中的元素,如许确保归并后表中无反复的元素.当一个表到达表尾结点,为空时,将非空表的残剩元素直接链接在Lc表的最后.[算法描写]void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){//归并链表La和Lb,归并后的新表运用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa && pb){if(pa->data<pb->data){pc->next=pa;pc=pa;pa=pa->next;} //取较小者La中的元素,将pa链接在pc的后面,pa指针后移else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移else //相等时取La中的元素,删除Lb中的元素{pc->next=pa;pc=pa;pa=pa->next;q=pb->next;delete pb ;pb =q;}}pc->next=pa?pa:pb; //拔出残剩段delete Lb; //释放Lb的头结点}(2)将两个非递减的有序链表归并为一个非递增的有序链表.请求成果链表仍运用本来两个链表的存储空间, 不别的占用其它的存储空间.表中许可有反复的数据.[标题剖析]归并后的新表运用头指针Lc指向,pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取个中较小者从新链接在Lc表的表头结点之后,假如两个表中的元素相等,只摘取La表中的元素,保存Lb表中的元素.当一个表到达表尾结点,为空时,将非空表的残剩元素依次摘取,链接在Lc表的表头结点之后.[算法描写]void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc, ){//归并链表La和Lb,归并后的新表运用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点Lc->next=NULL;while(pa||pb ){//只要消失一个非空表,用q指向待摘取的元素if(!pa) {q=pb; pb=pb->next;}//La表为空,用q指向pb,pb指针后移else if(!pb) {q=pa; pa=pa->next;}//Lb表为空,用q指向pa,pa指针后移else if(pa->data<=pb->data) {q=pa; pa=pa->next;}//取较小者(包含相等)La中的元素,用q指向pa,pa指针后移else {q=pb; pb=pb->next;}//取较小者Lb中的元素,用q指向pb,pb指针后移q->next = Lc->next; Lc->next = q;//将q指向的结点插在Lc 表的表头结点之后}delete Lb; //释放Lb的头结点}(3)已知两个链表A和B分离暗示两个集合,其元素递增分列.请设盘算法求出A与B 的交集,并存放于A链表中.[标题剖析]只有同时出如今两集合中的元素才出如今成果表中,归并后的新表运用头指针Lc指向.pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La和Lb均为到达表尾结点时,假如两个表中相等的元素时,摘取La表中的元素,删除Lb表中的元素;假如个中一个表中的元素较小时,删除此表中较小的元素,此表的工作指针后移.当链表La和Lb有一个到达表尾结点,为空时,依次删除另一个非空表中的所有元素.[算法描写]void Mix(LinkList& La, LinkList& Lb, LinkList& Lc){pa=La->next;pb=Lb->next;pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa&&pb){ if(pa->data==pb->data)∥交集并入成果表中.{ pc->next=pa;pc=pa;pa=pa->next;u=pb;pb=pb->next; delete u;}else if(pa->data<pb->data) {u=pa;pa=pa->next; delete u;}else {u=pb; pb=pb->next; delete u;}}while(pa){u=pa; pa=pa->next; delete u;}∥ 释放结点空间while(pb) {u=pb; pb=pb->next; delete u;}∥释放结点空间pc->next=null;∥置链表尾标识表记标帜.delete Lb; //释放Lb的头结点}(4)已知两个链表A和B分离暗示两个集合,其元素递增分列.请设盘算法求出两个集合A和B 的差集(即仅由在A中消失而不在B中消失的元素所构成的集合),并以同样的情势存储,同时返回该集合的元素个数.[标题剖析]求两个集合A和B的差集是指在A中删除A和B中共有的元素,即删除链表中的响应结点,所以要保管待删除结点的前驱,运用指针pre指向前驱结点.pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La 和Lb均为到达表尾结点时,假如La表中的元素小于Lb表中的元素,pre置为La表的工作指针pa删除Lb表中的元素;假如个中一个表中的元素较小时,删除此表中较小的元素,此表的工作指针后移.当链表La和Lb有一个为空时,依次删除另一个非空表中的所有元素.[算法描写]void Difference(LinkList& La, LinkList& Lb,int *n){∥差集的成果存储于单链表La中,*n是成果集合中元素个数,挪用时为0 pa=La->next; pb=Lb->next;∥pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点 pre=La;∥pre为La中pa所指结点的前驱结点的指针while(pa&&pb){if(pa->data<q->data){pre=pa;pa=pa->next;*n++;}∥ A链表中当前结点指针后移else if(pa->data>q->data)q=q->next;∥B链表中当前结点指针后移 else {pre->next=pa->next;∥处理A,B中元素值雷同的结点,应删除u=pa; pa=pa->next;delete u;} ∥删除结点}}(5)设盘算法将一个带头结点的单链表A分化为两个具有雷同构造的链表B.C,个中B 表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,请求B.C表运用A表的结点).[标题剖析]B表的头结点运用本来A表的头结点,为C表新申请一个头结点.从A表的第一个结点开端,依次取其每个结点p,断定结点p的值是否小于0,运用前插法,将小于0的结点拔出B表,大于等于0的结点拔出C表.[算法描写]void DisCompose(LinkedList A){ B=A;B->next= NULL;∥B表初始化C=new LNode;∥为C申请结点空间C->next=NULL;∥C初始化为空表p=A->next; ∥p为工作指针while(p!= NULL){r=p->next; ∥暂存p的后继if(p->data<0){p->next=B->next; B->next=p; }∥将小于0的结点链入B表,前插法else {p->next=C->next; C->next=p; }∥将大于等于0的结点链入C表,前插法p=r;∥p指向新的待处理结点.}}(6)设计一个算法,经由过程一趟遍历在单链表中肯定值最大的结点.[标题剖析]假定第一个结点中数据具有最大值,依次与下一个元素比较,若其小于下一个元素,则设其下一个元素为最大值,反复进行比较,直到遍历完该链表.[算法描写]ElemType Max (LinkList L ){if(L->next==NULL) return NULL;pmax=L->next; //假定第一个结点中数据具有最大值p=L->next->next;while(p != NULL ){//假如下一个结点消失if(p->data > pmax->data) pmax=p;//假如p的值大于pmax的值,则从新赋值p=p->next;//遍历链表}return pmax->data;(7)设计一个算法,经由过程遍历一趟,将链表中所有结点的链接偏向逆转,仍运用原表的存储空间.[标题剖析]从首元结点开端,逐个地把链表L的当前结点p拔出新的链表头部.[算法描写]void inverse(LinkList &L){// 逆置带头结点的单链表 Lp=L->next; L->next=NULL;while ( p) {q=p->next; // q指向*p的后继p->next=L->next;L->next=p; // *p拔出在头结点之后p = q;}}(8)设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink 和maxk是给定的两个参数,其值可以和表中的元素雷同,也可以不合).[标题剖析]分离查找第一个值>mink的结点和第一个值≥maxk的结点,再修正指针,删除值大于mink且小于maxk的所有元素.[算法描写]void delete(LinkList &L, int mink, int maxk) {p=L->next; //首元结点while (p && p->data<=mink){ pre=p; p=p->next; } //查找第一个值>mink的结点if (p){while (p && p->data<maxk) p=p->next;// 查找第一个值≥maxk的结点q=pre->next; pre->next=p; // 修正指针while (q!=p){ s=q->next; delete q; q=s; } // 释放结点空间}//if}(9)已知p指向双向轮回链表中的一个结点,其结点构造为data.prior.next三个域,写出算法change(p),交流p所指向的结点和它的前缀结点的次序.[标题剖析]知道双向轮回链表中的一个结点,与前驱交流涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链.[算法描写]void Exchange(LinkedList p)∥p是双向轮回链表中的一个结点,本算法将p所指结点与其前驱结点交流.{q=p->llink;q->llink->rlink=p;∥p的前驱的前驱之后继为pp->llink=q->llink;∥p的前驱指向其前驱的前驱.q->rlink=p->rlink;∥p的前驱的后继为p的后继.q->llink=p;∥p与其前驱交流p->rlink->llink=q;∥p的后继的前驱指向原p的前驱p->rlink=q;∥p的后继指向其本来的前驱}∥算法exchange停滞.(10)已知长度为n的线性表A采取次序存储构造,请写一时光庞杂度为O(n).空间庞杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素.[标题剖析]在次序存储的线性表上删除元素,平日要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移).本题请求删除线性表中所有值为item的数据元素,并未请求元素间的相对地位不变.是以可以斟酌设头尾两个指针(i=1,j=n),从两头向中央移动,凡碰到值item的数据元素时,直接将右端元素左移至值为item的数据元素地位.[算法描写]void Delete(ElemType A[ ],int n)∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素.{i=1;j=n;∥设置数组低.高端指针(下标).while(i<j){while(i<j && A[i]!=item)i++;∥若值不为item,左移指针.if(i<j)while(i<j && A[j]==item)j--;∥若右端元素为item,指针左移 if(i<j)A[i++]=A[j--];}第3章栈和队列1.选择题(1)若让元素1,2,3,4,5依次进栈,则出栈次序不成能出如今()种情形.A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1答案:C解释:栈是落后先出的线性表,不难发明C选项中元素1比元素2先出栈,违反了栈的落后先出原则,所以不成能消失C选项所示的情形.(2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为().A.i B.n-i C.n-i+1 D.不肯定答案:C解释:栈是落后先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,解释1,2,3,…,n一次性全体进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1.(3)数组Q[n]用来暗示一个轮回队列,f为当前队列头元素的前一地位,r为队尾元素的地位,假定队列中元素的个数小于n,盘算队列中元素个数的公式为().A.r-f B.(n+f-r)%n C.n+r-fD.(n+r-f)%n答案:D解释:对于非轮回队列,尾指针和头指针的差值等于队列的长度,而对于轮回队列,差值可能为负数,所以须要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n.(4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保管到x中,则应履行操纵().A.x=top->data;top=top->link;B.top=top->link;x=top->link;C.x=top;top=top->link; D.x=top->link;答案:A解释:x=top->data将结点的值保管到x中,top=top->link栈顶指针指向栈顶下一结点,即摘除栈顶结点.(5)设有一个递归算法如下int fact(int n) { //n大于等于0if(n<=0) return 1;else return n*fact(n-1); }则盘算fact(n)须要挪用该函数的次数为().A. n+1 B. n-1 C. n D. n+2答案:A解释:特别值法.设n=0,易知仅挪用一次fact(n)函数,故选A.(6)栈在()中有所运用.A.递归挪用B.函数挪用C.表达式求值D.前三个选项都有答案:D解释:递归挪用.函数挪用.表达式求值均用到了栈的落后先出性质.(7)为解决盘算机主机与打印机间速度不匹配问题,平日设一个打印数据缓冲区.主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中掏出数据.该缓冲区的逻辑构造应当是().A.队列 B.栈C.线性表D.有序表答案:A解释:解决缓冲区问题应运用一种先辈先出的线性表,而队列恰是一种先辈先出的线性表.(8)设栈S和队列Q的初始状况为空,元素e1.e2.e3.e4.e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2.e4.e3.e6.e5和e1,则栈S的容量至少应当是().A.2 B.3 C.4 D. 6答案:B解释:元素出队的序列是e2.e4.e3.e6.e5和e1,可知元素入队的序列是e2.e4.e3.e6.e5和e1,即元素出栈的序列也是e2.e4.e3.e6.e5和e1,而元素e1.e2.e3.e4.e5和e6依次进入栈,易知栈S中最多同时消失3个元素,故栈S的容量至少为3.(9)若一个栈以向量V[1..n]存储,初始栈顶指针top设为n+1,则元素x进栈的准确操纵是( ).A.top++; V[top]=x; B.V[top]=x; top++;C.top--; V[top]=x; D.V[top]=x; top--;答案:C解释:初始栈顶指针top为n+1,解释元素从数组向量的高端地址进栈,又因为元素存储在向量空间V[1..n]中,所以进栈时top指针先下移变成n,之后将元素x存储在V[n].(10)设计一个判别表达式中左,右括号是否配对消失的算法,采取()数据构造最佳.A.线性表的次序存储构造B.队列C. 线性表的链式存储构造D. 栈答案:D解释:运用栈的落后先出原则.(11)用链接方法存储的队列,在进行删除运算时().A. 仅修正头指针B. 仅修正尾指针C. 头.尾指针都要修正D. 头.尾指针可能都要修正答案:D解释:一般情形下只修正头指针,但是,当删除的是队列中最后一个元素时,队尾指针也丧掉了,是以需对队尾指针从新赋值.(12)轮回队列存储在数组A[0..m]中,则入队时的操纵为().A. rear=rear+1B. rear=(rear+1)%(m-1)C. rear=(rear+1)%mD. rear=(rear+1)%(m+1)答案:D解释:数组A[0..m]中共含有m+1个元素,故在求模运算时应除以m+1.(13)最大容量为n的轮回队列,队尾指针是rear,队头是front,则队空的前提是().A. (rear+1)%n==frontB. rear==frontC.rear+1==front D. (rear-l)%n==front答案:B解释:最大容量为n的轮回队列,队满前提是(rear+1)%n==front,队空前提是rear==front.(14)栈和队列的配合点是().A. 都是先辈先出B. 都是先辈后出C. 只许可在端点处拔出和删除元素D. 没有配合点答案:C解释:栈只许可在栈顶处进行拔出和删除元素,队列只许可在队尾拔出元素和在队头删除元素.。

严蔚敏 数据结构课后习题及答案解析

严蔚敏 数据结构课后习题及答案解析

第一章绪论一、选择题1.组成数据的基本单位是()(A)数据项(B)数据类型(C)数据元素(D)数据变量2.数据结构是研究数据的()以及它们之间的相互关系。

(A)理想结构,物理结构(B)理想结构,抽象结构(C)物理结构,逻辑结构(D)抽象结构,逻辑结构3.在数据结构中,从逻辑上可以把数据结构分成()(A)动态结构和静态结构(B)紧凑结构和非紧凑结构(C)线性结构和非线性结构(D)内部结构和外部结构4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。

①(A)数据元素(B)计算方法(C)逻辑存储(D)数据映像②(A)结构(B)关系(C)运算(D)算法5.算法分析的目的是()。

(A)找出数据结构的合理性(B)研究算法中的输入和输出的关系(C)分析算法的效率以求改进(D)分析算法的易懂性和文档性6.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。

①(A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法②(A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性(C)确定性、有穷性和稳定性(D)易读性、稳定性和安全性二、判断题1.数据的机内表示称为数据的存储结构。

()2.算法就是程序。

()3.数据元素是数据的最小单位。

()4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。

()5.算法的时间复杂度取决于问题的规模和待处理数据的初态。

()三、填空题1.数据逻辑结构包括________、________、_________ 和_________四种类型,其中树形结构和图形结构合称为_____。

2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后续结点,其余每个结点有且只有_______个后续结点。

3.在树形结构中,树根结点没有_______结点,其余每个结点有且只有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________。

数据结构(C语言版)第2版习题答案—严蔚敏

数据结构(C语言版)第2版习题答案—严蔚敏
数据结构( C语言版)(第 2版) 课后习题答案
李冬梅 2015.3
目录
第 1 章 绪论 ..................................................................................................................
i 个结点和求第 i 个结点的直接前驱都可
以直接通过数组的下标直接定位,时间复杂度是
O(1) 。
( 3) 向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移
动 的元素个数为(
)。
A. 8
B . 63.5
C . 63
D. 7
答案: B
解释:平均要移动的元素个数为:
n/2 。
( 4)链接存储的存储结构所占存储空间(
)。
A.存储结构
B
.存储实现
C.逻辑结构
D
.运算实现
答案: C
( 3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着(
)。
A .数据具有同一特点
B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致
C.每个数据元素都一样
D.数据元素所包含的数据项的个数要相等
答案: B
( 4)以下说法正确的是(
A . 110 答案: B
B . 108
解释:顺序表中的数据连续存储,所以第
C . 100
D . 120
5 个元素的地址为: 100+2*4=108 。
( 2)在 n 个结点的顺序表中,算法的时间复杂度是
O(1) 的操作是(
)。
A .访问第 i 个结点( 1≤ i ≤ n)和求第 i 个结点的直接前驱( 2≤ i≤ n)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档