数据结构 耿国华 西北大学 4-4总结与提高

西北大学 《数据结构》
例题
要求编写一个用带头结点的单链表实现串的模式匹配算法,每个结点存放1个字符(结点大小为1)。

借助于前面的结点大小为1定义链串类型LKString。

【问题分析】
该算法类同顺序串的简单模式匹配,实现匹配过程序需考虑链表的特征(从头比较的技术,指针保留的技术)。

[算法思想]:
从主串s 的第1个字符和模式串t 的第一个字符开始比较,如果相等,就继续比较后续字符,如果不等,则从主串s 的下一个字符开始重新和模式串t 比较。

一直到模式串t 中的每一个字符依次和主串s 中的对应字符相等,则匹配成功,返回主串的当前起始位置指针。

如果主串中没有和模式串相同的子串,则称匹配不成功,返回空指针NULL。

[算法描述]:
Link *StrIndex(LKString *s, LKString *t)
/* 求模式串t 在主串s 中第一次出现的位置指针 */
{
Link *sp, *tp, *start;
if (t->len == 0) return s->head->next; /* 空串是任意串的子串 */start = s->head->next; /* 记录主串的起始比较位置 */sp = start; /* 主串从start 开始 */tp = t->head->next; /* 模式串从第一个结点开始 */while(sp != NULL && tp != NULL)
{if (sp->ch == tp-
>ch) /* 若当前对应
字符相同,则继续比较 */例题
第四章 串
课外作业
{
sp = sp->next;
tp = tp->next;
}
else
/* 发现失配字符,则返回到主串当前起始位置的下一个结点继续比较*/ {
start = start->next; /* 更新主串的起始位置 */
sp = start;
tp = t->head->next; /* 模式串从第一个结点重新开始 * /
}
}
if ( tp == NULL) return start;
/* 匹配成功,返回主串当前起始位置指针 */
else return NULL; /* 匹配不成功,返回空指针 */
}
【链串的模式匹配算法】。

合集下载

数据结构c语言版耿国华课后习题答案

数据结构c语言版耿国华课后习题答案

数据结构c语言版耿国华课后习题答案数据结构是计算机科学中的一个重要领域,它涉及到数据的组织、管理和存储方式,以便可以高效地访问和修改数据。

C语言作为一种高级编程语言,提供了丰富的数据结构实现方法。

耿国华教授编写的《数据结构C语言版》一书,为学习者提供了深入理解和实践数据结构的机会。

以下是该书课后习题的一些参考答案。

# 第一章绪论1. 习题1:数据结构的定义是什么?- 参考答案:数据结构是计算机科学中用于组织、管理和存储数据的方式,以便可以高效地访问和修改数据。

2. 习题2:为什么需要学习数据结构?- 参考答案:学习数据结构有助于提高编程效率,优化算法性能,以及更好地解决实际问题。

# 第二章线性表1. 习题1:线性表的特点是什么?- 参考答案:线性表的特点是数据元素之间存在一对一的线性关系,可以顺序存储或链式存储。

2. 习题3:如何实现线性表的插入操作?- 参考答案:线性表的插入操作通常涉及找到插入位置,然后将新元素插入到该位置,并调整后续元素。

# 第三章栈和队列1. 习题1:栈的后进先出(LIFO)特性是什么?- 参考答案:栈的后进先出特性意味着最后插入的元素将是第一个被删除的元素。

2. 习题2:如何用C语言实现一个队列?- 参考答案:可以用数组或链表来实现队列。

队列的基本操作包括入队(enqueue)和出队(dequeue)。

# 第四章树和二叉树1. 习题1:二叉树的定义是什么?- 参考答案:二叉树是每个节点最多有两个子节点的树结构,通常分为左子节点和右子节点。

2. 习题3:二叉树的遍历方法有哪些?- 参考答案:二叉树的遍历方法包括前序遍历、中序遍历、后序遍历和层序遍历。

# 第五章图1. 习题1:图的基本概念有哪些?- 参考答案:图由顶点(节点)和边组成,可以表示对象之间的关系。

2. 习题2:图的存储方式有哪些?- 参考答案:图的存储方式主要有邻接矩阵和邻接表两种。

# 结语通过学习《数据结构C语言版》一书,读者可以掌握各种数据结构的基本概念、特性以及实现方法。

第5章 数据结构C语言描述(耿国华)

第5章 数据结构C语言描述(耿国华)
m
r
n m
k-1
图5.5 三维数组看成r个m×n的二维数组
j-1
第5章 数组和广义表 假定每个元素占一个存储单元,采用以行为主序的方法存 放,即行下标r变化最慢, 纵下标n变化最快。 首元素a111的地
址为Loc[1, 1, 1],求任意元素aijk的地址。
显 然 , ai11 的 地 址 为 Loc [ i, 1, 1 ] =Loc [ 1, 1, 1 ] +(i1)×m×n, 因为在该元素之前, 有i-1个m×n的二维数组。 由ai11的地址和二维数组的地址计算公式,不难得到三维数组任 意元素aijk的地址:
第5章 数组和广义表 假设有一个3×4×2的三维数组A ,共有24个元素,其 逻辑结构如图5.4所示。
纵
a112 a122
a132
a142
24 34 2 2
列 行
a211 a311
a221 a321
a231 a331
a241 a341
图5.4 三维数组的逻辑结构图
a
a111 a121
a131
a141
矩阵;若矩阵中的所有元素均满足aij=aji ,则称此矩阵为对称 矩阵。
图5.6 下三角矩阵A
第5章 数组和广义表 对于下三角矩阵的压缩存储,我们只存储下三角的非零 元素,对于零元素则不存。我们按“行序为主序”进行存储,
得到的序列是a11, a21, a22, a31, a32, a33, …, an1, an2, …, ann。由于下
同样,对于上三角矩阵,也可以将其压缩存储到一个大小 为n(n+1)/2的一维数组C中。其中元素aij(i<j)在数组C中的存储位 置为: Loc[i, j]=Loc[1, 1]+j(j-1)/2+i-1

数据结构课后习题答案(耿国华版

数据结构课后习题答案(耿国华版

第1章绪论2 、(1)×(2)×(3) √3 、(1)A(2)C(3)C5、f or计(算i=下1n程;序中 1 得语句频度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)/66 、编写算法,求一元多项式p。

(x)=a。

+a,x+a₂X2+……、+a Xn得值p(x) 并确定算法中每一语句得执行次数与整个算法得时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数.注意:本题中得输入为a,(i=01,…n)、x 与n,输出为P。

(x)。

算法得输入与输出采用下列方法(1)通过参数表中得参数显式传递(2)通过全局变量隐式传递。

讨论两种方法得优缺点,并在算法中以您认为较好得一种实现输入输出.【解答】(1)通过参数表中得参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。

缺点:形参须与实参对应,且返回值数量有限。

(2)通过全局变量隐式传递优点:减少实参预形参得个数,从而减少内存空间以及传递数据时得时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue({ int,in;floatx,a[]p;pri n tf(hn=”);s c anf(“%f,”&n);printf(“x=”;)sca nf(“%f&x);f or(i=0;i<n; i++)s c anf(%f ,&a[i]; /*执行次数:n 次 */p=a[0];for (i=1;i<=n;i++){ p=p+a [i]*x; /*执行次数:n次*/x= x*x;}prin t f(%f” p);}算法得时间复杂度:T(n)=0(n)通过参数表中得参数显式传递f loat PolyVa lue(float a[ ], float x, i nt n)f 1 oat p, s;int;is p a X0];for(=1;i<= n;i++)/执行次数:n 次*/{s=s+a [i]* p;p=p*x;}re turn(p);算法得时间复杂度:T(n)=O(n)第2章线性表习题1、填空:(1)在顺序表中插入或者删除一个元素,需要平均挪移一半元素,具体挪移得元素个数与插入或者删除得位置有关。

数据结构c语言版耿国华课后习题答案

数据结构c语言版耿国华课后习题答案

数据结构c语言版耿国华课后习题答案数据结构是计算机科学中非常重要的一门课程,它涉及到了计算机程序设计中的数据组织、存储和操作等方面。

而耿国华教授的《数据结构c语言版》是这门课程中的经典教材之一,它通过讲解各种数据结构的原理和实现方法,帮助学生更好地理解和掌握这门课程的知识。

本文将针对《数据结构c语言版》中的一些典型习题进行解答,帮助读者更好地理解和掌握这些知识点。

1. 线性表线性表是数据结构中最基本的一种数据结构,它包含了顺序表和链表两种实现方式。

在习题中,我们需要实现线性表的基本操作,如插入、删除、查找等。

通过编写代码,我们可以更好地理解这些操作的实现原理和思路。

2. 栈和队列栈和队列是线性表的特殊形式,它们分别具有“先进后出”和“先进先出”的特点。

在习题中,我们需要实现栈和队列的基本操作,如入栈、出栈、入队、出队等。

通过编写代码,我们可以更好地理解这些操作的实现方法和应用场景。

3. 树和二叉树树是一种非线性的数据结构,它具有层次关系。

二叉树是树的一种特殊形式,它每个节点最多只有两个子节点。

在习题中,我们需要实现树和二叉树的基本操作,如创建、插入、删除、遍历等。

通过编写代码,我们可以更好地理解这些操作的实现原理和应用场景。

4. 图图是一种非线性的数据结构,它由节点和边组成。

在习题中,我们需要实现图的基本操作,如创建、插入、删除、遍历等。

通过编写代码,我们可以更好地理解这些操作的实现方法和应用场景。

5. 查找和排序查找和排序是数据结构中非常重要的一部分,它们在实际应用中具有广泛的应用。

在习题中,我们需要实现各种查找和排序算法,如顺序查找、二分查找、冒泡排序、快速排序等。

通过编写代码,我们可以更好地理解这些算法的实现原理和性能特点。

通过以上习题的解答,我们可以更好地理解和掌握《数据结构c语言版》中的知识点。

同时,通过编写代码,我们可以锻炼自己的编程能力和解决问题的能力。

希望读者能够通过习题的解答,更好地理解和应用数据结构这门课程的知识。

数据结构-C语言描述(耿国华主编)教案

数据结构-C语言描述(耿国华主编)教案

西安文理学院精品课《数据结构》教案计算机科学系韩利凯《数据结构》第一章绪论[教学目标]掌握数据结构的定义、内容、方法、描述、评价。

[重点、难点]数据结构的研究范围,研究采用的方法,算法规则描述的工具,对算法作性能评价。

[教学方法]用多媒体课件( ppt )以及与生活实例相结合等方法讲授,这样便于描述相关概念及学生记笔记,加深他们的印象,使基础知识掌握地比较牢固。

[学习要点]1. 熟悉各名词、术语的含义,掌握基本概念,特别是数据的逻辑结构和存储结构之间的关系。

分清哪些是逻辑结构的性质,哪些是存储结构的性质。

2. 了解抽象数据类型的定义、表示和实现方法。

3.理解算法五个要素的确切含义:①动态有穷性(能执行结束);②确定性(对于相同的输入执行相同的路径);③有输入;④有输出;⑤可行性(用以描述算法的操作都是足够基本的)。

4.掌握计算语句频度和估算算法时间复杂度的方法。

1.1 什么是数据结构(定义)首先介绍数据结构的相关名词。

1.数据(Data)数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。

2.数据元素(Data Element)数据元素是组成数据的基本单位 ,是数据集合的个体,在计算机中通常作为一个整体进行考虑和处理。

例如:学生登记表是数据,每一个学生的记录就是一个数据元素。

3.数据对象(Data Object)数据对象是性质相同的数据元素的集合,是数据的一个子集。

4.数据结构(DA TA Structure)数据结构是指相互之间存在一种或多种特定关系的数据元素集合,是带有结构的数据元素的集合,它指的是数据元素之间的相互关系,即数据的组织形式。

5.数据类型(Data Type)数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。

6.数据抽象与抽象数据类型1)数据的抽象高级语言中提供整型、实型、字符、记录、文件、指针等多种数据类型,可以利用这些类型构造出象栈、队列、树、图等复杂的抽象数据类型。

数据结构c语言版耿国华课后习题答案

数据结构c语言版耿国华课后习题答案

数据结构c语言版耿国华课后习题答案数据结构C语言版耿国华课后习题答案数据结构是计算机科学中非常重要的一个领域,它研究如何组织和存储数据,以便能够高效地进行检索和操作。

C语言作为一种高效的编程语言,被广泛应用于数据结构的实现和操作中。

耿国华编写的《数据结构C语言版》是一本经典的教材,其中包含了大量的习题,帮助学生巩固所学的知识。

在这本教材中,耿国华提供了大量的习题,涵盖了数据结构的各个方面,包括数组、链表、栈、队列、树等。

这些习题不仅考察了学生对数据结构的理解,还帮助他们提高了编程能力。

而课后习题的答案则是帮助学生检验自己的学习成果,确保他们能够正确地理解和应用所学的知识。

在这篇文章中,我们将介绍一些数据结构C语言版耿国华课后习题的答案,以帮助读者更好地理解和掌握数据结构的知识。

1. 数组题目:编写一个程序,实现对一个整型数组的冒泡排序。

答案:```cvoid bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}```2. 链表题目:编写一个程序,实现对一个单链表的反转。

答案:```cstruct ListNode* reverseList(struct ListNode* head) { struct ListNode* prev = NULL;struct ListNode* curr = head;while (curr != NULL) {struct ListNode* nextTemp = curr->next;curr->next = prev;prev = curr;curr = nextTemp;}return prev;}```3. 栈题目:编写一个程序,实现对一个整型数组的栈操作(包括入栈、出栈和获取栈顶元素)。

数据结构C语言描述(耿国华)第4章

第4章 串
第4章 串
4.1 4.2 抽象数据类型串的实现 4.3 串的应用举例:文本编辑
第4章 串
4.1 串的定义
串(String)是零个或多个字符组成的有限序列。 一般记为: S=′a1a2...an′ (n≥0)
其中S是串的名字, 用单引号括起来的字符序列是串的值, ai(1≤i≤n)可以是字母、数字或其它字符。n是串中字符的个数, 称为串的长度,n=0时的串称为空串 (Null String)。
第4章 串
【算法4.3 串复制函数】
(4) StrEmpty(s) /* 若串s为空(即串长为0), 则返回1, 否则返回0 */ SString s; { if (s.len==0) return(1); else return(0); }
第4章 串
【算法4.4 判空函数】
(5) 串比较函数。 StrCompare(s, t) /* 若串s和t相等, 则返回0;若s>t,则返回1;若s<t,则返
第4章 串 (2) StrInsert(S, pos, T) 初始条件: 串S存在, 1≤pos≤StrLength(S)-len+1 操作结果: 在串S的第pos个字符之前插入串T (3) StrDelete(S, pos, len) 初始条件: 串S存在, 1≤pos≤StrLength(S)-len+1 操作结果: 从串S中删除第pos个字符起长度为len (4) StrCopy(S, T) 初始条件: 串S 操作结果: 由串T复制得串S。
(6) StrLength(s)/* 返回串s的长度 */ SString s; { return(s.len); }
第4章 串
【算法4.6 求串长函数】

数据结构答案(耿国华)

数 据 结 构
SubString(sub2,s,7,1)= 空格
StrIndex(s,’A’,4)= 6 StrReplace(s,’STUDENT’,q)= I AM A WORKER
StrCat(StrCat(sub1,t),StrCat(sub2,q)) = I AM A GOOD WORKER
B
C A
先:ABC 中:CBA 后:CBA
A
B C
先:ABC 中:BAC 后:BCA
6
A
先:ABC B 中:ACB 后:CBA
B C
C
先:ABC 中:ABC 后:CBA
第6章 树和二叉树习题
3.已知一棵度为k的树中有n1个度为1的结点,n2个度 为2的结点,…nk个度为k的结点,则该树中有多少个 叶子结点,并证明之。
3)前序和后序相同 空树、只有一个结点的树
9
第6章 树和二叉树习题
数 据 结 构
补充:写出下面二叉树的前序、中序、后序 遍历序列 先序序列: A ABCDEFGHIJ E B 中序序列: G C F BCDAFEHJIG D H I J 后序序列: DCBFJIHGEA
10
第6章 树和二叉树习题
13
解:设n为总结点数,则有
数 据 结 构
(总结点数) n=n0+n1+n2+…nk (总边数) n-1=1*n1+2*n2+…k*nk 两式相减得:1=n0-n2-2n3-…-(k-1)nk n0=1+n2+2n3+…+(k-1)nk =1+∑(i-1)ni
i=1
7
k
第6章 树和二叉树习题
4.假设一棵二叉树的先序序列和中序序列,试画出该二叉树, 并写出后序遍历序列。

数据结构C语言描述耿国华

形式化描述: D要存入机器中,建立一从D的数据元素到存储
空间M单元映象S ,D→M,即对于每一个d, d∈D, 都有唯一的z∈M使S(D)=Z, 同时这个映象必须明 显或隐含地体现关系R。
2020/11/7
19
存储结构
逻辑结构与存储结构的关系为:
存储结构是逻辑关系的映象与元素本身映象,是数 据结构的实现;逻辑结构是数据结构的抽象。
2020/11/7
9
数据类型(Data Type)
高级语言中的数据类型分为两大类:
1.原子类型,其值不可分解。如C语言中的标准类 型(整型、实型、字符型、)。
2.结构类型,其值是由若干成分按某种结构组成的, 因此是可以分解的,并且它的成分可以是非结构的, 也可以是结构的。
指针类型属于哪种类型?
2020/11/7
数据元素之间关系在计算机中的表示方法: ▪顺序映象 (顺序存储结构) ▪非顺序映象(非顺序存储结构)
2020/11/7
20
运算集合
例如工资表:
编 号 姓 名 性别 基本工资 工龄工资 应扣工资 实发工资
100001 张爱芬 100002 李 林
女 345.67 男 445.90
145.45 185.60
图
2020/11/7
17
逻辑结构
综上所述,数据的逻辑结构可概括为:
逻辑结构
线性结构——线性表、栈、队、字符串 数组、广义表
非线性结构——树、图
2020/11/7
18
存储结构
定义: 存储结构(又称物理结构)是逻辑结构在计
算机中存储映象,是逻辑结构在计算机中的实 现,它包括数据元素的表示和关系的表示。
数据项
学 号 姓 名 性 别 籍 贯 出生年月 住 址

数据结构---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、栈有顺序栈和链栈两种存储结构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档