数据结构---C语言描述答案

合集下载

《数据结构—用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语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版数据结构(C语言版)课后习题答案完整版一、数据结构概述数据结构是计算机科学中一个重要的概念,用来组织和存储数据,使之可以高效地访问和操作。

在C语言中,我们可以使用不同的数据结构来解决各种问题。

本文将提供完整版本的C语言数据结构的课后习题答案。

二、顺序表1. 顺序表的定义和基本操作顺序表是一种线性表,其中的元素在物理内存中连续地存储。

在C 语言中,我们可以通过定义结构体和使用指针来实现顺序表。

以下是顺序表的一些基本操作的答案:(1)初始化顺序表```ctypedef struct{int data[MAX_SIZE];int length;} SeqList;void InitList(SeqList *L){L->length = 0;}```(2)插入元素到顺序表中```cbool Insert(SeqList *L, int pos, int elem){if(L->length == MAX_SIZE){return false; // 顺序表已满}if(pos < 1 || pos > L->length + 1){return false; // 位置不合法}for(int i = L->length; i >= pos; i--){L->data[i] = L->data[i-1]; // 向后移动元素 }L->data[pos-1] = elem;L->length++;return true;}```(3)删除顺序表中的元素```cbool Delete(SeqList *L, int pos){if(pos < 1 || pos > L->length){return false; // 位置不合法}for(int i = pos; i < L->length; i++){L->data[i-1] = L->data[i]; // 向前移动元素 }L->length--;return true;}```(4)查找顺序表中的元素```cint Search(SeqList L, int elem){for(int i = 0; i < L.length; i++){if(L.data[i] == elem){return i + 1; // 找到元素,返回位置 }}return -1; // 未找到元素}```2. 顺序表习题解答(1)逆置顺序表```cvoid Reverse(SeqList *L){for(int i = 0; i < L->length / 2; i++){int temp = L->data[i];L->data[i] = L->data[L->length - 1 - i]; L->data[L->length - 1 - i] = temp;}}```(2)顺序表元素去重```cvoid RemoveDuplicates(SeqList *L){for(int i = 0; i < L->length; i++){for(int j = i + 1; j < L->length; j++){if(L->data[i] == L->data[j]){Delete(L, j + 1);j--;}}}}```三、链表1. 单链表单链表是一种常见的链式存储结构,每个节点包含数据和指向下一个节点的指针。

数据结构---C语言的描述_课后大部分习题答案

数据结构---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语言版)习题参考答案

数据结构(C语言版)习题参考答案

数据结构(C语言版)习题参考答案数据结构(C语言版)习题参考答案1. 数据结构简介数据结构是计算机科学中重要的概念之一,它关注如何组织和存储数据,以便有效地进行访问和操作。

C语言是一种广泛应用于数据结构实现的编程语言。

本文将提供一些常见数据结构习题的参考答案,帮助读者理解和掌握数据结构的基本概念与实现。

2. 数组数组是一种线性结构,存储具有相同数据类型的元素。

以下是一些数组习题的参考答案:2.1 统计数组中某个元素出现的次数```int countOccurrences(int arr[], int n, int x) {int count = 0;for (int i = 0; i < n; i++) {if (arr[i] == x) {count++;}}return count;}```2.2 查找数组中的最大值和最小值```void findMinMax(int arr[], int n, int* min, int* max) { *min = arr[0];*max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] < *min) {*min = arr[i];}if (arr[i] > *max) {*max = arr[i];}}}```3. 链表链表是一种动态数据结构,每个节点包含数据和指向下一个节点的指针。

以下是一些链表习题的参考答案:3.1 反转链表```Node* reverseLinkedList(Node* head) {Node* prev = NULL;Node* curr = head;while (curr != NULL) {Node* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;}```3.2 合并两个有序链表```Node* mergeLists(Node* list1, Node* list2) {if (list1 == NULL) {return list2;}if (list2 == NULL) {return list1;}if (list1->data < list2->data) {list1->next = mergeLists(list1->next, list2);return list1;} else {list2->next = mergeLists(list1, list2->next);return list2;}}```4. 栈和队列栈和队列是两种重要的线性数据结构,栈支持后进先出(LIFO),队列支持先进先出(FIFO)。

数据结构(C语言版)课后习题答案

数据结构(C语言版)课后习题答案

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

答案:例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。

每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。

数据结构C语言版习题参考答案

数据结构C语言版习题参考答案

附录习题参考答案习题1参考答案1.1.选择题(1). A. (2). A. (3). A. (4). B.,C. (5). A. (6). A. (7). C. (8). A. (9). B. (10.)A.1.2.填空题(1). 数据关系(2). 逻辑结构物理结构(3). 线性数据结构树型结构图结构(4). 顺序存储链式存储索引存储散列表(Hash)存储(5). 变量的取值范围操作的类别(6). 数据元素间的逻辑关系数据元素存储方式或者数据元素的物理关系(7). 关系网状结构树结构(8). 空间复杂度和时间复杂度(9). 空间时间(10). Ο(n)1.3 名词解释如下:数据:数据是信息的载体,是计算机程序加工和处理的对象,包括数值数据和非数值数据。

