第四章串数组和广义表
【C语言版】4第四章串,数组,广义表
且 T 是非空串。
操作结果:用V替换主串S中出现 的所有与(模式串)T 相等的不重叠的子串。
例如:
假设 S = abcaabcaaabca,T = bca
基 本 操 作
若 V = x, 则经置换后得到 S = axaxaax
若 V = bc, 则经置换后得到 S = abcabcaabc
DestroyString (&S)
基 本 操 作
初始条件:串 S 存在。 操作结果:串 S 被销毁。
StrEmpty(S)
基 本 操 作
初始条件:串S存在。
操作结果:若 S 为空串,则返回TRUE, 否则返回 FALSE。
表示空串,空串的长度为零。
StrCompare(S,T)
基 本 操 作
StrDelete (&S, pos, len)
基 本 操 作
初始条件:串S存在
1≤pos≤StrLength(S)-len+1。
操作结果:从串S中删除第pos个字符 起长度为len的子串。
ClearString
基 本 操 作
(&S)
初始条件:串S存在。 操作结果:将S清为空串。
对于串的基本操作集可以有不同的定义 方法,在使用高级程序设计语言中的串类型 时,应以该语言的参考手册为准。
串的逻辑结构和线性表极为相似,区别 仅在于串的数据对象约束为字符集。
基 本 操 作
串的基本操作和线性表有很大差别。
在线性表的基本操作中,大多以“单个元 素”作为操作对象; 在串的基本操作中,通常以“串的整体” 作为操作对象。
4.1.2 串的表示和实现
串 在程序设计语言中,串只是作为 的 表 示 输入或输出的常量出现,则只需存储 和 实 此串的串值,即字符序列即可。但在 现
第4章 串2—第5章 数组和广义表
串的基本操作示例:
5
C 语言字符串函数库中提供下列串处理函数: 语言字符串函数库中提供下列串处理函数: 头文件: 头文件:# include <string.h> gets(str) puts(str) strcat(str1, str2) strcpy(str1, str2, k) strcmp(str1, str2) strlen(str) // 输入一个串; 输入一个串; // 输出一个串; 输出一个串; // 串联接函数; 串联接函数; // 串复制函数; 串复制函数; // 串比较函数; 串比较函数; // 求串长函数; 求串长函数;
记为: =‘a 记为:s = a1a2…an’ a 串名 串值
(用‘ ’ 括 起来) 起来)
(n≥0 )
C++中隐含结 C++中隐含结 束符‘ 束符‘\0’ , ASCII码 即ASCII码 NUL
2
串与线性表
串的逻辑结构和线性表极为相似,区别仅在于串 逻辑结构和线性表极为相似,区别仅在于串 极为相似 仅在于 数据对象约束为字符集。 约束为字符集 的数据对象约束为字符集。 串的基本操作和线性表有很大差别。 串的基本操作和线性表有很大差别。 基本操作和线性表有很大差别 线性表的基本操作中 大多以“单个元素” 的基本操作中, 在线性表的基本操作中,大多以“单个元素” 作为操作对象; 作为操作对象; 操作对象 的基本操作中,通常以“串的整体” 在串的基本操作中,通常以“串的整体”作为 操作对象。 操作对象。
20
二维数组的定义: 二维数组的定义: 数据对象: 数据对象 D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: 数据关系 R = { ROW, COL } ROW={<ai,j,ai,j+1>|0≤i≤b1-1, 0≤j≤b2-2} COL={<ai,j,ai+1,j>|0≤i≤b1-2, 0≤j≤b2-1}
第4章数组与串第4节广义表
// 为原子时输出元素值
if (p->tag==1) cout << ")";
// 为表结点时输出')&)
{ cout << ",";
GLDisp (p->link);
// 递归输出后续表的内容
}
}
}
第4章 数组与串 第4节 广义表
3. 求广义表的长度 所谓广义表的长度是指在广义表中元素个
//p指向广义表的第一个元素
while (p!=NULL)
{ n++;
p=p->link;
}
return n;
}
第4章 数组与串 第4节 广义表
4.广义表的复制 复制一个广义表的算法思想:对于一个广义
表的头结点*p,若为空,则返回空指针;若为子 表,则递归复制子表;否则复制原子结点,然后 递归复制后续表。算法结束返回广义表链表指针。
用字符串变量 s 来表示一个广义表的括号表 达式,从头到尾扫描 s 的每一个符号:
(1)当遇到是左括号,说明是一个表的开始, 则建立一个由 h 指向的表的结点,并用它的dlink 域作为子表的表头指针,进行递归调用;
第4章 数组与串 第4节 广义表
(2)当扫描到一个字母,说明它是一个原子, 则建立一个由h指向的原子结点;
数,由于广义表在同一层次的每个结点是通过 link域链接起来的,所以可把它看做是由link域链 接起来的单链表。这样,求广义表的长度就变成 求单链表的长度了。
第4章 数组与串 第4节 广义表
int GLLength(GLNode *p)
//p为广义表附加头结点的指针
{
int n=0;
《数据结构(C语言)》第4章 串、数组和广义表
串的存储与操作
❖ 串的顺序存储与操作 ❖ 1.串的基本操作
(3) 求串长StrLength(s) 返回串s中字符的个数。 算法4.3 求串长度 int StrLength(char s[]) { int len=0;
while(s[len++]!='\0'); return --len; }
4.2(b)所示。当节点大小大于1时,由于串长不一定
是节点大小的整倍数,因此链表中的最后一个节点不
一定全被串值占满,此时通常要补上“#”或其他的
非串值字符(通常,“#”不属于串的字符集,是一个
特殊的符号)。 头指针
S
D
A
E
头指针
S
DATA
STR
UCTU
RE# #
空格符
Data structures
串的存储与操作
charch[CHUNKSIZE];
structChunk *next;
}Chunk;
typedef struct { /*串的链表结构*/
Chunk *head, *tail;/*串的头和尾指针*/
int curlen; /*串的当前长度*/
}LString;
Data structures
串的存储与操作
串(或字符串),是由零个或多个字符组成的有限序列。一般 记为:
s=‘a0a1...an-1’ (n>=0)
其中s是串的名,用单引号括起来的字符序列是串的值;串中字 符的数目n称为串的长度。
❖ 2.空串和空格串
零个字符的串称为空串,它的长度为零。
由一个或多个空格组成的串,称为空格串。它的长度是串中空格字符 的个数。
第4章-串、数组和广义表
(13) DestroyString(&S)
//串销毁
}ADT String 北京林业大学信息学院
2021年1月9日
6
串的存储结构
顺序存储 链式存储
2021年1月9日
7
顺序存储表示
typedef struct{ char *ch;
int length; }HString;
//若串非空,则按串长分配存储区, //否则ch为NULL //串长度
S :ababcabcacbab
•
T :abc j
i指针回溯
S :ababcabcacbab
T : abc
S :ababcabcacbab
T : abc
2021年1月9日
13
BF算法设计思想
Index(S,T,pos)
• 将主串的第pos个字符和模式的第一个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符起,重新与模式的第 一个字符比较。
//串的当前长度
}LString;
2021年1月9日
11
串的模式匹配算法
算法目的:
确定主串中所含子串第一次出现的位置(定位) 即如何实现教材P72 Index(S,T,pos)函数
算法种类:
•BF算法(又称古典的、经典的、朴素的、穷举的) •KMP算法(特点:速度快)
2021年1月9日
12
i
BF算法设计思想
(6) StrCopy(&T,S)
//串拷贝
(7) StrEmpty(S)
//串判空
(8) ClearString (&S)
//清空串
(9) Index(S,T,pos)
数据结构-串、数组和广义表课件
BF算法描述(算法4.1)
int Index(Sstring S,Sstring T,int pos){ i=pos; j=1; while (i<=S[ 0 ] && j <=T[ 0 ]){ if ( S[ i ]=T[ j ]) { ++i; ++j; } else{ i=i-j+2; j=1; } if ( j>T[ 0 ]) return i-T[0]; else return 0;
KMP算法设计思想(了解)
利用已经部分匹配的结果而加快模式串的滑动速度? 且主串S的指针i不必回溯!可提速到O(n+m)!
i
S=‘a b a b c a b c a c b a b’
T=‘a b c a c’
ii
i
k
S=‘a b a b c a b c a c b a b’
T=‘a b c a c’
//串拷贝
(7) StrEmpty(S)
//串判空
(8) ClearString (&S)
//清空串
(9) Index(S,T,pos)
//子串的位置
(10) Replace(&S,T,V)
//串替换
(11) StrInsert(&S,pos,T)
//子串插入
(12) StrDelete(&S,pos,len)
链式存储表示
head
ABCD
head
A
B
EFGH
I###
C
#define CHUNKSIZE 80 //可由用户定义的块大小 typedef struct Chunk{
四、串、数组和广义表
四、串、数组和⼴义表(内容待完善)知识点串的模式匹配⼜称⼦串定位运算或串匹配。
在匹配中,将主串称为⽬标(串),⼦串称为模式(串)。
BF法(Brute Force):KMP法:串的模式匹配的两种⽅法。
BF法,朴素的串匹配法。
KMP法,尽可能的滑动得更远,利⽤部分的匹配结果。
朴素的模式匹配算法(BF算法)图⽰说明第⼀轮⽐较:第⼆轮⽐较:...... 原理⼀致,省略中间步骤第五轮:第六轮:第⼀轮:⼦串中的第⼀个字符与主串中的第⼀个字符进⾏⽐较若相等,则继续⽐较主串与⼦串的第⼆个字符若不相等,进⾏第⼆轮⽐较第⼆轮:⼦串中的第⼀个字符与主串中第⼆个字符进⾏⽐较......第N轮:依次⽐较下去,直到全部匹配代码实现:(略)BF算法优点:思想简单,直接,缺点:每次字符不匹配时,都要回溯到开始位置,时间开销⼤。
时间复杂度 O((n-m+1)*m) 。
KMP模式匹配算法图⽰说明:从图中,我们可以很容易的发现,因为前⾯的字符,S和T中存在同的元素,所以S不必回溯到S[1]的位置,T也不必回溯到T[0]的位置。
我们就可直接跳过对相同元素的回溯⽐较,直接⽐较S[8]与T[3]。
因此我们构建⼀个next数组储存回溯位置。
KMP算法的思想:假设在模式匹配的进程中,执⾏T[i]和W[j]的匹配检查。
若T[i]=W[j],则继续检查T[i+1]和W[j+1]是否匹配。
next数组两种求法(1)第⼀种求法:根据前⼀个字符的next值求初始化:代码实现:1 char t[]={"ababaabab"};2 int Len=strlen(t);34 int i = 0, j = -1;5 int next[len];6 next[0]=-1;7 while (i < len - 1) {8 if ((j == -1) || t[i] == t[j]) {9 ++i, ++j;10 next[i] = j;11 }else{12 j = next[j];13 }14 }1516 for(i=0;i<len;i++)17 {printf("next[%d]->%d\n",i,next[i])}(2)第⼆种求法:根据最⼤公共元素长度求的求法))next数组优化(nextval的求法当⼦串中有多个连续重复的元素,例如主串 S=“aaabcde” ⼦串T=“aaaaax” 在主串指针不动,移动⼦串指针⽐较这些值,其实有很多⽆⽤功,因为⼦串中5个元素都是相同的a,所以我们可以省略掉这些重复的步骤。
模块4 数组、串和广义表
Loc(ac1c2),每个元素占d个存储单元,则任意元素aij的地址为: ❖ 按行优先存储:Loc(aij)=Loc(ac1c2)+[(i-c1)×(d2-c2+1)+( j-c2) ]×d ❖ 按列优先存储:Loc(aij)=Loc(ac1c2)+[( j-c2)×(d1-c1+1)+ (i-c1) ]×d
Loc(aij)=Loc(a11)+ i (i -1)/2+ j-1
特殊矩阵的压缩存储
三角矩阵
同样,对于上三角矩阵,也可以将其压缩存储到一个 大小为n(n+1)/2的一维数组中。
Loc(aij)=Loc(a11)+ j (j -1)/2+ i-1
特殊矩阵的压缩存储
带状矩阵
在矩阵A中,所有的非零元素都集中在以主对角线为中心的带状区 域中。其中最常见的是三对角带状矩阵。
例如: 中国举办的某体育项目国际邀请赛,参赛队列表课采用如下的形式:
(俄罗斯,巴西,(中国,天津,四川),古巴,美国,(),日本) 即构成一个广义表。
广义表
广义表的特征:
(1)广义表中的数据元素有相对次序; (2)广义表的长度定义为最外层包含元素个数; (3)广义表的深度定义为所含括弧的重数。(其中,原子
矩阵Amn看成n个列向量的线性表
数组的逻辑结构--2 还可以将数组Amn看成另外一个线性表: B=(β1, β2,… …βn),其中βi(1≤i≤m)本身也是一个线性表, 称为行向量,即:βi =(ai1,ai2,aij,…,ain)
矩阵Amn看成m个行向量的线性表
《数据结构及其应用》笔记含答案 第四章_串、数组和广义表
第4章串、数组和广义表一、填空题1、零个或多个字符组成的有限序列称为串。
二、判断题1、稀疏矩阵压缩存储后,必会失去随机存取功能。
(√)2、数组是线性结构的一种推广,因此与线性表一样,可以对它进行插入,删除等操作。
(╳)3、若采用三元组存储稀疏矩阵,把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算。
(╳)4、若一个广义表的表头为空表,则此广义表亦为空表。
(╳)5、所谓取广义表的表尾就是返回广义表中最后一个元素。
(╳)三、单项选择题1、串是一种特殊的线性表,其特殊性体现在(B)。
A.可以顺序存储B.数据元素是一个字符C.可以链式存储D.数据元素可以是多个字符若2、串下面关于串的的叙述中,(B)是不正确的?A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储解释:空格常常是串的字符集合中的一个元素,有一个或多个空格组成的串成为空格串,零个字符的串成为空串,其长度为零。
3、串“ababaaababaa”的next数组为(C)。
A.012345678999 B.012121111212 C.011234223456 D.01230123223454、串“ababaabab”的nextval为(A)。
A.010104101B.010102101 C.010100011 D.0101010115、串的长度是指(B)。
A.串中所含不同字母的个数B.串中所含字符的个数C.串中所含不同字符的个数D.串中所含非空格字符的个数解释:串中字符的数目称为串的长度。
6、假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=(B)。
A.808 B.818 C.1010 D.1020解释:以行序为主,则LOC[5,5]=[(5-1)*100+(5-1)]*2+10=818。
第四章串、数组和广义表PPT课件
4.1.4 串的存储结构
• 串的链式存储表示 串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,结
点的构成是:
• data域:存放字符,data域可存放的字符个数称为结点的大小; • next域:存放指向下一结点的指针。
first
a
b
g∧
• 若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为
基本思想:从主串S的第一个字符开始和模式T 的第一个字符进行比较,若相等,则继续比较两者的后续字符; 否则,从主串S的第二个字符开始和模式T 的第一个字符进行比较,重复上述过程,直到T 中的字符全部比 较完毕,则说明本趟匹配成功;或S中字符全部比较完,则说明匹配失败。
• 模式匹配问题的特点: • ⑴ 算法的一次执行时间不容忽视:问题规模通常很大,常常需要在大量信息中进行匹配; • ⑵ 算法改进所取得的积累效益不容忽视:模式匹配操作经常被调用,执行频率高。
第26页/共68页
4.1.4 匹配模式——BP算法
例:主串S="ababcabcacbab",模式T="abcac"
i
第 ababcabcacbab
5
趟
abcac
j
i=5,j=1失败; i“回溯”到6,j回溯到1
第27页/共68页
4.1.4 匹配模式——BP算法
例:主串S="ababcabcacbab",模式T="abcac"
• 定长顺序存储表示:将串定义成字符数组,利用串名可以直接访问串 值。用这种表示方式,串的存储空间在编译时确定,其大小不能改变。
• 堆分配存储方式:仍然用一组地址连续的存储单元来依次存储串中的 字符序列,但串的存储空间是在程序运行时根据串的实际长度动态分 配的。
第4章 串、多维数组与广义表
4.1.1 串的定义
串(string)(或字符串)是由零个或多个字符组成 的有限序列,一般记为: S="a1 a2 …… an" (n≥0) 串名:串的名字S。 串值:用双引号括起来的字符串序列,ai(1≤i≤n) 可以是字母、数字或其他字符。 串的长度:串中字符的个数n称为串的长度。 串相等:只有当两个串的长度相等,并且各个对 应位置上的字符都相等时,才能称为串相等。
4.1.1 串的定义
判断空串StrEmpty(S):若S为空串,则返回TRUE,否则返回FALSE; 串复制StrCopy(&T,S):将串S复制到串T; 串清空ClearString(S):将S置空串; 串定位StrIndex(S,T,pos):串S和T存在,T是非空串, 1≤pos≤StrLength(S),若T是S的子串,返回T在S中第一次出现的位 置,否则返回0; 串置换Replace(&S,T,V):串S,T和V存在,T是非空串,用V替换主串 S中出现的所有与T相等的不重叠的子串。例如:设S= "bbabbabba",T="ab",V="a",则Replace(&S,T,V)的结果是S ="bbababa"; 串插入StrInsert(&S,pos,T):1≤pos≤StrLength(S)+1,在串S的第pos 个字符之前插入串T; 串删除StrDelete(&S,pos,len): 1≤pos≤StrLength(S)-len+1,从串S中 删去第pos字符起长度为len的子串; 串销毁DestroyString(&S) :串S被销毁,并回收串空间; }ADT String
4.1.3 串的模式匹配算法
第4章串、数组和广义表
列优先,寻址函数: Loc(i,j) = Loc(r,c) + ((j-c) ×m + (i-r)) ×s
r≤i≤r+m-1,c≤j≤c+n-1 行优先,寻址函数: Loc(i,j) = Loc(r,c) + ((i-r) ×n + (j-c)) ×s
r≤i≤r+m-1,c≤j≤c+n-1 当r、c为0,寻址函数:
(4)求子串StrSub(S,i,piecelen)
操作条件 串S存在
操作结果 返回S的第i个字符开始的长 度为piecelen的子串。
(5)串比较StrCmp(S1,S2) 操作条件 串S1,S2存在。 操作结果 比较串的大小。
(6)子串定位StrIndex(S,T)
操作条件 串S,T存在。
操作结果 查找子串T在主串S中首次出 现的位置。如果S中不包含T,则返回 值为-1。
S1->len=piecelen ;
return OK;}
(3)串插入
StrInsert(Seqstring *S, Seqstring *T) {if(i>=S->len|| S->len+T->Ien>MAXSIZE)
printf(“不能插入”); else if(i==0) {for(k=S->len+T->len-
i (i – 1) +j-1 当 i≥j
2 k=
j (j – 1) +i-1 当 i<j
2
a12
a13
= =
a11 a21 a22 a31 k= 0 1 2 3
ann n(n+1)
2 -1
2) 三角矩阵
第4章数组和广义表
第4章数组和广义表第4章数组和广义表本章主要介绍下列内容:1.数组的定义、基本运算和存储结构2.特殊矩阵的压缩存储3.广义表的定义、术语、存储结构、运算4.递归算法设计课时分配:1两个学时,2两个学时,3两个学时, 4两个学时重点、难点:特殊矩阵的压缩存储、广义表的存储结构、递归算法设计第一节数组1.数组的定义和基本运算数组的特点是每个数据元素可以又是一个线性表结构。
因此,数组结构可以简单地定义为:若线性表中的数据元素为非结构的简单元素,则称为一维数组,即为向量;若一维数组中的数据元素又是一维数组结构,则称为二维数组;依次类推,若二维数组中的元素又是一个一维数组结构,则称作三维数组。
结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。
举例:其中,A是数组结构的名称,整个数组元素可以看成是由m个行向量和n个列向量组成,其元素总数为m×n。
在C语言中,二维数组中的数据元素可以表示成a[表达式1][表达式2],表达式1和表达式2被称为下标表达式,比如,a[i][j]。
数组结构在创建时就确定了组成该结构的行向量数目和列向量数目,因此,在数组结构中不存在插入、删除元素的操作。
二维数组结构的基本操作:(1)给定一组下标,修改该位置元素的内容Assign(A,elem,index1,index2)(2)给定一组下标,返回该位置的元素内容Value(A,elem,index1,index2)2.数组的存储结构从理论上讲,数组结构也可以使用两种存储结构,即顺序存储结构和链式存储结构。
然而,由于数组结构没有插入、删除元素的操作,所以使用顺序存储结构更为适宜。
换句话说,一般的数组结构不使用链式存储结构。
组成数组结构的元素可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。
举例:LOC(i,j)=LOC(0,0)+(n*i+j)*L数组结构的定义:#define MAX_ROW_INDEX 10#define MAX_COL_INDEX 10typedef struct{Elemtype elem[MAX_ROW_INDEX][MAX_COL_INDEX] } ARRAY;基本操作算法举例:(1)给数组元素赋值void Assign(ARRAY *A,Elemtype elem,int index1,int index2) { if (index1<0||index1>=MAX_ROW_INDEX||index2<0||index2>=MA X_COL_INDEX) exit(ERROR);else A->elem[index1][index2]=elem; }(2)返回给定位置的元素内容int Value(ARRAY A,Elemtype *elem,int index1,int index2){ if (index1<0||index1>=MAX_ROW_INDEX|| index2<0||index2>=MAX_COL_INDEX) return FALSE;else { *elem= A.elem[index1][index2]; return OK;3.矩阵的压缩存储矩阵是在很多科学与工程计算中遇到的数学模型。
数组串与广义表
[0] 0 2
2
[1] 1 0
3
[2] 1 3 -11
[3] 2 3
-6
[4] 3 5 -17
[5] 4 1
9
[6] 4 4 19
[7] 5 3
-8
[8] 5 6 -52
行列 值
(row) (col) (value)
[0] 1 0
3
[1] 4 1
9
[2] 0 2
2
[3] 1 3 -11
[4] 2 3
字符串
字符串
n(n≥0)个字符的一个有限序列,简称为串 记为S = “a0 a1 a2 … an-1” n是串的长度,n等于0的串叫空串
子串
串中连续若干个字符组成的串 S=“maintenance”,P=“ten”是S的子串,P在S
中的位置为4(从第0个字符开始)
14
字符串
稀疏因子: δ = s/(m×n)
一般δ ≤ 0.05可称为稀疏 0 0 2 0 0 0
0
3 0 0 11 0 0 0
A 67
0
0
0 0
0 0
6 0
0 0
0 17
0
0
0 0
9 0
0 0
0 8
19 0
0 0
0 52
稀疏矩阵表示
字符串的一些基本操作
复制strcpy 连接strcat 比较strcmp 长度strlen
typedef struct { char ch[maxSize]; int length;
} SeqString;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s'a1a2an'
串名
串值
串长
n
空串
n=0
4.1.1 串的基本概念
a=‘BEI’, b=‘JING’ c=‘BEIJING’ d=‘BEI JING’
a和b是c和d的子串 a在c和d中的位置是1。 b在c中的位置是4,在d中的位置为5。 ‘ ’是空格串Φ
4.1.4 串的存储结构
串是一种特殊的线性表,其存储表示和线性表类似,但又 不完全相同。串的存储方式取决于将要对串所进行的操作 。串在计算机中有3种表示方式:
定长顺序存储表示:将串定义成字符数组,利用串名可 以直接访问串值。用这种表示方式,串的存储空间在编 译时确定,其大小不能改变。
堆分配存储方式:仍然用一组地址连续的存储单元来依 次存储串中的字符序列,但串的存储空间是在程序运行 时根据串的实际长度动态分配的。
调用标准库函数 #include<string.h>
串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from) 串连接,strcat(char to,char from) 求串长,strlen(char s) ……
4.1.1 串的基本概念
第四章 串、数组和广义表
2 学时
教学目标
了解串的存储方法,理解串的两种模式匹配算法,重点掌 握BF算法。
明确数组和广义表这两种数据结构的特点,掌握数组地址 计算方法,了解几种特殊矩阵的压缩存储方法。
掌握广义表的定义、性质及其GetHead和GetTail的操作 。
数据结构
第一节
串
补充:C语言中常用的串运算
⑺ StrInsert (s, i, t):插入,将串t插入到串s中的第i个位置。 ⑻ StrDelete (s, i, len):删除,在串s中删除从第i个字符开始
的连续len个字符。 ⑼ StrRep (s, t, r):替换,在串s中用串r替换所有与串t相等
的子串。
}ADT String
4.1.2 串的抽象数据类型
块链存储方式:是一种链式存储结构表示。
4.1.4 串的存储结构
串的定长顺序存储表示
这种存储结构又称为串的顺序存储结构。是用一组连续的存储单元来 存放串中的字符序列。所谓定长顺序存储结构,是直接使用定长的字 符数组来定义,数组的上界预先确定。
特点:
串的实际长度可在这个予定义长度的范围内随意设定,超过予定义 长度的串值则被舍去,称之为“截断” 。
子串 主串 字符位置 子串位置 串相等 空格串
4.1.2 串的抽象数据类型
ADT String{ 数据对象:D = { ai|ai∈CharacterSet, i=1,2,…,n, n ≥0 } 数据关系:R = {<ai-1, ai>| ai-1, ai∈D, i=2,3,…,n } 基本操作: ⑴ StrLength (s):求串s的长度。 ⑵ StrAssign (s1, s2):赋值,将s2的值赋值给串s1。 ⑶ StrConcat (s1, s2, s):连接,将串s2放在串s1的后面连接
4.1.4 串的存储结构
串的联接算法中需分三种情况处理:
Status Concat(SString S1, SString S2, SString &T) { // 用T返回由S1和S2联接而成的新串。未截断, 则返回TRUE,否则FALSE。 if (S1[0]+S2[0] <= MAXSTRLEN) {// 未截断
按这种串的表示方法实现的串的运算时,其基本操作为 “字符序 列的复制”。
定长顺序存储结构定义为:
#define MAX_STRLEN 256 typedef struct { char str[MAX_STRLEN] ;
int length; } StringType ;
4.1.4 串的存储结构
如何表示串的长度?
方案1:用一个变量来表示串的实际长度。 方案2:在串尾存储一个不会在串中出现的特殊字符 作为串的终结符,表示串的结尾。 方案3:用数组的0号单元存放串的长度,从1号单 元开始存放串值。
0 1 2 3 4 5 6 …77…………M…ax-M1ax-1
a9 ab bc cd de ef gf \g0空 闲空 闲9
求子串操作SubStr(s, i, len)示例
i = 3, len = 3
abcdefge
i = 7, len = 4
abcdefge
空串
cde
ge
4.1.3 串与线性表的比较
逻辑结构 串的逻辑结构和线性表极为相似,区别仅在于串的数据对 象约束为字符集。
基本操作 在线性表的基本操作中,大多以“单个元素”作为操作 对象; 在串的基本操作中,通常以“串的整体”作为操作对象 。
T[0] = MAXSTRLEN; uncut = FALSE; } else { // s1截断(仅取S1)
T[1..MAXSTRLEN] = S1[1..MAXSTRLEN];
T[0] = MAXSTRLEN
uncut = FALSE;
}
return uncut;
} // Concat
4.1.4 串的存储结构
T[1..S1[0]] = S1[1..S1[0]]; T[S1[0]+1..S1[0]+S2[0]] = S2[1..S2[0]];
T[0] = S1[0]+S2[0]; uncut = TRUE; } else if (S1[0] <MAXSTRLEN) { // s2截断,s1未截断
T[1..S1[0]] = S1[1..S1[0]]; T[S1[0]+1..MAXSTRLEN] = S2[1..MAXSTRLEN-S1[0]];
成一个新串s。 ⑷ SubStr (s, i, len):求子串,返回从串s的第i个字符开始取
长为 len 的子串。
4.1.2 串的抽象数据类型
⑸ StrCmp (s1, s2):串比较,若s1=s2,返回0;若s1<s2, 返 回-1;若s1>s2, 返回1。
⑹ StrIndex (s, t):定位,返回子串t在主串s中首次出现的位 置。若t不是s的子串,则返回0。