《数据结构—用C语言描述》习题答案
《数据结构—用C语言描述》课后习题答案
数据结构课后习题参考答案第一章绪论1.3 (1) O(n)(2)(2)O(n)(3)(3)O(n)(4)(4)O(n1/2)(5)(5)执行程序段的过程中,x,y值变化如下:循环次数x y0(初始)91 1001 92 1002 93 100………………9 100 10010 101 10011 91 9912 92 100………………20 101 9921 91 98………………30 101 9831 91 97到y=0时,要执行10*100次,可记为O(10*y)=O(n)1.5 2100 , (2/3)n , log2n , n1/2 ,n3/2, (3/2)n , n log2n , 2 n ,n! , n n第二章线性表(参考答案)在以下习题解答中,假定使用如下类型定义:(1)顺序存储结构:#define MAXSIZE 1024typedef int ElemType;// 实际上,ElemType可以是任意类型typedef struct{ ElemType data[MAXSIZE];int last; // last表示终端结点在向量中的位置}sequenlist;(2)链式存储结构(单链表)typedef struct node{ElemType data;struct node *next;}linklist;(3)链式存储结构(双链表)typedef struct node{ElemType data;struct node *prior,*next;}dlinklist;(4)静态链表typedef struct{ElemType data;int next;}node;node sa[MAXSIZE];2.1 头指针:指向链表的指针。
因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。
如:链表的头指针是la,往往简称为“链表la”。
数据结构c语言描述》习题及答案耿国华
第1章绪论习题一、问答题1.什么是数据结构2.四类基本数据结构的名称与含义。
3.算法的定义与特性。
4.算法的时间复杂度。
5.数据类型的概念。
6.线性结构与非线性结构的差别。
7.面向对象程序设计语言的特点。
8.在面向对象程序设计中,类的作用是什么9.参数传递的主要方式及特点。
10.抽象数据类型的概念。
二、判断题1.线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2.算法就是程序。
3.在高级语言(如C、或 PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时: 1 = (1+1)×1/2 = (1+12)/2i=2时: 1+2= (1+2)×2/2 = (2+22)/2i=3时: 1+2+3= (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n= (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2 =[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…anx n的值Pn(x),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入ai (i=0,1,…,n), x和n,输出为Pn(x).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
数据结构---C语言的描述_课后大部分习题答案
耿国华《数据结构》程序算法课后答案第二章线性表2.4 设线性表存于a(1:arrsize)的前elenum 个分量中且递增有序。
试写一算法,将X 插入到线性表的适当位置上,以保持线性表的有序性。
Status Insert_SqList(SqList &va,int x)//把x 插入递增有序表va 中{if(va.length+1>va.listsize) return ERROR;va.length++;for(i=va.length-1;va.elem[i]>x&&i>=0;i--)va.elem[i+1]=va.elem[i];va.elem[i+1]=x;return OK;}//Insert_SqList2.6 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。
试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。
Status Delete_Between(Linklist &L,int mink,int maxk)//删除元素递增排列的链表L中值大于mink 且小于maxk 的所有元素{p=L;while(p->next->data<=mink) p=p->next; //p 是最后一个不大于mink 的元素if(p->next) //如果还有比mink 更大的元素{q=p->next;while(q->data<maxk) q=q->next; //q 是第一个不小于maxk 的元素p->next=q;}}//Delete_Between2.7 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a, a ..., a )逆置为(a, a ,..., a )。
数据结构(C语言描述)习题答案
第一章客观习题1.D2.D3.B4. C5.D6.B7.D8.D9.A 10.C 11. A12.B简答题:1.存储实现是设计数据的存储结构,是建立数据的机内表示,包括数据元素和数据元素之间关系的存储。
运算实现是在某种存储实现的基础上具体实现各种运算,其运算实现的核心(即算法设计)是设计实现某一运算的处理步骤。
2. 算法的时间复杂度反映的是算法执行时间的数量级,并不是绝对执行时间。
两个时间复杂度都为O(n2)的算法,对于相同的问题规模n,它们的绝对执行时间也不一定一定相同。
3. 数据的逻辑结构包含两个要素,分别是数据元素和关系。
其中,关系是指数据元素间的逻辑关系。
根据数据元素之间关系的不同特性,通常有四类基本结构构关系,它们的复杂程度依次递进,如图1.1所示。
1) 集合结构2) 线性结构3) 树结构4) 图结构图1.1 四类基本逻辑结构关系图1) 集合结构:数据元素之间除了“属于同一集合”的关系外,无其他关系。
例如,确定一名学生是否为班级成员,只需要将班级看作一个集合结构;2) 线性结构:数据元素之间存在一对一的关系。
例如,将学生信息数据按照其入学报到的时间先后顺序进行排列,组成一个线性结构;3) 树形结构:数据元素之间存在一对多的关系。
例如,在班级管理体系中,班长管理多个组长,每位组长管理多名组员,从而形成树形结构;4) 图结构/网状结构:数据元素之间存在多对多的关系。
例如,多位朋友之间的朋友关系,任何两位同学都可以是朋友,从而形成图结构或者网状结构。
4. 存储结构是由两种种基本的存储方式实现,分别为顺序存储结构和链式存储结构。
1) 顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述;2) 链式存储不像顺序存储结构要求所有元素依次存放在一段连续的存储空间中,而是无需占用一整块存储空间。
由于为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址,通常借助程序设计语言的指针类型来描述。
耿国华_数据结构---C语言的描述_课后大部分习题答案
第一章三、计算下列程序段中X=X+1 的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1 时: 1 = (1+1)×1/2 = (1+1 )/2i=2 时:1+2 = (1+2)×2/2 = (2+22)/2i=3 时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n )/2f(n) = [ (1+2+3+……+n) + (1 + 2 + 3 + …… + n ) ] / 2=[ (1+n)×n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n /6+n /2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n )四、试编写算法求一元多项式Pn(x)=a +a x+a x +a x +…a x 的值P (x ),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a (i=0,1,…,n), x和n,输出为P (x ).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2 )通过全局变量隐式传递。
试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出。
[提示]:float PolyValue(float a[ ], float x, int n) {……}核心语句:p=1; (x 的零次幂)s=0;i 从0 到n 循环s=s+a[i]*p;p=p*x;或:p=x; (x 的一次幂)s=a[0];i 从1 到n 循环s=s+a[i]*p;p=p*x;第二章2.1 描述以下三个概念的区别:头指针,头结点,首元素结点。
《数据结构——C语言描述》习题及答案耿国华
第1章绪论习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10.抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中XX1 的语句频度fori1iltni forj1jltij fork1kltjk xx1 提示: i1 时:1 11×1/2 112/2 i2 时:12 12×2/2 222/2 i3 时:123 13×3/2 332/2 … in 时:123……n 1n×n/2 nn2/2 fn 123……n 12 22 32 …… n2 / 2 1nn/2 nn12n1/6 / 2 nn1n2/6 n3/6n2/2n/3区分语句频度和算法复杂度:Ofn On3 四、试编写算法求一元多项式Pnxa0a1xa2x2a3x3…anxn 的值Pnx0,并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入aii01…n x 和n,输出为Pnx0.通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出。
提示:floatPolyValuefloat a float x int n…… 核心语句:p1 x 的零次幂s0 i 从0 到n 循环ssaip ppx 或:px x 的一次幂sa0 i 从1 到n 循环ssaip ppx 实习题设计实现抽象数据类型“有理数”。
数据结构-c语言描述(第二版)答案耿国华编著
第 3 章 限定性线性表 — 栈和队列
第三章答案
1 按 3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: (1) 如进站的车厢序列为 123,则可能得到的出站车厢序列是什么? (2) 如进站的车厢序列为 123456,能否得到 435612 和 135426 的出站序列,并说 明原因(即写出以“S”表示进栈、 “X ”表示出栈的栈序列操作) 。 【解答】 (1)可能得到的出站车厢序列是:123、132、213、231、321。 (2)不能得到 435612 的出站序列。 因为有 S(1)S(2)S(3)S(4)X(4)X(3)S(5)X(5)S(6)S(6),此时按照“后进先出”的原 则,出栈的顺序必须为 X(2)X(1)。 能得到 135426 的出站序列。 因为有 S(1)X(1)S(2)S(3)X(3)S(4)S(5)X(5)X(4)X(2)X(1)。 3 给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满? 【解答】 (1)顺序栈 (top 用来存放栈顶元素的下标) 判断栈 S 空:如果 S->top==-1 表示栈空。 判断栈 S 满:如果 S->top==Stack_Size-1 表示栈满。 (2) 链栈(top 为栈顶指针,指向当前栈顶元素前面的头结点) 判断栈空:如果 top->next==NULL 表示栈空。 判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满。
2.选择题
(1) A (2) 已知 L 是无表头结点的单链表,且 P 结点既不是首元素结点,也不是尾元素结点。按要 求从下列语句中选择合适的语句序列。 a. 在 P 结点后插入 S 结点的语句序列是:E 、A。 b. 在 P 结点前插入 S 结点的语句序列是:H、L、I 、E、A 。 c. 在表首插入 S 结点的语句序列是:F 、M。 d. 在表尾插入 S 结点的语句序列是:L、J 、A、G。 供选择的语句有: A P->next=S; B P->next= P->next->next; C P->next= S->next; D S->next= P->next; E S->next= L; F S->next= NULL; G Q= P; H while (P->next!=Q) P=P->next; I while (P->next!=NULL) P=P->next; J P= Q; K P= L; L L= S;第1章Fra bibliotek绪 论
数据结构---C语言的描述_课后大部分习题答案
第一章答案1.3计算下列程序中x=x+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;【解答】x=x+1的语句频度为:T(n)=1+(1+2)+(1+2+3)+……+(1+2+……+n)=n(n+1)(n+2)/61. 4试编写算法,求p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。
注意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(x0)。
算法的输入和输出采用下列方法(1)通过参数表中的参数显式传递(2)通过全局变量隐式传递。
讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。
【解答】(1)通过参数表中的参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。
缺点:形参须与实参对应,且返回值数量有限。
(2)通过全局变量隐式传递优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue(){ int i,n;float x,a[],p;printf(“\nn=”);scanf(“%f”,&n);printf(“\nx=”);scanf(“%f”,&x);for(i=0;i<n;i++)scanf(“%f ”,&a[i]); /*执行次数:n次*/p=a[0];for(i=1;i<=n;i++){ p=p+a[i]*x; /*执行次数:n次*/x=x*x;}printf(“%f”,p);}算法的时间复杂度:T(n)=O(n)通过参数表中的参数显式传递float PolyValue(float a[ ], float x, int n){float p,s;int i;p=x;s=a[0];for(i=1;i<=n;i++){s=s+a[i]*p; /*执行次数:n次*/p=p*x;}return(p);}算法的时间复杂度:T(n)=O(n)第二章答案约瑟夫环问题约瑟夫问题的一种描述为:编号1,2,…,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。
数据结构c语言描述课后习题答案
数据结构c语言描述课后习题答案数据结构是计算机科学的基础课程之一,它研究的是如何组织和管理数据以及设计高效的算法来操作这些数据。
在学习数据结构的过程中,解答课后习题是提高自己对知识掌握程度的重要途径。
本文将针对一些常见的数据结构课后习题,给出C语言描述的答案。
一、线性表1. 实现一个顺序表的插入操作。
```cvoid insert(SeqList *list, int index, int value) {if (index < 0 || index > list->length) {printf("插入位置错误");return;}if (list->length == MAX_SIZE) {printf("顺序表已满");return;}for (int i = list->length - 1; i >= index; i--) {list->data[i + 1] = list->data[i];}list->data[index] = value;list->length++;```2. 实现一个链表的删除操作。
```cvoid delete(ListNode **head, int value) { ListNode *p = *head;ListNode *pre = NULL;while (p != NULL) {if (p->data == value) {if (pre == NULL) {*head = p->next;} else {pre->next = p->next;}free(p);return;}pre = p;p = p->next;}printf("链表中不存在该元素");}二、栈和队列1. 实现一个栈的入栈操作。
数据结构C语言描述耿国华习题及答案
第一章习题答案2、××√3、(1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多对多(8)一系列的操作(9)有限性、输入、可行性4、(1)A(2)C(3)C5、语句频度为1+(1+2)+(1+2+3)+…+(1+2+3+…+n)第二章习题答案1、(1)一半,插入、删除的位置(2)顺序和链式,显示,隐式(3)一定,不一定(4)头指针,头结点的指针域,其前驱的指针域2、(1)A(2)A:E、AB:H、L、I、E、AC:F、MD:L、J、A、G或J、A、G(3)D(4)D(5)C(6)A、C3、头指针:指向整个链表首地址的指针,标示着整个单链表的开始。
头结点:为了操作方便,可以在单链表的第一个结点之前附设一个结点,该结点的数据域可以存储一些关于线性表长度的附加信息,也可以什么都不存。
首元素结点:线性表中的第一个结点成为首元素结点。
4、算法如下:int Linser(SeqList *L,int X){ int i=0,k;if(L->last>=MAXSIZE-1){ printf(“表已满无法插入”);return(0);}while(i<=L->last&&L->elem[i]<X)i++;for(k=L->last;k>=I;k--)L->elem[k+1]=L->elem[k];L->elem[i]=X;L->last++;return(1);}5、算法如下:#define OK 1#define ERROR 0Int LDel(Seqlist *L,int i,int k){ int j;if(i<1||(i+k)>(L->last+2)){ printf(“输入的i,k值不合法”);return ERROR;}if((i+k)==(L->last+2)){ L->last=i-2;ruturn OK;}else{for(j=i+k-1;j<=L->last;j++)elem[j-k]=elem[j];L->last=L->last-k;return OK;}}6、算法如下:#define OK 1#define ERROR 0Int Delet(LInkList L,int mink,int maxk) { Node *p,*q;p=L;while(p->next!=NULL)p=p->next;if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk)) { printf(“参数不合法”);return ERROR;}else{ p=L;while(p->next-data<=mink)p=p->next;while(q->data<maxk){ p->next=q->next;free(q);q=p->next;}return OK;}}9、算法如下:int Dele(Node *S){ Node *p;P=s->next;If(p= =s){printf(“只有一个结点,不删除”);return 0;}else{if((p->next= =s){s->next=s;free(p);return 1;}Else{ while(p->next->next!=s)P=p->next;P->next=s;Free(p);return 1;}}}第三章习题答案2、(1)3、栈有顺序栈和链栈两种存储结构。
《数据结构-C语言描述》习题及答案耿国华
第1章绪论习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:1/2 = = (1+12)/2i=1时:1 = (1+1)×1/22/2 = = (2+22)/2i=2时:1+2= (1+2)×2/23/2 = = (3+32)/2i=3时:1+2+3= (1+3)×3/2…n/2 = = (n+n2)/2i=n时:1+2+3+……+n= (1+n)×n/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2请浏览后下载,资料供参考,期待您的好评与关注!=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为Pn(x)通常算法的输入和输出可采用下列两种方式之一:法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
数据结构C语言描述耿国华习题及答案
第一章习题答案2、××√3、(1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多对多(8)一系列的操作(9)有限性、输入、可行性4、(1)A(2)C(3)C5、语句频度为1+(1+2)+(1+2+3)+…+(1+2+3+…+n)第二章习题答案1、(1)一半,插入、删除的位置(2)顺序和链式,显示,隐式(3)一定,不一定(4)头指针,头结点的指针域,其前驱的指针域2、(1)A(2)A:E、AB:H、L、I、E、AC:F、MD:L、J、A、G或J、A、G(3)D(4)D(5)C(6)A、C3、头指针:指向整个链表首地址的指针,标示着整个单链表的开始。
头结点:为了操作方便,可以在单链表的第一个结点之前附设一个结点,该结点的数据域可以存储一些关于线性表长度的附加信息,也可以什么都不存。
首元素结点:线性表中的第一个结点成为首元素结点。
4、算法如下:int Linser(SeqList *L,int X){ int i=0,k;if(L->last>=MAXSIZE-1){ printf(“表已满无法插入”);return(0);}while(i<=L->last&&L->elem[i]<X)i++;for(k=L->last;k>=I;k--)L->elem[k+1]=L->elem[k];L->elem[i]=X;L->last++;return(1);}5、算法如下:#define OK 1#define ERROR 0Int LDel(Seqlist *L,int i,int k){ int j;if(i<1||(i+k)>(L->last+2)){ printf(“输入的i,k值不合法”);return ERROR;}if((i+k)==(L->last+2)){ L->last=i-2;ruturn OK;}else{for(j=i+k-1;j<=L->last;j++)elem[j-k]=elem[j];L->last=L->last-k;return OK;}}6、算法如下:#define OK 1#define ERROR 0Int Delet(LInkList L,int mink,int maxk){ Node *p,*q;p=L;while(p->next!=NULL)p=p->next;if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk)) { printf(“参数不合法”);return ERROR;}else{ p=L;while(p->next-data<=mink)p=p->next;while(q->data<maxk){ p->next=q->next;free(q);q=p->next;}return OK;}}9、算法如下:int Dele(Node *S){ Node *p;P=s->next;If(p= =s){printf(“只有一个结点,不删除”);return 0;}else{if((p->next= =s){s->next=s;free(p);return 1;}Else{ while(p->next->next!=s)P=p->next;P->next=s;Free(p);return 1;}}}第三章习题答案2、(1)3、栈有顺序栈和链栈两种存储结构。
《数据结构—C语言描述》习题及答案 耿国华
第1章绪论习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
实用文档之《数据结构——C语言描述》习题及答案 耿国华
实用文档之"第1章绪论"习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
《数据结构——用C语言描述》+课后题答案
} // 算法结束
2·11
void locate(dlinklist *L)
// L 是带头结点的按访问频度递减的双向链表,本算法先查找数据 x,
// 查找成功时结点的访问频度域增 1,最后将该结点按频度递减插入链表中适当位置。
{ linklist *p=L->next,*q;
//p 为工作指针,指向 L 表的当前元素,q 为 p 的前驱,用于查找插入位置。
s=(linklist *)malloc(sizeof(linklist));//申请空间,不判断溢出 s->data=x; while (p && p->data<=x) {pre=p; p=p->next;} // 查找插入位置 pre->next=s; s->next=p; // 插入元素 } // 算法结束
2·6
void invert(linklist *L)
// 本算法将带头结点的单链表 L 逆置。
//算法思想是先将头结点从表上摘下,然后从第一个元素结点开始,依次前插入以 L 为头结
点的链表中。
{ linklist *p=L->next,*s;
// p 为工作指针,指向当前元素,s 为 p 的后继指针
习题解答(唐策善版)
第一章 绪论(参考答案)
1.3 (1) O(n)
(2) (2) O(n)
(3) (3) O(n)
(4) (4) O(n1/2)
(5) (5) 执行程序段的过程中,x,y 值变化如下:
循环次数
x
y
0(初始) 91
100
1
92
100
2 ……
93 ……
《数据结构——C语言描述》习题及答案 耿国华之欧阳育创编
第1章绪论习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 +32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…anxn的值Pn(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入ai(i=0,1,…,n), x和n,输出为Pn(x0).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。
7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。
在遍历中若发现顶点j,则说明顶点i和j间有路径。
{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g 种,是否存在顶点i//到顶点j的路径。
设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。
void bfs(vtxptr x)//{ initqueue(q);enqueue(q,x);while (!empty(q));{ y=delqueue(q);if (y= =j){ found=1;exit(0);}//有通路,退出else {p=g[x].firstarc;//第一邻接点while (p!=null){k=p->adjvex;if (! Visted[k]) enqueue(q,k);p=p->nextarc}}// if(y= =j)}//while(!empty(q))7.5。
假定该有向图以邻接表存储,各顶点的邻接点按增序排列DFS序列:V1,V3,V6,V7,V4,V2,V5,V8BFS序列:V1,V3,V4,V6,V7,V2,V5,V8DFS森林BFS森林V1 V2 V1V2V3 V4 V3 V4 V5V5V6 V7V6 V8 V8 V77.6简单回路指起点和终点相同的简单路径。
算法基本思想是利用图的遍历,以顶点VK开始,若遍历中再通到VK,则存在简单回路,否则不存在简单回路。
Adjlisttp g ; visited[1..n]=0;Int found =0;//全程变量Int dfs(btxptr x)//从k顶点深度优先遍历图g,看是否存在k的简单回路{ visited[x]=1;p=g[x].firstarc;while(p!=null){ w=p->adjvex;if(w= =k){ found=1;exit(0);}//有简单回路,退出if (!visited[k] ) dfs(w );p=p->nextarc;}//while(p!=null)}// dfs7(2)KRUSKAL算法的最小生成树(权值相同的边选取无顺序) 注:选定点4和5时无优先顺序,二者最短路径均为29 7.90 8 ∞ 1 2 0 0:1->1 A0= 3 0 ∞ path0 = 1 2 0 1:1->25 2 0 1 2 3 ∞:1到3没有直接通路0 8 ∞ path1同path0,加入顶点1后无变化 A1= 3 0 ∞5 2 00 8 ∞ A2= 3 0 ∞ path2同path15 2 ∞共七种用TOPOSORT算法求得第七种,即V5,V6,V1,V2,V3,V4.用邻接表存储结构,邻接点逆序即编号大的排在前面。
入度为0顶点用栈结构存储,初始时从顶点1到顶点N扫描,入度为0的顶点进栈,得V5在栈顶。
7.11void toposort_dfs (graph g;vtptr v)//从顶点v开始,利用深度优先遍历对图g进行拓扑排序。
//基本思想是利用栈s存放顶点,首先出栈的顶点是出度为0的顶点,是拓扑序列中最后一个顶//点。
若出栈元素个数等于顶点数,则拓扑排序成功,输出的是逆拓扑排序序列。
{ visited[1..n]=0;top=0;num=0;//初始化;top 为栈顶指针,num 记出栈元素数s[++top]=v;//顶点入栈 while (top!=0){w=firstadj(g,v);//求顶点v 的第一邻接点 while (w !=0) // w!=0的含义是w 存在 { if ( !visited[w]) s[++top]=w;w=nextadj(g,v,w);//求下一个邻接点 }if (top!=0) {v=s[top--]; num++; printf(v);}//输出顶点 }printf(“\n”);if (num<n) printf(“ 从”,”v”,”顶点开始拓扑排序不能顺利完成 ”); else printf(“拓扑排序成功,输出的是一个逆拓扑序列.\n”); } 7.12V10V1 a5=3 a10=4关键路径V1->V3->V4->V7->V9->V10 长22 关键活动a3,a4,a7,a11,a14关键路径V1->V3->V4->V7->V9->V10 长22关键活动a3,a4,a7,a11,a14第八章排序(参考答案)本章所用数据结构#define N 待排序记录的个数typedef struct{ int key;ElemType other;}rectype;rectype r[n+1]; // r为结构体数组8.2稳定排序有:直接插入排序、起泡排序、归并排序、基数排序不稳定排序有:希尔排序、直接选择排序、堆排序希尔排序例:49,38,49,90,70,25直接选择排序例:2,2,1堆排序例:1,2,28.3void StlinkedInsertSort(s , n);// 对静态链表s[1..n]进行表插入排序,并调整结果,使表物理上排序{ #define MAXINT 机器最大整数typedef struct{ int key;int next;}rec;rec s[n+1]; // s为结构体数组s[0].key=maxint; s[1].next=0; //头结点和第一个记录组成循环链表i=2; //从第2个元素开始,依次插入有序链表中while (i<=n){q=0; p=s[0].next; // p指向当前最小元素,q是p的前驱while (p!=0 && s[p].key<s[i].key) // 查找插入位置{ q=p; p=s[p].next; }s[i].next=p; s[q].next=i; // 将第个元素链入i++;} // while(i<=n) 静态链表的插入// 以下是重排静态链表,使之物理有序i=1; p=s[0].next;while (i<=n){WHILE (p<i) p=s[p].next;q=s[p].next;if (i!=p){ s[i] s[p]; s[i].next=p;p=q;i++;}}}//算法结束8.4void TwoWayBubbleSort( rectype r[n+1]; int n)// 对r[1..n]进行双向冒泡排序。
即相邻两遍向两个相反方向起泡{ int i=1, exchange=1; // 设标记while (exchange){ exchange=0; // 假定本趟无交换for (j=n-i+1 j>=i+1;j--) // 向前起泡,一趟有一最小冒出if (r[j]<r[j-1]) {r[j]←>r[j-1]; exchange=1;} // 有交换for (j= i+1;j>=n-I;j++) // 向后起泡,一趟有一最大沉底if (r[j]>r[j+1]) {r[j]←>r[j+1]; exchange=1;} // 有交换 i++;} // end of WHILE exchange}//算法结束8.5(1)在n=7时,最好情况下进行10次比较。
6次比较完成第一趟快速排序,将序列分成相等程度的序列(各3个元素),再各进行2次比较,完成全部排序。
(2)最好的初始排列:4,1,3,2,6,5,78.6void QuickSort(rectype r[n+1]; int n)// 对r[1..n]进行快速排序的非递归算法{ typedef struct{ int low,high; }nodenode s[n+1];int top;int quickpass(rectype r[],int,int); // 函数声明top=1; s[top].low=1; s[top].high=n;while (top>0){ss=s[top].low; tt=s[top].high; top--;if (ss<tt){ k=quickpass(r,ss,tt);if (k-ss>1) {top++; s[top].low=ss; s[top].high=k-1;}if (tt-k>1) {top++; s[top].low=k+1; s[top].high=tt;}}} // 算法结束int quickpass(rectype r[];int s,t){i=s; j=t; rp=r[i]; x=r[i].key;while (i<j){while (i<j && x<=r[j].key) j--;if (i<j) r[i++]=r[j];while (i<j && x>=r[j].key) i++;if (i<j) r[j--]=r[i];;]r[i]=rp;return (i);} // 一次划分算法结束8.7void QuickSort(rectype r[n+1]; int n)// 对r[1..n]进行快速排序的非递归算法对8.6算法的改进{ typedef struct{ int low,high; }nodenode s[n+1];int top;int quickpass(rectype r[],int,int); // 函数声明top=1; s[top].low=1; s[top].high=n;ss=s[top].low; tt=s[top].high; top--; flag=true;while (flag || top>0){k=quickpass(r,ss,tt);if (k-ss>tt-k) // 一趟排序后分割成左右两部分{if (k-ss>1) // 左部子序列长度大于右部,左部进栈{top++; s[top].low=ss; s[top].high=k-1; }if (tt-k>1) ss=k+1; // 右部短的直接处理else flag=false; // 右部处理完,需退栈}else if (tt-k>1) //右部子序列长度大于左部,右部进栈{top=top+1; s[top].low=k+1; s[top].high=tt; }if (k-ss>1) tt=k-1 // 左部短的直接处理else flag=false // 左部处理完,需退栈}if (!flag && top>0){ss=s[top].low; tt=s[top].high; top--; flag=true;}} // end of while (flag || top>0)} // 算法结束int quickpass(rectype r[];int s,t)// 用“三者取中法”对8.6进行改进{ int i=s, j=t, mid=(s+t)/2;rectype tmp;if (r[i].key>r[mid].key) {tmp=r[i];r[i]=r[mid];r[mid]=tmp } if (r[mid].key>r[j].key){tmp=r[j];r[j]=r[mid];if (tmp>r[i]) r[mid]=tmp; else {r[mid]=r[i];r[i]=tmp }}{tmp=r[i];r[i]=r[mid];r[mid]=tmp }// 三者取中:最佳2次比较3次移动;最差3次比较10次移动rp=r[i]; x=r[i].key;while (i<j){while (i<j && x<=r[j].key) j--;if (i<j) r[i++]=r[j];while (i<j && x>=r[j].key) i++;if (i<j) r[j--]=r[i];;]r[i]=rp;return (i);} // 一次划分算法结束8.8viod searchjrec(rectype r[],int j)//在无序记录r[n]中,找到第j(0<=j<n)个记录。