数据项:数据项指不可分割的、具有独立意义的最小数据单位,数据项有时也称为字段或域。

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

数据逻辑结构:数据的逻辑结构就是指数据元素间的关系。

数据存储结构:数据的物理结构表示数据元素的存储方式或者数据元素的物理关系。

数据类型:是指变量的取值范围和所能够进行的操作的总和。

算法:是对特定问题求解步骤的一种描述,是指令的有限序列。

1.4 语句的时间复杂度为:(1) Ο(n2)(2) Ο(n2)(3) Ο(n2)(4) Ο(n-1)(5) Ο(n3)1.5 参考程序:main(){int X,Y,Z;scanf(“%d, %d, %d”,&X,&Y,Z);if (X>=Y)if(X>=Z)if (Y>=Z){ printf(“%d, %d, %d”,X,Y,Z);}else{ printf(“%d, %d, %d”,X,Z,Y);}else{ printf(“%d, %d, %d”,Z,X,Y);}elseif(Z>=X)if (Y>=Z){ printf(“%d, %d, %d”,Y,Z,X);}else{ printf(“%d, %d, %d”,Z,Y,X);}else{ printf(“%d, %d, %d”,Y,X,Z);}}1.6 参考程序:main(){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]);p=a[0];for(i=1;i<=n;i++){ p=p+a[i]*x;x=x*x;}printf(“%f”,p)’}习题2参考答案2.1选择题(1). C. (2). B. (3). B. (4). B. 5. D. 6. B. 7. B. 8. A. 9. A. 10. D.2.2.填空题(1). 有限序列(2). 顺序存储和链式存储(3). O(n) O(n)(4). n-i+1 n-i(5). 链式(6). 数据指针(7). 前驱后继(8). Ο(1) Ο(n)(9). s->next=p->next; p->next=s ;(10). s->next2.3. 解题思路:将顺序表A中的元素输入数组a,若数组a中元素个数为n,将下标为0,1,2,…,(n-1)/2的元素依次与下标为n,n-1,…, (n-1)/2的元素交换,输出数组a的元素。

