C++版数据结构串的实现与操作
数据结构串串的基本概念串的存储结构与实现串的模式匹配
t.ch[i]=s2.ch[i-s1.length]; }
串删除
void strdelete(Hstring &s,int pos,int len) {
if(pos<1||pos>s.length-len+1||len<0||len>s.length){ cout<<"删除位置不合法"<<endl; return;
int flag=0; int i=0,j=1; if(s1[0]+s2[0]<=MAXSTRLEN) {
for(i=1;i<=s1[0];i++) t[i]=s1[i];
for(i=s1[0]+1;i<=s1[0]+s2[0];i++) t[i]=s2[j++];
t[0]=s1[0]+s2[0]; flag=1; //未截断 }
strempty(s) 初始条件:s为一个串 操作结果:若s为空串,则返回1
strcopy(&t,s) 初始条件:s为一个串 操作结果:把串s复制给t
strncpy(&sub,s,pos,len) 初始条件:s为一个串,pos为起始位置, 1≤pos≤strlength(s)-1,len≥0 操作结果:用sub返回串s的第pos个字符开⑩长度为len的子串
例:模式串t=“abcac”和主串s=“ababcabcaccabbc”匹配过程
第三二一 趟 a b a b c a b c a c c a b b c i=112734568901
《数据结构与算法(C++语言版)》第4章_串
串函数与串的类定义
• 常用的 常用的C++串函数 串函数 • C++的串库(string.h)中提供了许多字符串的操作函数,几 个常用的C++字符串函数及其使用方法如下。 •假设已有以下定义语句:
串函数与串的类定义
• (1)串拷贝函数 • char *strcpy(char *s1, const char *s2),将字符串s2复制到字 符串数组s1中,返回s1的值。 • char *strncpy(char *s1, const char *s2, size_tn)将字符串s2中最 多n个字符复制到字符串数组s1中,返回s1的值。 • 例如:
串函数与串的类定义
• (3)串比较函数 • int strcmp(const char *s1, const char *s2),比较字符串s1和字 符串s2。函数在s1等于、小于或大于s2时,分别返回0、小 于0或者大于0的值。 • int strncmp(const char *s1, const char *s2, size_tn)比较字符串 s1中的n个字符和字符串s2。函数在s1等于、小于或大于s2 时,分别返回0、小于0或者大于0的值。 • 例如:
串模式匹配
• 无回溯的匹配算法 • 在上面介绍的匹配算法中,某趟匹配失败时,下一趟的匹 配相当于将子串P后移1位再从头与主串中对应字符进行比 较,即相当于i指示器回溯到上趟(最近失败的一趟)匹配 的起点的下一个位置,这样,主串中每个字符都要与子串 中的第1个字符对应一次,再向后比较。因此,主串中每个 字符参加比较的次数最多可达n次(n为子串长度),因此 时间复杂度为O(nm)。那么,能否使目标串中每个字符只参 加一次比较呢?也就是说,能否不回溯i指示器?回答是肯 定的。这个问题是由D.E.Knoth与V.R.Pratt和J.H.Morris同时 解决的,所以有的文献也称这种思想的串匹配算法为KMP 算法。
数据结构(C语言版)_第3章 串与数组
char data; struct lnode *next;
}lstring;
3.3.3 串的存储结构——链式存储结构
当结点大小>1时,可以采用块链结构。
#define CHUNKSIZE 100
/*可由用户定义块的大小*/
typedef struct Chunk
第三章 串与数组
本章要点
➢字符串的基本概念与基本运算 ➢字符串的存储和基本运算的实现 ➢数组的概念和基本运算 ➢数组的存储结构 ➢特殊矩阵的压缩存储及运算 ➢广义表的概念及相关术语 ➢广义表的存储形式
3.1 “文学研究助手”案例导入
“文学研究助手”引例:请从下面的英文文章里,统计其中 good出现的次数和位置,并查找单词the所在的行号,该行中出 现的次数以及在该行中的相应位置。
3.4.1 数组的定义
数组是n个具有相同类型的数据元素构成的有限序列,数组 中的数据是按顺序存储在一块地址连续的存储单元中。
数组中的每一个数据通常称为数组元素,数组元素用下标 区分,其中下标的个数由数组的维数决定。
若线性表中的数据元素为非结构的简单元素,则称为一维 数组,又称为向量;若一维数组中的数据元素又是一维数组结 构,则称为二维数组;依次类推,若二维数组中的元素又是一 个一维数组结构,则称作三维数组。
3.3.4 串的基本操作的实现算法
第二种顺序存储方式下几种基本操作的算法
算法1:串连接操作 算法2:串比较操作 算法3:取子串操作 算法4:串插入操作 算法5:串删除操作 算法6:串置换函数 算法7:子串定位操作
3.3.5 串的应用
【例3-1】设计一个算法求串s中出现的第1个最长重复子串 及其位置。
数据结构第4章 串
/*若串s和t相等则返回0;若s>t则返回正数;若s<t则返 回负数*/
{ int i;
for (i=0;i<s.len&&i<t.len;i++)
if (s.ch[i]!=t.ch[i]) return(s.ch[i] - t.ch[i]);
初 始 条 件 : 串 S 存 在 ,1≤pos≤StrLength(S) 且 1≤len≤StrLength(S)-pos+1
操作结果:用Sub返回串S的第pos个字符起长度为len的子串
返回主目录
(11)StrIndex(S,T,pos)
初始条件: 串S和T存在,T是非空串, 1≤pos≤StrLength(S)
return(s.len); }
返回主目录
(7)清空函数
StrClear(SString *s) /*将串s置为空串*/ {
s->len=0; }
返回主目录
(8)连接函数
(1) 连接后串长≤MAXLEN,则直接将B加在A的 后面。 (2) 连接后串长>MAXLEN且LA<MAXLEN,则B 会有部分字符被舍弃。 (3) 连接后串长>MAXLEN且LA=MAXLEN,则B 的全部字符被舍弃(不需连接)。
for (i=s->len + t.len-1;i>=t.len + pos;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++) s->ch[i+pos]=t.ch[i];
s->len=s->len+t.len;
数据结构(C语言版)
比较
Prim算法适用于稠密图, Kruskal算法适用于稀疏图;
两者时间复杂度相近,但 Kruskal算法需额外处理并查
集数据结构。
最短路径算法设计思想及实现方法比较
1 2
Dijkstra算法
从源点出发,每次找到距离源点最近的顶点并更 新距离值,直至所有顶点距离确定。适用于不含 负权边的图。
Floyd算法
特殊二叉树
满二叉树、完全二叉树等。
二叉树的遍历与线索化
二叉树的遍历
前序遍历、中序遍历、后序遍历和层 次遍历是二叉树的四种基本遍历方法 。
线索化二叉树
为了方便查找二叉树节点的前驱和后 继,可以对二叉树进行线索化处理, 即在节点的空指针域中存放指向前驱 或后继的指针。
树和森林的遍历与转换
树的遍历
01
串的顺序存储结构
01
02
03
串的顺序存储结构是用 一组地址连续的存储单 元来存储串中的字符序
列的。
按照预定义的大小,为 每个定义的串变量分配 一个固定长度的存储区 ,一般是用定长数组来
定义。
串值的存储:将实际串 长度值保存在数组的0下 标位置,串的字符序列 依次存放在从1开始的数
组元素中。
串的链式存储结构
03
比较
DFS空间复杂度较低,适用于递 归实现;BFS可找到最短路径, 适用于非递归实现。
最小生成树算法设计思想及实现方法比较
Prim算法
从某一顶点开始,每次选择当 前生成树与外界最近的边加入 生成树中,直至所有顶点加入
。
Kruskal算法
按边权值从小到大排序,依次 选择边加入生成树中,保证不
形成环路。
数据结构(C语言版)
数据结构(C语言版CHAP4
结束
第 6 页
4. 1
串的基本概念
3 串的基本操作 串的逻辑结构与线性表一样,都是线性结构。但由于串的应用与线性 表不同,串的基本操作与线性表有很大差别。
1)串赋值操作StrAssign( &T, chars) 功能:将串常量char的值赋给串变量T; 2)复制串操作 StrCopy(&T,S) 功能:由串变量S复制得到串变量T; 3)判空操作 StrEmpty(S) 功能:若为空串,则返回TRUE,否则返回FALSE 4) 串比较操作 StrCompare( S, T) 功能若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值 <0 5)串置空操作 ClearString( &S) 功能:将S清为空串 结束 第 7 页
结束
第 2 页
第四章
串
第四章
串
4.1 4.2 4.3
串的基本概念 串存储和实现 串的匹配算法
结束
第 3 页
4. 1
串的基本概念
一、串的定义 1 什么是串 串是一种特殊的线性表,它是由零个或多个字符组成的有限序列, 一般记作 s = ‘a1,a2, a3, ... an’ 其中 s----串名, a1,a2, a3, ... an----串值 串的应用非常广泛,许多高级语言中都把串的作为基本数据类型。在 事务处理程序中,顾客的姓名、地址货物的名称、产地可作为字符串处 理,文本文件中的每一行字符等也可作为字符串处理。
11)串删除操作 StrDelete( &S, pos , len) 功能:从串S中删除第pos个字符起长度len 为子串
结束
第 8 页
4.2
串存储和实现
《数据结构(C语言版)》教案
《数据结构(C语言版)》教案《数据结构(C语言版)》教案2020 至2020 学年第一学期教案课程名称数据结构使用教材《数据结构(C语言版)》教学时数56课程性质必修任课班级(人数)信管(53人)信息系(部)信管教研室任课教师山东科技大学泰山科技学院课时授课计划2020-2020学年第二学期第1周授课日期2月20 日星期1 月日星期月日星期月日星期月日星期班级信管10-1 基本课题第1章绪论 1.1-1.2 教学目的与要求:1. 了解数据结构的基本概念2. 理解常用术语教学重点:数据结构的基本概念和术语教学难点:数据元素之间的四种结构关系作业及参考书:1、什么是数据结构?《数据结构算法实现及解析》/高一凡编著教具:多媒体板书课堂类型:讲授教学过程:自我介绍——开课——引入——展开——举例——小结——作业一、自我介绍和课程介绍约8min 课时:64 二、引入约2min 由问题的提出引入三、讲课进程设计1.1 什么是数据结构 1.1.1、数据结构与其它的关系约15min 数据结构+算法=程序程序设计: 为计算机处理问题编制一组指令集算法: 处理问题的策略数据结构: 问题的数学模型 1.1.2、当今计算机应用的特点:约25min l) 所处理的数据量大且具有一定的关系;2) 对其操作不再是单纯的数值计算,而更多地是需要对其进行组织、管理和检索。
举例说明:1) 学生成绩表2)井安棋对弈3)交通管理结论计算机的操作对象的关系更加复杂,操作形式不再是单纯的数值计算,而更多地是对这些具有一定关系的数据进行组织管理;我们将此称为非数值性处理。
要使计算机能够更有效地进行这些非数值性处理,就必须弄清楚这些操作对象的特点,在计算机中的表示方式以及各个操作的具体实现手段。
1.2 基本概念和术语1.1.1、数据与数据结构约20min 数据:是对客观事物的符号表示。
所有能被输入到计算机中,且能被计算机处理的符号的集合。
是计算机操作的对象的总称。
数据结构 串结构
• 定长顺序存储表示
顺序 存储 ——用一组地址连续的存储单元存储串值的字 符序列。
• 堆分配存储表示
——用一组地址连续的存储单元存储串值的字 符序列,但存储空间是在程序执行过程中动态 分配而得。
链式 • 串的块链存储表示 存储
——链式方式存储
1.定长顺序存储特点:
用一组连续的存储单元来存放串,直接使用定长的字符数 组来定义,数组的上界预先给出,故称为静态存储分配。 例如: #define Maxstrlen 255 //用户可用的最大串长 typedef unsigned char SString[ Maxstrlen+1 ]; SString s; //s是一个可容纳255个字符的顺序串。
…… Index(S, T, pos) Replace(&S, T,V)
// 返回子串T在pos之后的位置 // 用子串V替换子串T
}ADT Sting
练习: 设 s =‘I AM A STUDENT‘, t =‘GOOD‘,
q=‘WORKER‘。求:
StrLength(s) = StrLength(t) = SubString(s, 8, 7)= SubString(t, 2, 1)= Index(s, ‗A‘)= Index(s, t)= 14 4 ‗STUDENT‘ ‗O‘ 3 0 ( s中没有t!)
if (!(S.ch=(char*)realloc(S.ch, (S.length+T.length)*sizeof(char)) )) exit(OVERFLOW); for ( i=S.length-1; i>=pos-1; --i ) //为插入T而腾出pos之后的位置
S.ch[i+T.length] = S.ch[i];
串基本操作的编程实现
串基本操作的编程实现串(String)是一种数据结构,用于存储和操作字符序列。
在编程中,我们经常需要处理文本数据,比如字符串的搜索、替换、拼接等操作。
本文将以串基本操作为主题,分步解析在编程中如何实现这些操作。
1. 串的定义与表示在开始之前,我们首先需要了解串的定义与表示。
串是由零个或多个字符组成的有限序列。
可以使用字符数组或链表来表示一个串,这里我们以使用字符数组实现为例。
c#define MAX_SIZE 100typedef struct {char data[MAX_SIZE]; 用字符数组存储串的字符序列int length; 串的当前长度} String;2. 串的赋值与初始化在使用一个串之前,需要先进行初始化或者赋值操作。
初始化是指将字符串初始化为空串,而赋值是指将一个字符串赋值给另一个字符串。
下面是它们的具体实现。
c初始化串为空串void initString(String* s) {s->length = 0; 将串的长度初始化为0}将字符串t赋值给字符串svoid assignString(String* s, const char* t) {int i = 0;while (t[i] != '\0' && i < MAX_SIZE) {s->data[i] = t[i];i++;}s->length = i;}3. 串的拼接拼接是指将两个串连接在一起,形成一个新的串。
下面是串的拼接操作的实现。
c将字符串s2拼接到字符串s1的末尾void concatString(String* s1, const String* s2) {int i, j;for (i = s1->length, j = 0; j < s2->length && i < MAX_SIZE - 1; i++, j++) {s1->data[i] = s2->data[j];}s1->length = i;s1->data[i] = '\0'; 在拼接串的末尾添加结束符}4. 串的比较比较是指判断两个串是否相等。
数据结构C语言版 抽象数据类型Polynomial一元多项式的实现文库
/*数据结构C语言版抽象数据类型Polynomial一元多项式的实现P42-43编译环境:Dev-C++ 4.9.9.2日期:2011年2月10日*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>// 抽象数据类型Polynomial一元多项式的实现typedef struct // 项的表示,多项式的项作为LinkList的数据元素{float coef; // 系数int expn; // 指数}term, ElemType;// 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名typedef struct LNode // 结点类型{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct _LinkList // 链表类型{Link head,tail; // 分别指向线性链表中的头结点和最后一个结点int len; // 指示当前线性链表中数据元素的个数}LinkList;typedef LinkList polynomial;#define DestroyPolyn DestroyList#define PolynLength ListLength// 已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置// 若无前驱,则返回NULLPosition PriorPos(LinkList L,Link p){Link q;q=L.head->next;if(q==p) // 无前驱return NULL;else{while(q->next!=p) // q不是p的直接前驱q=q->next;return q;}}// 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中// 第一个值为e的结点的位置,并返回1;否则q指示第一个与e满足判定函数// compare()取值>0的元素的前驱的位置。
数据结构c语言版 (4)
8. 在具有n个单元的循环队列中,队满时共有 ____个元素。 9. 一个栈的输入序列是12345,则栈的输出序 列43512是____。 10.二维数组A[10..20][5..10]采用行序为主方式 存储,每个元素占4个存储单元,并且 A[10][5]的存储地址是1000,则A[18][9]的地 址是____。 四、设有一个顺序栈S,元素s1, s2, s3, s4 , s5, s6依次进栈,如果6个元素的出栈顺 序为s2, s3, s4, s6, s5, s1,则顺序栈 的容量至少应为多少?
子串的位置:子串在主串中第一次出现的第一个字 符的位置。 两个串相等:两个串的长度相等,并且各个对应的 字符也都相同。 a= “program” b= “Program” c= “pro” d= “program ”
串的基本操作:
(1) 创建串 StringAssign (s,string_constant)
a0 0 a0 1 ... a0 ,n 1
a1 0
a1 1
...
a1 ,n 1
...
...
a m1 ,0
a m1 ,1
...
a m-1 , n 1
第0行
a0 0 a1 0 ... a m1 ,0
第1行
a0 1 a1 1 ... a m-1 ,1 ... ... a 0 ,n -1
第m-1行
a 1 ,n -1 ... a m1 ,n -1
矩阵的压缩存储
为多个值相同的元素只分配一个存储空间,对0元 素不分配空间。
1.对称矩阵
aij=aji
K=
{
矩阵的压缩存储
2. 三角矩阵 b. 上三角矩阵
K=
{
用C语言结构体类型指针实现数据结构链表操作
一
{ 成员表列 } 变量名表列 ; 方法3 : 直接定义结构体类型变量 。 般形 式 : s t r u c t { 成 员表列 ; } 变量名表 列 ; ( 3 ) 结构体类 型变量 的引用 在定义 了结构体类型变量之后 , 不可 以对其整体进行 引用 , 而 只能对结构体变量 中的各个成员分 别进行 引用 。 引用 的方 式为 : 结 构体变量名 . 成员名 , 其 中“ . ” 是成员运算符 , 它在所有 的运算符 中 优先级最高 。 例如: s t u d e n t 1 . h u m表 示 s t u d e n t 1 变 量 中的 n u m成 员 ,  ̄s t u - d e n t l 的n u m( 学号) 项, 可 以对成员项进行运算和输入输出等引用。
④
设 计 开发
用 C语言结构体类型指针实现数据结构链表操作
王 敬
f 天津市红桥 区职工大学 天津 3 0 0 1 3 1 )
摘要: 本 文介绍 了结构 体 类型 的基 本原 理及 定 义方法 , 利 用结构体 类型 变量作 为链表 中的数据 项 比较 符合 实际应 用 中的需要 。 因此 , 文章 分别 介 绍 了定 义结构 体 指针 的方 法和建 立 结构体 类 型结 点的 单 向链表 的具 体描 述 。 关键词 : 结构体 链 表 指针 中图分 类号 : T P 3 1 2 文献 标识 码: A 文章 编号 : 1 0 0 7 — 9 4 1 6 ( 2 0 1 3 ) 0 4 — 0 1 6 5 — 0 2
1 结构体类型
1 . 1概 述
在学 习了C 语言基本类型数据之后 , 在处理一些 实际问题的时 候, 往往需要将多种基本类型数据组合成一个有机整体 , 以便一起 引用 , 整体 中的数据相互联系 , 形成一组有特殊 含义 的数据 , 这样 的 个 组合 项被 称为结构体。 例如 : 一个学生信息就可 以看成一个结 构体 , 学生信息包括学号、 姓名、 性别、 年龄、 成绩 、 籍贯等 内容 , 每一 项内容又是一个基 本类型变量 , 可 以分别定义为学号 ( 整型) , 姓名 ( 字符串) 、 性别( 字符型) 、 年龄( 整型) 、 成绩( 单精度实型) 、 籍贯 ( 字符 串) 。 将这些有特殊含义的变量放在一个结构体中 , 相当于高级语言 中的“ 记录” 。 数据结 构链表 中的每 一个数据 项不一定都是单一数 据, 大多数情 况下都是一个组合项做为一个数据项 , 这时就需要用 到结构体做数 据项 。 1 . 2结 构 体 类 型 变 量 定 义 ( 1 ) 声明结构体类 型的一般 形式 : s t r u c t 结构体名 2结构体类型数据的指针 { 成 员表列 } ; 2 . 1定 义指 向 结构体 变量 的指 针 其 中, “ 结构体名” 用作结构体类型的标志 , “ 成 员表 列” 是该结 首 先声 明一 个 结 构 体 类型 s t r u c t s t u d e n t , 然 后 定 义一 个 s t r u c t 构体 中的成员表列 , 由它们组成一个结构体 。 例如 : 建立一个学员信 S t u d e n t 类型 的变量s t u d e n t 1 和指针P , 指针P 指向s t u d nt e 1 的首地址 , 息的结构 体 , 如下所示 。 如 下所 示 。 s t r u c t s t u d e n t ma i n () {i n t n u m; , 号≈ , {s t r u c t s t u d e n t c h a r n a me [ 2 0 】 ; / 姓名 / {i n t n u m; / 学号} / h a c r S e X; / { 性别} / ha c r n a me [ 2 0 】 ;/ } 姓 名 / i nt a ge; , 辱 , c h a r s e x ; / 性 别} / lo f a t s c o r e ; / } 成绩} / i n t a g e , 年 , c h a r a d d r [ 2 0 ] ; / 籍贯 / l f o a t s c o r e ; / } 成绩} / } ; c h a r a d d r [ 2 0 ] ;/ } 籍 贯 / ( 2 ) 定义结 构体类型变量的方法 } ; 方法 1 : 先声 明结构 体类型再定义变量名 。 s t r u c t s t u d e n t s t u d e n t 1 ; / 定义结构体类型变量s t u —
数据结构C语言版_栈的顺序存储表示和实现
return 1;
}
int main()
{
int j;
SqStack s;
SElemType e;
// 创建一个顺序栈。
if(InitStack(&s) == 1)
printf("顺序栈创建成功!\n");
// 查看栈的长度。
}
// 插入元素e为新的栈顶元素。
int Push(SqStack *S, SElemType e)
{
if((*S).top - (*S).base >= (*S).stacksize) // 栈满,追加存储空间
{
(*S).base = (SElemType *)realloc((*S).base,
{
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack; // 顺序栈
// 构造一个空栈S。
int InitStack(SqStack *S)
system("pause");
return 0;
}
/*
输出效果:
顺序栈创建成功!
栈的长度是0
栈空否:1(1:空 0:否)
栈中元素依次为:1 2 3 4 5 6 7 8 9 10 11 12
弹出的栈顶元素 e=12
栈空否:0(1:空 0:否)
栈顶元素 e=11 栈的长度为11
数据结构(C语言版)(第2版)课后习题答案
数据结构(C语言版)(第2版)课后习题答案数据结构(C语言版)(第2版)课后习题答案1. 简介数据结构是计算机科学领域中非常重要的一门学科,它研究的是数据的组织、存储和管理方式。
本文将针对《数据结构(C语言版)(第2版)》的课后习题提供答案,帮助读者更好地理解和应用数据结构。
2. 第一章: 绪论在第一章中,主要介绍了数据结构的基本概念、分类和基本操作。
以下是部分习题的答案:2.1 习题1习题描述:什么是数据结构?答案:数据结构是指数据对象中元素之间的关系,以及对这些关系进行操作的方法和技术的集合。
2.2 习题2习题描述:数据结构的分类有哪些?答案:数据结构可以分为线性结构和非线性结构。
线性结构包括线性表、栈、队列等;非线性结构包括树、图等。
3. 第二章: 线性表第二章介绍了线性表的定义、分类和实现。
以下是部分习题的答案:3.1 习题1习题描述:什么是线性表?答案:线性表是由n个数据元素a1, a2, ..., an组成的有限序列,其中元素之间存在着一一对应的关系。
3.2 习题2习题描述:线性表的分类有哪些?答案:线性表可以分为顺序表和链表。
顺序表是用一段地址连续的存储单元一次存储线性表的所有元素,而链表是采用链式存储结构,通过每个元素存储其后继元素的地址来实现元素之间的逻辑关系。
4. 第三章: 栈与队列第三章讲解了栈和队列的定义、特性和实现。
以下是部分习题的答案:4.1 习题1习题描述:栈和队列有什么区别?答案:栈是一种后进先出的线性表,只能在表尾进行插入和删除操作;队列是一种先进先出的线性表,只能在表的一端进行插入和删除操作。
4.2 习题2习题描述:栈的应用有哪些?答案:栈在计算机科学中有广泛的应用,如函数的调用和返回、括号匹配、表达式求值等。
5. 第四章: 串第四章讲解了串的定义、模式匹配和实现。
以下是部分习题的答案:5.1 习题1习题描述:什么是串?答案:串是由零个或多个字符组成的有限序列,串中的字符个数称为串的长度。
数据结构(C语言版)(第4版)习题
习题11.1选择题。
(1)计算机识别、存储和加工处理的对象统称为。
A.数据B.数据元素C.数据结构D.数据类型(2)数据结构通常是研究数据的及它们之间的联系。
A.存储和逻辑结构B.存储和抽象C.理想和抽象D.理想和逻辑(3)下列不是数据的逻辑结构的是。
A.散列结构 B.线性结构 C.树形结构 D.图状结构(4)数据结构被形式地定义<D,R>,其中D是的有限集,R是___的有限集。
A.算法 B.数据元素C.数据操作 D.逻辑结构(5)组成数据的基本单位是。
A.数据项 B.数据类型 C.数据元素 D.数据变量(6)设数据结构A=(D,R),其中,D={1,2,3,4},R={r},r={<1,2>,<2,3 >,<3,4>,<4,1>},则数据结构A是。
A.线性结构 B.树形结构 C.图状结构 D.集合(7)数据在计算机存储器中表示时,若物理地址与逻辑地址相同并且是连续的,则称为。
A.存储结构B.逻辑结构C.顺序存储结构D.链式存储结构(8)在数据结构的讨论中把数据结构从逻辑上分。
A.内部结构与外部结构B.静态结构与动态结构B.线性结构与非线性结构 D.紧凑结构与非紧凑结构(9)对于一个算法的评价,不包括以下方面的内容。
A.健壮性和可读性B.并行性C.正确性D.时间空间复杂度(10)算法分析的两个方面是。
A.空间复杂性和时间复杂性B.正确性和简明性C.可读性和文档性 D.数据复杂性和程序复杂性1.2填空题(1)数据结构是一门研究非数值计算的程序设计问题中计算机的以及它们之间的和运算等的学科。
(2)数据结构包括数据的结构和结构。
(3)数据结构从逻辑上划分为3种基本类型,即、和。
(4)数据的物理结构被分为、、和种类型。
(5)一种抽象数据结构类型包括和两个部分。
(6)数据的逻辑结构是指数据的存储结构是指(7)数据结构是指指数数据及其相互之间的当结点之间存在M对N(M:N)的联系时,称这种结构为当结点之间存在1对N(1:N)的联系时,称这种结构为(8)对算法从时间和空间两个方面进行衡量,分别称为分析。
数据结构(CC++语言版)第4章串
•
else return -1;
•}
34
4.3 模式匹配
35
4.3 模式匹配
朴素的模式匹配——BF算法分析
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经 部分匹配的结果。
如何在匹配不成功时主串不回溯?
主串不回溯,模式就需要向右滑动一段距离。
如何确定模式的滑动距离?
36
4.3 模式匹配
T[strLength(S1) +i]=S2[i]; strLength(T) =MAXSTRLEN; return FALSE; } }
CompStr (S, T)
初始条件:串 S 和 T 存在。 操作结果:若S T,则返回值 0;
若S T,则返回值 0; 若S T,则返回值 0
例如:CompStr(data, state) < 0 CompStr(capture, case) > 0
• 由于在计算机科学、生物信息学等许多领域的重要应用, 串模式匹配已经变成了一个非常重要的计算问题
28
4.3 模式匹配
常用的模式匹配算法: • 朴素的模式匹配(BF算法) • 无回溯的模式匹配(KMP算法) 其他模式匹配算法
29
4.3 模式匹配
朴素的模式匹配——BF算法
基本思想:从主串S的第一个字符开始和模式T 的第 一个字符进行比较,若相等,则继续比较两者的后 续字符;否则,从主串S的第二个字符开始和模式T 的第一个字符进行比较,重复上述过程,直到T 中的 字符全部比较完毕,则说明本趟匹配成功;或S中字 符全部比较完,则说明匹配失败。
S1="ab12 cd " S2="ab12" S3=“cd"
数据结构(C语言版)第4-5章习题答案
第4~5章串和数组自测卷答案一、填空题(每空1分,共20分)1. 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。
(对应严题集4.1①,简答题:简述空串和空格串的区别)2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为3。
4. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。
5. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。
6. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m。
7. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288 B ;末尾元素A57的第一个字节地址为1282 ;若按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;若按列存储时,元素A47的第一个字节地址为(6×7+4)×6+1000)=1276 。
(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)8. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950 。
答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89509. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdlib.h"
#include "stdio.h"
#include "iostream.h"
#define STRINGMAX 80
struct string
{int len;
char ch[STRINGMAX]; //和char *ch 作用是一样的
};
typedef struct string STRING;
#define LEN STRINGMAX*sizeof(STRING)/* 串的定义*/
void create(STRING *s);
void print(STRING *s);
int concat(STRING *s,STRING *t);
STRING *substr(STRING *s,int start,int len);
void Delete(STRING *s,int start,int len);
void main()
{STRING *s,*t,*v; /*定义三个采用静态存储形式的串*/ t=(STRING *)malloc(LEN); /*为三个串分配相应的存储空间*/ s=(STRING *)malloc(LEN);
v=(STRING *)malloc(LEN);
int start,len;
// int position;
cout<<"请输入串s:"<<endl; /*创建S串*/
create(s);
cout<<"请输入串t:"<<endl; /*创建T串*/
create(t);
concat(s,t); /* 连接并输出相应的串*/
cout<<"将串t联接串s后,新串s为:"<<endl;
print(s);
cout<<"求子串。
\n输入截取子串的起始位置:";
cin>>start;
cout<<"\n输入子串的长度:";
cin>>len;
v=substr(s,start,len); /*求子串*/
cout<<"\n子串为:"<<v->ch<<endl;
cout<<"输入删除串的起始位置:"; /* 输入删除串的起始位置*/ cin>>start;
cout<<"\n输入删除串的长度:"; /* 输入删除串的长度*/ cin>>len;
Delete(s,start,len); /*删除串*/
cout<<"\n删除子串后,串s为:"<<endl;
print(s);
}
void create(STRING *s)
{
char c;
int i;
for (i=0;((c=getchar())!='\n'&&i<80);i++)
s->ch[i]=c; /*将输入的字符序列放入串的字符数组中*/ s->len=i; /*置串的长度*/
s->ch[i]= '\0 ';
}
void Delete(STRING *s,int start,int len) //从start位置开始删除len长的子串
{
int i;
if (start<=s->len&&len>=0&&start+len<=s->len)/*删除操作合法性验证*/
{for(i=start+len;i<=s->len;i++) /*从start位置开始移动元素*/
s->ch[i-len]=s->ch[i];
s->len=s->len-len; /*置新的长度*/
}
else
cout<<"cannot delete!\n";
}
STRING *substr(STRING *s,int start,int len) //取子串,从start位置开始取len长的子串{int i;
STRING *t;
t=(STRING *)malloc(LEN);
if (start<0&&start>=s->len) /*取子串的合法性验证*/
return(NULL);
else
if (len>=1&&len<=s->len-start)
{ for(i=0;i<len;i++) /*取字符序列入到子串的字符数组中*/
t->ch[i]=s->ch[start+i];
t->len=len; /*置子串长度*/
t->ch[i]='\0';
return(t);
}
else
return(NULL);
}
int concat(STRING *s,STRING *t)
{
if(s->len+t->len>STRINGMAX)
if(!(s=((STRING *)realloc(s,(s->len+t->len)*sizeof(char))))) return 0; int i,j;
j=s->len;
for (i=0;i<t->len;i++)
s->ch[i+j]=t->ch[i]; /*将串t中字符序列放入串s的尾部*/
s->ch[i+j]= '\0 ';
s->len=s->len+t->len; /*置新串s的长度*/
return 1;
}
void print(STRING *s) /*输出串的字符序列*/
{int i;
for (i=0;s->ch[i]!= '\0 ';i++)
cout<<s->ch[i];
cout<<endl;
}。