《数据结构》系统答案严蔚敏李冬梅人民邮电出版社
数据结构(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章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;。