数据结构第四章

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

S pos
A 插入前
S
T
A
pos 插入后
MAXLEN MAXLEN
T 插入串
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
(2) 插入后串长(st+st+st≥MAXLEN且pos+st<MAXLEN,则A后移时 会有部分字符被舍
S
A
pos 插入前
MAXLEN 舍弃
如图所示:
0123
4 567
8 … MAXLEN
a b c d e f g h …z
图4.3 串 的 定 长 顺 序 存 储
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
4.2.2 顺序串的基本操作
1. 串插入函数(StrInsert(S, pos,T))
在进行串的插入时,插入位置pos将串分为两部分(假设为S、A,长度为st+1、 st+1),及待插入部分(假设为T,长度为st+1),则串由插入前的SA变为STA, 可能有三种情况: (1) 插入后串长(st + st + st)<MAXLEN,则将A后移st个元素位置, 再将T插入,
18 for(i=0; i<=st; i++)
19
S->ch[i+pos]=T.ch[i];
20 S->last=MAXLEN;
21 }
22 else
23 { /*串T的部分字符序列要舍弃*/
24 for(i=0; i<MAXLEN-pos; i++)
25
S->ch[i+pos]=T.ch[i];
如何标识实际长度 ?可用以下方法
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
1. 类似顺序表,用一个指针来指向最后一个字符。 描述如下:
typedef struct { char ch[MAXLEN]; int last; } SeqString;
定义一个串变量: SeqString S;
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
第四章 串
1.教学目的:
掌握串的定义、基本运算的实现及基本串匹配算法。
2.教学要求:
①理解串的七种基本运算的定义。 ②掌握利用这些基本运算来实现串的其它各种运算的方法。 ③掌握在顺序存储结构上实现串的各种操作的方法。 ④理解KMP算法,了解NEXT函数和改进NEXT函数的定义和计算。 ⑤理解串名的存储映象和在堆存储结构实现串操作的方法。
T 插入串
S pos
T 插入后
ห้องสมุดไป่ตู้
A
A串部分被舍弃
MAXLEN
(3) 插入后串长(st+st+st≥MAXLEN且pos+st>MAXLEN,则A全部 字符被舍弃(不需后移),并且T在插入时也有部分字符被舍弃
S pos
A 插入前
S pos
T 插入后
MAXLEN 舍弃
T 插入串
5 if(S->last+st<MAXLEN)
6 { /*插入后串长<MAXLEN */
7 for(i=S->last+st+1; i>st+pos; i--)
8
S->ch[i]=S->ch[st-1];
9 for(i=0; i<=st; i++)
10
S->ch[i+pos]=T.ch[i];
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
4.2 串的顺序存储及基本运算
对串的存储方式取决于我们对串所进行的运算。
4.2.1 串的定长顺序存储
用一组地址连续的存储单元存储串值中的字符序列。 为每一个串变量预分配一个固定长度的存储区,如: #define MAXLEN 256 char s[MAXLEN]; 则串的最大长度不能超过256。
26 S->last=MAXLEN;
27 }
28 return(1);
29 }
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
2. 串删除函数(StrDelete(S, pos, len))
函数功能:在串S中删除从序号pos起len个字符,0≤pos≤st。 1 int StrDelete(SeqString *S, int pos, int len) 2{ 3 int i; 4 if(pos<0||pos>(S->last-l)) return(0); /*删除位置不合法*/ 5 for(i=pos+len; i<=S->last; i++) 6 S->ch[i-len]=S->ch[i]; 7 S->last=S->last-l; 8 return(1); 9}
如图所示:
012
3
4 567
8…
MAXLEN-1
a b c d e f g h i \0 …
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
3. 设定长串存储空间 char s[MAXLEN+1] 用s[0]存放串的实际长度,串值存放在s[1]~s[MAXLEN],字符的 序号和存储位置一致,应用更为方便。
S.ch 0 1 2 3 4 5 6 7 8 9 10 … abcde fgh i j k
st
MAXLEN-1 …
串的长度st+1
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
2. 在串尾存储一个特殊字符作为串的终结符 比如C语言中用’\0’来表示串的结束。 char s[MAXLEN]; 这种存储方法不能直接得到串的长度,是用判断当前字符是否是’\0’ 来确定串是否结束,从而求得串的长度。
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
3. 串复制函数(StrCopy(S, T))
函数功能:将串T的值复制到串S中。 1 StrCopy(SeqString *S, SeqString T) 2{ 3 int i; 4 for(i=0; i<=st; i++) 5 S->ch[i]=T.ch[i]; 6 S->last=st; 7}
n是串中字符的个数, 称为串的长度 字符在串中的序号称为该字符在串中的位置
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
术语:
1. 子串 串中任意个连续的字符组成的子序列称为该串的子串。
2. 主串 包含子串的串相应地称为主串。
3. 子串在主串中的位置 通常以子串的第一个字符在主串中的位置来表示。
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
4.1 串的定义及其基本运算
串是一种特殊的线性表。数据元素仅由一个字符组成。 1 保持线性表前驱、后继的关系; 2 对串整体进行操作。
•4.1.1 串的基本概念
定义: 是零个或多个字符组成的有限序列。 一般记为:s=“a1a2...an” (n≥0) 其中: s是串的名字;
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
5. 连接函数(StrCat(S, T))
1 int StrCat(SeqString *S, SeqString T)
2 { /*将串T连接在串S的后面*/
3 int i, flag;
4 if(S->last+st<MAXLEN)
5 { /*连接后串长小于MAXLEN */
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
3.教学重点:
①熟悉串的七种基本运算的定义及实现方法。 ②熟练掌握基本串匹配算法。
4.教学难点:
在教学过程中强调串的特点,即数据元素是字符,操作对象是若干数 据元素组成的序列。串的顺序存储结构及其基本操作的实现是重点。有回 溯的模式匹配和无回溯的模式匹配(KMP)算法是本章的难点。
4. 串相等 当两个串的长度相等, 并且每个对应位置的字符都相等,称 两个串是相等的。
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
4.1.2 串的基本运算
(1) 赋值操作StrAssign(S, chars):chars是字符串常量。生成一个值等于chars的串S。 (2) 求串长度StrLength(S):串S存在。返回串S的长度,即串S中的元素个数。 (3) 连接函数StrCat(S, T):串S和T存在。将串T的值连接在串S的后面。 (4) 求子串函数SubString(sub, S, pos, len):串S存在,1≤pos≤StrLength(S)且1≤ len≤StrLength(S)-pos+1。用sub返回串S的第pos个字符起长度为len的子串。 (5) 定位函数StrIndex(S, T, pos):串S和T存在,T是非空串,1≤pos≤StrLength(S)。 若串S中存在与串T相同的子串,则返回它在串S中第pos个字符之后第一次出现的位 置;否则返回0。注意,T不能为空串。 (6) 插入子串操作StrInsert(S, pos, T):串S存在,1≤pos≤StrLength(S)+1。在串S的第 pos个字符之前插入串T
T串部分被舍弃 MAXLEN
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
1 int StrInsert(SeqString *S, int pos, SeqString T) 2 { /*在串S中序号为pos的字符之前插入串T,0≤pos≤st+1*/
3 int i; 4 if(pos<0 || pos>S->last+1) return(0); /*插入位置不合法*/
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
5. 连接函数(StrCat(S, T))
函数功能:将串T连接在串S的后面。与串的插入操作类似,在进行串 的连接时(假设原来串为S,长度为st,待连接串为T,长度为st), 也可能有三种情况: (1) 连接后串长(st+st)<MAXLEN,则直接将T加在S的后面。 (2) 连接后串长(st+st)>MAXLEN且st<MAXLEN,则T会 有部分字符被舍弃。 (3) 连接后串长(st+st)>MAXLEN且st = MAXLEN,则T的 全部字符被舍弃(不需连接)。
11 S->last=S->last+st+1;
12 }
13 else
14 if(pos+st<MAXLEN)
15 { /*插入后串长>MAXLEN,但串T的字符序列可以全部插入*/
16 for(i=MAXLEN-1; i>st+pos; i--)
17
S->ch[i]=S->ch[st-1];
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
4.1.2 串的基本运算
(7) 删除子串操作StrDelete(S, pos, len):串S存在,1≤pos≤StrLength(S)且 0≤len≤StrLength(S)-pos+1。从串S中删除第pos个字符起长度为len (8) 串复制操作StrCopy(S, T):串T存在。由串T复制得串S。 (9) 判空函数StrEmpty(S):串S存在。若串S为空串,则返回TRUE,否则返回 FALSE。 (10) 串比较操作StrCompare(S, T):串S和T存在。若S > T,则返回值大于0;如 S = T,则返回值等于0;若S < T,则返回值小于0。 (11) 串清空操作StrClear(S):串S存在。将S (12) 替换操作StrReplace(S, T, V):串S、T和V存在,且T是非空串。用V替换串S 中出现的所有与T相等的不重叠的子串。
省级精品课程配套教材 高等学校计算机类“十二五”规划教材
4. 串比较函数(StrCompare(S, T))
函数功能:若串S和T相等,则返回0;若S > T,则返回大于0的数;若 S < T,则返回小于0的数。 1 int StrCompare(SeqString S, SeqString T) 2{ 3 int i; 4 for(i=0; i<=st&&i<=st; i++) 5 if(S.ch[i]!=T.ch[i]) 6 return(S.ch[i]-T.ch[i]); 7 return(st); 8}
6 for(i=S->last; i<=S->last+st; i++)
7
S->ch[i+1]=T.ch[i-S->last];
8 S->last=S->last+st+1;
相关文档
最新文档