数据结构(C语言描述)(第2版 李学刚 参考答案 (9)[1页]

数据结构(C语言描述)(第2版 李学刚 参考答案 (9)[1页]

同步训练2-1参考答案
一、单项选择题
1.线性表是(C )的有限序列。

A.数据B.数据项C.数据元素D.整型数据2.以下关于线性表叙述不正确的是(C )。

A.线性表中的数据元素可以是数字、字符、记录等不同类型
B.线性表中包含的数据元素个数不是任意的
C.线性表中的每个结点都有且只有一个直接前驱和直接后继
D.存在这样的线性表:表中各结点都没有直接前驱和直接后继
3.线性表的长度是指(B )。

A.初始时线性表中包含数据元素的个数
B.线性表中当前包含数据元素的个数
C.对线性表进行操作后线性表中包含数据元素的个数
D.线性表中可以包含数据元素的最大个数
4.线性表的容量是指(D )。

A.初始时线性表中包含数据元素的个数
B.线性表中当前包含数据元素的个数
C.对线性表进行操作后线性表中包含数据元素的个数
D.线性表中可以包含数据元素的最大个数
5.以下关于线性表叙述正确的是(C )。

A.数据元素在线性表中可以是不连续的
B.线性表是一种存储结构
C.线性表是一种逻辑结构
D.对线性表做插入或删除操作可使线性表中的数据元素不连续
6.在线性表的下列运算中,不改变数据元素之间结构关系的运算是(D )。

A.插入B.删除C.排序D.查找。

数据结构C语言版习题详细答案资料

数据结构C语言版习题详细答案资料
数据对象:D={r,i|r,i 为实数} 数据关系:R={<r,i>} 基本操作:
InitComplex(&C,re,im) 操作结果:构造一个复数 C,其实部和虚部分别为 re 和 im
DestroyCmoplex(&C) 操作结果:销毁复数 C
Get(C,k,&e) 操作结果:用 e 返回复数 C 的第 k 元的值
int Time(int n) { count = 0; x=2; while(x<n/2) { x *= 2; count++; } return count;
}
解: o(log 2 n)
count= log 2 n 2
1.11 已知有实现同一功能的两个算法,其时间复杂度分别为 O 2n 和 O n10 ,假设现实计算机可连续
1.14 判断下列各对函数 f n 和 g n ,当 n 时,哪个函数增长更快?
(1) f n 10n2 ln n!10n3 , gn 2n4 n 7
1.6 在程序设计中,常用下列三种不同的出错处理方式: (1) 用 exit 语句终止执行并报告错误; (2) 以函数的返回值区别正确返回或错误返回; (3) 设置一个整型变量的函数参数以区别正确返回或某种错误返回。
试讨论这三种方法各自的优缺点。 解:(1)exit 常用于异常错误处理,它可以强行中断程序的执行,返回操作系统。 (2)以函数的返回值判断正确与否常用于子程序的测试,便于实现程序的局部控制。 (3)用整型函数进行错误处理的优点是可以给出错误类型,便于迅速确定错误。
} 解:(1) n-1 (2) n-1 (3) n-1
n(n 1)
(4) n+(n-1)+(n-2)+...+1=
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(c)O(log2n)
3.D
4.D
5.D
第二章
一、单项选择题
(1) ~(5) DACAA (6)~(10) BAAAD
二、填空题
(1)链域 (2)插入 (3)删除 (4)n-i+1 (5)n-I (6)n/2 (7)(n-1)/2
(8)h=NULL (9)h->next=NULL (10)p->next=h (11) p->next->prior=s
三、应用题
1.顺序表:逻辑上相邻的数据元素其物理存储位置必须紧邻。其优点是:节省存储,可
以随机存取。
链表:逻辑上相邻的数据元素其物理存储位置不要求紧邻,用指针来描述结点间的逻辑
关系,故插入和删除运算比较方便。
2.在带表头结点的单链表中,头指针指向表头结点,不带表头结点的单链表中,头指针
指向表中第一个结点(又称首元),当进行查找运算时,必须从头指针开始去顺次访问表中每
C1=substr(S,3,1)=”y”
C2=substr(S,6,1)=”+”
C3=substr(S,7,1)=”*”
C4=concat(C3,c11)=”*y”
T=replace(S,3,1,C2)=replace(S,3,1,substr(S,6,1))=”(x+z)+x”
s[top++]=q->data[++q->front]; q->front=-1;q->rear=0; while(top>0) q->data[q->rear++]=s[--top]; } 2. (1)递归算法: int f1(int n)
{ int f; if(n==0) return (1); else return(n*f1(n/2));
课后答案网
www.khd课后a答w案.网com
参考答案
第一章
1.(a)是线性结构,对应的数据逻辑结构图见图 1-2。
(b)是树形结构,对应的数据逻辑结构图见图 1-3。
(c)是有向图,其数据逻辑结构图见图 1-4。
2.(a)O(m×n)
(b)s+=b[i][j]的重复执行次数是n(n+1)/2,时间复杂度是O(n2)
#define M 100
int insort(Slist *L,int z)
{int i;
if(L->n>=M)
1
www.khd课后a答w案.网com
课后答案网
{printf(“overflow"); return 0;}
else for(i=L->n;i>=0;i--) if(L->data[i]>x L->data[i+1]=L->data[i]; else break; L->data[i+1]=x; L->n++; return 1;
二、填空题
(1)两个串的长度相等且对应位置上的字符相同。
(2)是由零个字符组成的串 (3)0
6
课后答案网
www.khd课后a答w案.网com
(4)”goodmorning” (5)”nin”
(6)4
(7)”goto” (8)m
(9)m(n-m+1)
(10)Loc(a[0][0])=1000-88=912
(11)n(n+1)/2+1 (12) n(n+1)/2 (13)i(i-1)/2+j-1
(14)(2n-j+2)(j-1)/2+i-j (15)3 (16)4 (17)a(18)((b),((c,(d))))
(19)三元组表 (20)十字链表 (21)子表 (22)子表
三、应用题
1.用联接、取子串、置换运算将串 S=”(xyz)+*”转化为 T=”(x+z)*y”。
{printf(“queue is empty”); return 0; } p=rear->next->next; *x=p->data; rear->next->next=p->next; free(p); return 1; }
第四章
一、单项选择题
(1)一(5)DBDBD
(6)-(10)BDBBA (11)-(13)CAA
} 2.逐个查找单链表中的结点 x,并计数。 int number(lnode *h,int x) { int n=0;
while(h) {if(h->data==x)
n++; h=h->next; } return s; } 3.前插法建立带表头结点的单链表算法中的 tag 为输人数据结束标志。 Lnode *createhh(int tag) { int x; Lnode *p,*h=(Lnode *)malloc(sizeof(Lnode)); h->next=NULL; printf(“input x:”); scanf(“%d”,&x); while(x!=tag) {p=(Lnode*)malloc(sizeof(Lnode)); p->data=x; p->next=h->next; h->next=p; scanf(“%d”,&x); } return h; }
#define MAX 100
4
www.khd课后a答w案.网com
课后答案网
typedef struct {int data[MAX]; int front,rear; }Squeue;
算法描述如下: void invert(Squeue *q)
{int s[MAX],top=0; while(q->front<q->rear)
(12)p->next=s (13)p->prior->next (14)p->prior=s (15)p->next->prior=p
(16)p->prior->next=p (17)p->next->prior=p->prior (18)r->next=p
(19)r=p (20)r->next=q->next
h->next=NULL; while(p) {s=p;p=p->next;
s->next=h->next; h->next=s; } } 6.逐个检测顺序表中其值在 x 和 y 之间的元素,并计数 k,再将其值大于 y 的元素向前移 动 k 个元素。算法描述如下: void deletexy(Slist *a,int x,int y) { int i,k=0; for(i=0;i<a->n;i++) if(a->data[i]>=x&&a->data[i]<=y) k++;
{p=(Lnode*)malloc(sizeof(Lnode)); p->data=x; r->next=p; r=p; scanf(“%d”,&x);
} r->next=h->next; free(h); return r; } 5.设 p 指向待逆置链表中的第一个结点,先将表头结点的链域置空。顺次取出待逆置链 表中的第一个结点,用前插法插入到带表头结点的单链表中。 Void reverseh(Lnode *h) { Lnode *s,*p=h->next;
} (2)将上述递归函数转换成非递归函数时,使用了一个栈,用于存储调用参数和函数值, 这里采用一维数组 s[n]作为栈,用一个栈顶指针 top。算200; int f2(int n)
{ int s[maxlen]; int top=0,fval=1; while(n!=0) {s[top]=n; n=n/2; top++; } while(top>=0) {fval=fval*s[top]; top--; }
return fval;
5
课后答案网
www.khd课后a答w案.网com
} 3.仅设队尾指针的带表头结点的循环链表,找队首结点为 rear->next->next。 (1)初始化
Lnode *int queue() {Lnode *rear;
rear=(Lnode*)malloc(sizeof(Lnode)); rear->next=rear; return rear; } (2)入队算法 Lnode *enqueue(Lnode *rear,int x) { Lnode *p=(Lnode*)malloc(sizeof(Lnode)); p->data=x; p->next=rear->next; rear->next=p; return p; } (3)出队算法 int outqueue(Lnode *rear,int *x) { Londe *p; if(rear->next=rear)
3
www.khd课后a答w案.网com
课后答案网
else a->data[i-k]=a->data[i];
a->n=a->n-k;} 第三章 一、单项选择题 (1)-(5) CACCA (6)-(7)BC 二、填空题 (1)栈顶 (2)栈底 (3)队尾 (4)队首 (5)O(n) (6)O(1) (7)O(1) (8)O(1) (9)front=rear (10)(rear+1)%m=front (11)(rear-front+m)%m (12) 向是的两端 三、应用题 1.栈和队列是操作位置受限的线性表,即对插入和删除运算的位置加以限制。栈是仅允 许在表的一端进行插入和删除运算的线性表,因而是后进先出表。而队列是只允许在表的一 端插入,另一端进行删除运算的线性表,因而是先进先出表。 2.循环队列的优点是解决了“假上溢”问题。 设用数组 A[m]来存放循环队列,设 front 指向实际队首,rear 指向新元素应插入的位置 时,front=rear 即可能是队空,又可能是队满,为了区分队空和队满可采用下列三种方案: (1)用“少用一个元素空间”的方案,初态 fron=rear=0,判断队空的条件是 fron=rear, 判断队满的条件是(reaf+1)%m=front。 (2)用“设队空标志”的方法,如设 front=-1 时为队空标志,初态是 front=-1,rear=0。 当 front=rear 时则队满。 (3)用 count 存放表中元素个数,当 count=0 时为队空,当 count=m 时为队满。 3.若进栈序列为 a,b,c,d,全部可能的出栈序列是: abcd,abdc,acbd,acdb,adcb,bacd,badc,bcad,bcda,bdca,cbad, cbda,cdba,dcba, 不可能的出栈序列为:adbc,bdac,cdab,cadb,cadb,dabc,dacb, dbac,dbca,dcab。 4.由于队列中操作遵循的原则是先进先出,出队元素的顺序是 bdcfea,故元素进队的 顺序也是 bdcfea,元素进队的顺序与元素出栈的顺序相同,在栈中存取数据遵循的原则是后 进先出,要得到出栈序列 bdcfea,栈的容量至少是应该存放 3 个元素的空间。 5. 3 4 25 6 15+-/8*+ 四、算法设计题 1.解本题的基本思想是:先将顺序队列 q 中所有元素出队,并依次进入顺序栈 s 中, 然后出栈,再依次入队。设队列中的元素为 a1,a2,…,an,出队并进栈的序列为 a1,a2,…, an,出栈并入队的序列为 an,an-1,…,a1,可见顺序队列 q 中所有元素已逆置了。顺序队 列的类型定义为:
相关文档
最新文档