数据结构:链串及其运算
数据结构第5章 串和广义表

5.1 串的定义和基本运算
• (4)串的连接StrCat(S,T)。 • 初始条件:串S和T存在。 • 操作结果:将串T的值连接在串S的后面。 • (5)求子串SubString(Sub,S,pos,len)。 • 初始条件:串S存在,1≤pos≤StrLength(S)且
1≤len≤StrLength(S)-pos+1。 • 操作结果:用Sub返回串S的第pos个字符起长度为len的
1≤len≤StrLength(S)-pos+1。 • 操作结果:从串S中删除第pos个字符起长度为len的子串。 • (9)串的替换StrReplace(S,T,V)。 • 初始条件:串S,T和V存在,且T是非空串。 • 操作结果:用V替换串S中出现的所有与T相等的不重叠子
串。 • (10)判断串空StrEmpty(S)。 • 初始条件:串S存在。 • 操作结果:若串S为空串,则返回1;否则返回0。
• (1)非紧凑存储。设串S="Hello boy",计算机字长为32 位(4个Byte),用非紧凑格式一个地址只能存一个字符, 如图5-2所示。其优点是运算处理简单,但缺点是存储空 间十分浪费。
• (2)紧凑存储。同样存储S="Hello boy",用紧凑格式一 个地址能存四个字符,如图5-3所示。紧凑存储的优点是 空间利用率高,缺点是对串中字符处理的效率低。
•}
5.3 串的基本运算的实现
• (3)求子串操作。求串S从第pos位置开始,长度为len的 子串,并将其存入到串Sub中。操作成功返回1,不成功 返回0。其算法描述如下:
• int SubString(String *S,String *Sub,int pos,int len)
《数据结构》课程教学大纲(三套)

数据结构课程教学大纲(三套)《数据结构》课程教学大纲(36/36 课时)一、课程的性质和任务数据结构是计算机及应用专业中一门重要的专业基础课程,在计算机软件的各个领域中均会使用到数据结构的有关知识。
当用计算机来解决实际问题时,就要涉及到数据的表示及数据的处理,而数据表示及数据处理正是数据结构课程的主要研究对象,通过这两方面内容的学习,为后续课程,特别是软件方面的课程打开厚实的基础。
因此,数据结构课程在计算机应用专业中具有举足轻重的作用。
本课程的任务是:在基础方面,要求学员掌握常用数据结构的基本概念及其不同的实现方法;在技能方面,通过系统学习能够在不同存储结构上实现不同的运算,并对算法设计的方式和技巧有所体会。
总言之,使应用者较全面的掌握各种常用的数据结构,提高运用数据结构解决实际问题的能力。
二、课程的基本要求本课程的教学基本要求如下:本课程要求理论必须与上机实践操作相结合,多做题和调试算法,实现算法。
实践项目只利用课堂时间是不够的,必须提前布置给学生。
通过本课程的学习与实践,学生应达到:1、掌握数据结构的基本概念和基本理论;2、熟练掌握顺序表、链表、队列、栈、树以及二叉树、图等基本数据结构的设计和分析;3、熟练地掌握常用算法(递归、遍历、查找、排序)的知识;4、能对所求解的问题进行分析,抽象出逻辑结构,选择合适的存储结构定义所需的运算,设计相应的算法;5、对算法进行分析和评价。
三、教学内容(一)理论教学(二)实践环节四、课时分配《数据结构》课程共4学分,课内72学时,其中理论课36学时,上机36学时。
五、大纲说明本课程必须理论与上机实践操作相结合,并要教、学、练相结合,讲清基本概念,指出知识要点、重点和难点,并通过实例分析解决算法难点;要求学生认真预习、认真听课、认真思索、认真做实验, 通过对算法的编程实现来提高学生 由于内容多、 难度大, 要特别注重精讲多练, 实践项目一定 要提前布置给学生, 调动学生的主观能动性,鼓励学生多提 问题、共同探讨和解决问题。
数据结构——第4章 串(C#)

4.1.1 什么是串 串(或字符串)是由零个或多个字符组成的有限序列。 记作str="a1a2…an"(n≥0),其中str是串名,用双引号括 起来的字符序列为串值,引号是界限符,ai(1≤i≤n)是一 个任意字符(字母、数字或其他字符),它称为串的元素, 是构成串的基本单位,串中所包含的字符个数n称为串的 长度,当n=0时,称为空串。
4.2 串的存储结构
4.2.1 串的顺序存储结构-顺序串
和顺序表一样,用一个data数组(大小为MaxSize)和 一个整型变量length来表示一个顺序串,length表示data数 组中实际字符的个数。 定义顺序串类SqStringClass如下:
class SqStringClass { const int MaxSize=100; public char[] data; //存放串中字符 public int length; //存放串长 public SqStringClass() //构造函数,用于顺序串的初始化 { data=new char[MaxSize]; length=0; } //顺序串的基本运算 }
(9)串输出DispStr() 将当前串s的所有字符构成一个字符串并输出。对应的算 法如下:
public string DispStr() { int i; string mystr=""; if (length==0) mystr = "空串"; else { for (i=0;i<length;i++) mystr+=data[i].ToString(); } return mystr; }
数据结构实验报告串

一、实验目的1. 理解串的概念和性质;2. 掌握串的基本操作,如连接、赋值、求长度、定位等;3. 熟悉串的两种存储结构:顺序存储和链式存储;4. 能够实现串的简单应用,如字符串匹配、子串查找等。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 串的定义和性质2. 串的顺序存储结构3. 串的链式存储结构4. 串的基本操作5. 字符串匹配算法6. 子串查找算法四、实验步骤1. 定义串的数据结构```cpp#define MAX_SIZE 100typedef struct {char data[MAX_SIZE];int length;} StrString;```2. 实现串的基本操作```cpp// 初始化串void InitString(StrString &S) {S.length = 0;}// 赋值操作void AssignString(StrString &S, StrString T) { for (int i = 0; i < T.length; i++) {S.data[i] = T.data[i];}S.length = T.length;}// 求长度操作int Length(StrString S) {return S.length;}// 定位操作int Index(StrString S, StrString T, int pos) { int i, j;i = pos;for (j = 0; j < T.length && i < S.length; j++, i++) { if (S.data[i] != T.data[j]) {i = i - j;j = 0;}}if (j == T.length) {return i - T.length + 1;}return 0;}```3. 实现字符串匹配算法```cpp// 字符串匹配算法(KMP算法)int KMPMatch(StrString S, StrString T) {int i, j;int next[T.length];// 构建next数组for (i = 1, j = 0; i < T.length; i++) {while (j > 0 && T.data[i] != T.data[j]) {j = next[j - 1];}if (T.data[i] == T.data[j]) {j++;}next[i] = j;}// 匹配过程i = 0;j = 0;while (i < S.length && j < T.length) { if (S.data[i] == T.data[j]) {i++;j++;} else if (j > 0) {j = next[j - 1];} else {i++;}}if (j == T.length) {return i - j;}return 0;}```4. 实现子串查找算法```cpp// 子串查找算法(朴素算法)int SubStringMatch(StrString S, StrString T) {int i, j;for (i = 0; i <= S.length - T.length; i++) {j = 0;while (j < T.length && S.data[i + j] == T.data[j]) {j++;}if (j == T.length) {return i;}}return 0;}```五、实验结果与分析1. 初始化串、赋值操作、求长度操作、定位操作均能正常执行,符合预期。
数据结构-第4章 串

4.1 串的类型定义
子串的序号:将子串在主串中首次出现时的该 子串的首字符对应在主串中的序号,称为子串 在主串中的序号(或位置)。 【例】 A=“abcdefbbcd”,B=“bcd”,B在A中的 序号为2。 特别地,空串是任意串的子串,任意串是其自 身的子串。
4.1.2 串的抽象数据类型定义
//查找ab子串
if (p->data==‘ a’ && p->next->data==‘b’)
{ p->data=‘x’; p->next->data=‘z’;
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=‘y’;
q->next=p->next; p->next=q;
s: a a a a b c d
t: a ab bac acb bc c ✓ 匹配成功 算法的思路是从s的每一个字符开始依次与t的 字符进行匹配。
4.2.1 Brute-Force算法
int BFIndex(SqString s,SqString t)
{ int i=0, j=0,k;
while (i<s.length && j<t.length)
4.1 串的类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法
本章要求
理解: 1、串的基本概念、类型定义 2、串的存储表示和实现 3、串的KMP算法
掌握: 4、串的简单模式匹配算法(BF)
第4章 串的基本概念
串(或字符串):是由零个或多个字符组成 的有限序列。
串的逻辑表示: S=“a1a2…ai…an”,其中S为 串名,ai (1≤i≤n)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。
《数据结构与算法》第四章-学习指导材料

《数据结构与算法》第四章串知识点及例题精选串(即字符串)是一种特殊的线性表,它的数据元素仅由一个字符组成。
4.1 串及其基本运算4.1.1 串的基本概念1.串的定义串是由零个或多个任意字符组成的字符序列。
一般记作:s="s1 s2 … s n""其中s 是串名;在本书中,用双引号作为串的定界符,引号引起来的字符序列为串值,引号本身不属于串的内容;a i(1<=i<=n)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号; n为串的长度,表示串中所包含的字符个数,当n=0时,称为空串,通常记为Ф。
2.几个术语子串与主串:串中任意连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
子串的位置:子串的第一个字符在主串中的序号称为子串的位置。
串相等:称两个串是相等的,是指两个串的长度相等且对应字符都相等。
4.2 串的定长顺序存储及基本运算因为串是数据元素类型为字符型的线性表,所以线性表的存储方式仍适用于串,也因为字符的特殊性和字符串经常作为一个整体来处理的特点,串在存储时还有一些与一般线性表不同之处。
4.2.1 串的定长顺序存储类似于顺序表,用一组地址连续的存储单元存储串值中的字符序列,所谓定长是指按预定义的大小,为每一个串变量分配一个固定长度的存储区,如:#define MAXSIZE 256char s[MAXSIZE];则串的最大长度不能超过256。
如何标识实际长度?1. 类似顺序表,用一个指针来指向最后一个字符,这样表示的串描述如下:typedef struct{ char data[MAXSIZE];int curlen;} SeqString;定义一个串变量:SeqString s;这种存储方式可以直接得到串的长度:s.curlen+1。
如图4.1所示。
s.dataMAXSIZE-1图4.1 串的顺序存储方式12. 在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。
基本数据结构及其运算

基本数据结构及其运算1.数组:数组是一种线性数据结构,可以存储相同类型的一组元素。
数组的特点是连续存储,可以通过索引快速访问元素。
数组的常用运算包括访问指定索引的元素、插入和删除元素等。
2.链表:链表也是一种线性数据结构,但不同于数组的连续存储,链表是由一系列节点组成的,每个节点包含元素和指向下一个节点的指针。
链表的常用运算包括在指定位置插入和删除节点、遍历链表等。
3. 栈:栈是一种后进先出(LIFO)的数据结构,用于存储和管理函数调用、表达式求值等需要按照特定顺序操作的场景。
栈的基本运算包括入栈(push)和出栈(pop)。
4. 队列:队列是一种先进先出(FIFO)的数据结构,用于存储和管理需要按照特定顺序处理的元素。
队列的基本运算包括入队列(enqueue)和出队列(dequeue)。
5.树:树是一种非线性数据结构,由一组节点和边组成,用于表示层次关系。
树的根节点是唯一的,每个非叶子节点可以有多个子节点。
树的常用运算包括遍历树(前序、中序、后序遍历)、特定节点等。
除了上述基本的数据结构,还有其它常见的数据结构如哈希表、图等。
不同的数据结构适用于不同的应用场景,具有不同的性能特点和运算复杂度。
在进行数据结构的运算时,可以使用不同的算法和技术来提高效率,常见的包括递归、迭代、排序算法、算法等。
此外,还可以使用一些高级数据结构如红黑树、堆等来优化特定的问题。
总结起来,数据结构是计算机科学中非常重要的基础概念,它提供了存储和组织数据的方法。
不同的数据结构适用于不同的应用场景,通过不同的算法和技术可以提高数据结构的运算效率。
实现链串的各种基本运算的算法

实现链串的各种基本运算的算法链串,这玩意儿可真是计算机里的“拉面”,一根根串起来,能灵活得让人心花怒放。
想象一下,你在家里做拉面,面条一根接一根,想吃多少就加多少,绝不拘束。
链串就是这么个意思。
说到基本运算,咱们就像在调味,调得恰到好处,才有滋有味。
首先得聊聊插入,嘿,这可不是简单地把一个东西放进去,而是要选个地方,把它给安顿得妥妥当当。
想象你在一个聚会上,朋友们都在热火朝天地聊天,你突然想给他们介绍一个新朋友。
你得找个合适的时机,不然可就有点尴尬了。
再说删除,就像是吃火锅时,有些菜太老了,根本没法下嘴,这时你就得果断一点,放弃它。
链串的删除操作也是一样,找到那个要删的节点,果断地“咔嚓”一声,给它剪掉。
不过,别忘了,要确保链串的其他部分依然“健康”。
如果你删错了,可就不好了,谁也不想吃一锅“菜没了”的火锅。
再来看看查找,这就像是在茫茫人海中找你的朋友,得用点技巧,才能不浪费时间。
在链串中,得从头到尾一个一个地看,虽然有点慢,但总能找到你想要的那个人。
再来谈谈连接,这一招简直是神来之笔。
想象一下,你把两种不同的食材拼在一起,没想到竟然能碰撞出奇妙的火花,链串也是如此。
你可以把两个链串无缝连接,像拼图一样,让它们成为一个大家庭,越大越热闹。
还有反转,这个操作就像是在看老电影时的回放,让你重新品味那份经典。
链串反转,得从头到尾把顺序调个个儿,简直是给你的链串来了个大翻身,惊艳全场。
说到链串的遍历,就像是在逛街,看到每一家店都想进去逛逛,虽然不一定买东西,但总得看看货品。
在遍历中,咱们把每一个节点都拜访一遍,欣赏它的风采,顺便找找有没有适合自己的好东西。
链串的遍历其实没那么复杂,只要记得从头开始,就能把每一个节点的“魅力”都一一呈现。
哦,对了,链串的长度也是个重要的指标。
想象你要给朋友统计一大桌子菜,得数数有多少样,不然可不好下口。
链串的长度就是在告诉你,它有多少个节点,每个节点都是链串的宝贵组成部分。
数据结构与算法_第4章_串

第4章 串
4.2 串的表示和实现
②堆串 常用的实现方法:
很多实用的串处理系统中, 采用堆结构,它的特点是:系 统将一个很大的连续存储空间作为串的公用空间, 每当建 立新串时, 系统从中分配一个和串长相同的连续空间存储 串值, 它们的地址是在程序执行中动态分配的. 系统中所有串名的存储映像构成一个符号表。其 中len域指示串的长度, start域指示串的起始位置。借
可用链表来存储串值由于串的数据元素是一个字符它只有位二进制数因此用链表存储时通常一个结点中存放的不是一个字符而是一个定长子串链表中最后一个结点不一定被占满
第4章 串
4.1 串的定义
4.2 串的表示和实现
4.3 串的应用举例:简单的行编辑器
4.4 总结与提高
*串的模式匹配算法
1
第4章 串
4.1 串的定义
8
StrIndex(S, 4,T) = 6
第4章 串
4.1 串的定义
基本操作:StrReplace (S, T, V)
StrReplace (S, T, V) 初始条件:串S, T和 V 均已存在,且 T 是非空串。 操作结果:用V替换主串S中出现的所有与(模式 串)T相等的不重叠的子串。 例如: S = abcaabcaaabca,T = bca, V = x S = axaxaax
返回
10
第4章 串
4.2 串的表示和实现
常用的实现方法:
定长顺序存储表示
顺序 存储
——用一组地址连续的存储单元存储串值的字符序 列,属静态存储方式。
堆分配存储表示
——用一组地址连续的存储单元存储串值的字符序 列,但存储空间是在程序执行过程中动态分配而 得。
数据结构(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"
数据结构 串基本操作代码

数据结构串基本操作代码简介本文档介绍了数据结构中串的基本操作代码,包括串的定义、串的赋值、串的比较、串的连接、串的替换等。
1.串的定义串是由零个或多个字符组成的有限序列,是字符串的抽象数据类型。
常用的串类型包括顺序串和链式串。
1.1 顺序串顺序串是使用数组来存储字符序列的数据结构。
其定义如下:```cdefine MaXSiZe 100 // 串的最大长度typedef struct {char data[MaXSiZe]; // 存储串的字符数组int length; // 串的长度} SqString;```1.2 链式串链式串是使用链表来存储字符序列的数据结构。
其定义如下:```ctypedef struct LNode {char data; // 存储串的字符struct LNode next; // 指向下一个节点的指针} LNode, LinkString;```2.串的基本操作2.1 串的赋值将一个字符串赋值给一个串,可以使用字符串赋值函数`strcpy`或者循环遍历字符串赋值。
2.1.1 使用strcpy函数赋值```cinclude <string.h>void Strassign(SqString s, char str) {strcpy(s->data, str);s->length = strlen(str);}```2.1.2 使用循环遍历赋值```cvoid Strassign(SqString s, char str) {int i;for (i = 0; str[i] != '\\0'; i++) {s->data[i] = str[i];}s->length = i;s->data[i] = '\\0';}```2.2 串的比较比较两个串是否相等,可以使用字符串比较函数`strcmp`或者循环遍历比较。
数据结构课件 第四章 串和数组

else {
s->str=(char*)malloc((len+1)*sizeof(char));
//分配空间
if (!s->str) return ERROR;
s->str[0..len]=string_constant[0..len];
//对应的字符赋值
s->length=len;
//赋予字符串长度
串的抽象数据类型定义
functions:
// 有13种之多
StrAssign(&T, chars) // 串赋值,生成值为chars的串T
StrCompare(S,T)
// 串比较,若S>T,返回值大于0…
StrLength(S)
// 求串长,即返回S的元素个数
Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串
type unsigned char String[MAX_STRING];
第二种是在程序执行过程中,利用标准函数malloc和free动态
地分配或释放存储字符串的存储单元,并以一个特殊的字符作为字符串
的结束标志,它的好处在于:可以根据具体情况,灵活地申请适当数目
的存储空间,从而提高存储资源的利用率。类型定义如下所示:
(4)串连接 int Concat(STRING *s1,STRING s2) { STRING s; StringAssign(&s,s1->str); //将s1原来的内容保留在s中 len=Length(s1)+Length(s2); //计算s1和s2的长度之和 free(s1->str); //释放s1原来占据的空间 s1->str=(char*)malloc((len+1)*sizeof(char)); //重新为s1分配空间
数据结构-串PPT课件

拉里·佩奇(Larry Page)
• Google搜索引擎源于拉里·佩奇和谢尔盖·布林在斯坦福大学读书时所做的一个研究项目。他们 最开始是在佩奇简陋的宿舍搞研究。
• 1996年初,佩奇和布林开始合作研究一名为“BackRub”的搜索引擎,到1998年上半年逐步 完善这项技术后,两人开始为这项技术寻找合作伙伴。他们找到雅虎的创始人之一戴维·菲洛。 菲洛认为他们的技术确实很可靠,但建议他们自己建立一个搜索引擎公司发展业务,发展起来 后再考虑合作。
a
17
2. 串的定义
由零个或多个字符组成的有限序列.
一般记为:s= a1a2…an ,n>=0
❖ 串名:s => 变量名 => 字符串 ❖ 串值: a1a2…an
=〉空格串: a1,a2,…,an 均为空格 ❖ 串长:n => n=0 =〉空串 空格串不同于空串
a
18
➢ 子串:串中任意个连续的字符组成的 子序列 =〉原串:主串
a
28
StrLength (S)
初始条件:串 S 存在。 操作结果:返回 S 的元素个数,
称为串的长度。
注:空格在串中占一个位置, 其长度为1。
a
29
Concat (&T, S1, S2)
初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2
联接而成的新串。
例如: Concat( T, man, kind) 求得 T = mankind
构建倒排文件 文档 1 文档 2 … 文档 1 文档 5 …
实验室
文档1 文档 2 …
第四章
串
a
15
4.1 串的相关术语 4.2 串的抽象数据类型的定义 4.3 串的表示和实现 4.4 串的模式匹配算法
数据结构-第四章串

数据结构-第四章串串也叫字符串,它是由零个或多个字符组成的字符序列。
基本内容1 串的有关概念串的基本操作2 串的定长顺序存储结构,堆分配存储结构;3 串的基本操作算法;4 串的模式匹配算法;5 串操作的应⽤。
学习要点1 了解串的基本操作,了解利⽤这些基本操作实现串的其它操作的⽅法;2 掌握在串的堆分配存储结构下,串的基本操作算法;3 掌握串的模式匹配算法;第四章串 4.1 串的基本概念4.2 串存储和实现4.3 串的匹配算法4.4 串操作应⽤举例第四章串 4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例第四章串4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例4. 1 串类型的定义⼀、串的定义1 什么是串串是⼀种特殊的线性表,它是由零个或多个字符组成的有,a2, a3, ... a n’限序列,⼀般记作s = ‘a1其中 s----串名, a1,a2, a3, ... a n----串值串的应⽤⾮常⼴泛,许多⾼级语⾔中都把串作为基本数据类型。
在事务处理程序中,顾客的姓名、地址;货物的名称、产地。
可作为字符串处理,⽂本⽂件中的每⼀⾏字符等也可作为字符串处理。
下⾯是⼀些串的例⼦:(1)a = ‘ LIMING’(2)b = ‘NANJING UNIVERSITY OF SCIENCE &TECHNOLOGY’(3)c = ‘ DATA STRUCTURE’(4)d = ‘’说明:1) 串中包含的字符个数,称为串的长度。
长度为0的串称为空串,它不包括任何字符,上⾯(4)中的串d 是空串,(5)中的e 是包含⼀个空格符的空格串;2)串中所包含的字符可以是字母、数字或其他字符,这依赖于具体计算机所允许的字符集。
2 串的有关术语1)⼦串串中任意连续的字符组成的⼦序列称为该串的⼦串例:c = ‘ DATA STRUCTURE’,f=‘DATA’ f是c的⼦串2)⼦串的位置⼦串T 在主串S中的位置是指主串S中第⼀个与T相同的⼦串的⾸字母在主串中的位置。
串的定义及其基本运算

则操作结果是s1="he bei"
(4)串比较 strcmp(s1,s2); 操作结果:若s1==s2,返回值为0;若s1<s2, 返回值<0;若 s1>s2, 返回值>0。
result= strcmp("abc","Abc");/* result>O */
5页
2020/9/19
数据结构(C语言版)
第5章 串
(2)串拷贝strcpy (s1,s2) ; 执行操作:将s2的串值赋值给s1。 操作结果:串s1的值与串s2的值相等,s1原来的值被覆盖掉。 例如 strcpy (str3,str1)
(3)连接操作 :strcat (s1,s2) ; 操作结果:将字符串s2连接 在s1的后面,s2不改变。
例如:substr(str1, str3,5,3),则str3="bin"
再例如:substr(str1, str3,14,3),则str3=NULL
(6)子串定位 strindex(s,t);找子串t在主串s中首次出 现的位置
操作结果:若t∈s,则操作返回t在s中首次出现的位置, 否则返回值为-1。
串的链式存储结构简称为链串。其结点数据域为单个
子串的位置:子串在主串中首次出现时,该子串的 首字符对应主串的序号称为子串在主串中的位置。
例如,设A和B分别为
A="This is a string”,B ="is“
则B是A的子串,A为主串。且位置是3。
4页
2020/9/19
数据结构(C语言版)
第5章 串
特别规定,空串是任意串的子串,任意串是其自身 的子串。 串相等:两个串相等,是指两个串的长度相等且对 应字符都相同。
数据结构 第四章 串

第四章串串又称字符串,是一种特殊的线性表,它的每个元素仅由一个字符组成。
计算机上非数值处理的对象基本上是字符串数据。
在较早的程序设计语言中,字符串仅作为输入和输出的常量出现。
随着计算机应用的发展,在越来越多的程序设计语言中,字符串也可作为一种变量类型出现,并产生了一系列字符串的操作。
在信息检索系统、文字编辑程序、自然语言翻译系统等等应用中,都是以字符串数据作为处理对象的。
本章将讨论串的存储结构和基本操作。
4.1 串的基本概念4.1.1 串的自然语言定义串(string)(或字符串)是由零个或多个字符组成的有限序列,一般记为:S="a1 a2 …… a n" (n≥0)其中,S是串名,用双引号括起来的字符串序列是串的值;a i(1≤i≤n)可以是字母、数字或其他字符;串中字符的个数n称为串的长度。
长度为0的串称为空串。
需要注意的是,串值必须用一对双引号括起来,但双引号本身不属于串,它的作用只是为了避免与变量名或数的常量混淆。
如"tempt"是个串,tempt则是变量名;"23"是串,而23则是一个常量.串中任意个连续的字符组成的子序列称为该串的子串,如:串S="This is a string",其中"This"是一个子串,"string"也是一个子串。
求子串在串中的起始位置称为子串定位或模式匹配。
例如,设A,B,C为如下三个串:A="data",B="structure",C="data structure",则它们的长度分别是4,9,14,A和B都是C的子串,A在C中的位置是1,而B在C中的位置是6。
下面注意区别空格串与空串的概念。
在各种应用中,空格常常是串的字符集合中的一个元素,因而可以出现在其他字符中间。
由一个或多个空格组成的串称为空格串,也就是说空格串中只有空格字符,空格串的长度不为零。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
r->next=q;
r=q;
p=p->next;
}
for(k=0;k<j;k++)
p=p->next;
while(p!=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
returnstr;
}
///将串s的第i个字符开始的j个字符串替换成串t产生新串
LiString*RepStr(LiString*s,inti,intj,LiString*t)
{
intk;
LiString*str,*p=s->next,*p1=t->next,*q,*r;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
}
///判断串s和t是否相同
intStrEqual(LiString*s,LiString*t)
{
LiString*p=s->next,*q=t->next;
while(p!=NULL&&q!=NULL&&p->data==q->data)
printf("(1)建立串s和串s1\n");
StrAssign(s,"abcdefghefghijklmn");
StrAssign(s1,"xyz");
printf("(2)输出串s:");DispStr(s);
printf("(3)串s的长度:%d\n",StrLength(s));
printf("(4)在串s的第9个位置插入串s1而产生串s2\n");
}
returnstr;
}
///删除串s的第i个字符开始的j个字符产生新串
LiString*DelStr(LiString*s,inti,intj)
{
intk;
LiString*str,*p=s->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
str->next=NULL;
s->next=NULL;
r=s;
for(i=0;t[i]!='\0';i++)
{
p=(LiString*)malloc(sizeof(LiString));
p->data=t[i];
p->next=NULL;
r->next=p;
r=p;
}
}
///将串t复制到串s
voidStrCopy(LiString*&s,LiString*t)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
returnstr;
}
///由串s的第i个字符开始的j个字符产生新串
LiString*SubStr(LiString*s,inti,intj)
r->next=q;
r=q;
p1=p1->next;
}
while(p!=NULL) ///将*p及其后的结点复制到str
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=பைடு நூலகம்->next;
while(p!=NULL) ///将s的所有节点复制到str
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
p=t->next;
while(p!=NULL) ///将t的所有节点复制到str
str=(LiString*)malloc(sizeof(LiString));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
{
printf("参数不正确!\n");
returnstr;
}
for(k=0;k<i-1;k++)
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
{
printf("参数不正确!\n");
returnstr;
}
for(k=0;k<i-1;k++)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
q->data=p1->data;
q->next=NULL;
r->next=q;
r=q;
p1=p1->next;
}
while(p!=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
s2=RepStr(s,2,5,s1);
printf("(9)输出串s2:");DispStr(s2);
printf("(10)提取串s的第2个字符开始的10个字符而产生串s3\n");
s3=SubStr(s,2,10);
printf("(11)输出串s3:");DispStr(s3);
printf("(12)将串s1和串s2连接起来而产生串s4\n");
#include <stdio.h>
#include <malloc.h>
typedefstructsnode
{
chardata;
structsnode*next;
}LiString;
voidStrAssign(LiString*&s,chart[])
{
inti;
LiString*r,*p;
s=(LiString*)malloc(sizeof(LiString));
}
returni;
}
///将串t接到s后
LiString*Concat(LiString*s,LiString*t)
{
LiString*str,*p=s->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
str->next=NULL;r=str;
{
LiString*p=t->next,*q,*r;
s=(LiString*)malloc(sizeof(LiString));
s->next=NULL;
s->next=NULL;
r=s;
while(p!=NULL)
{
q=(LiString*)malloc(sizeof(LiString));
q->data=p->data;
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)+1)
{
printf("参数不正确!\n");
returnstr;
}
for(k=1;k<i;k++) ///将s的前i个结点复制到str
{
q=(LiString*)malloc(sizeof(LiString));
r=q;
p=p->next;
}
returnstr;
}
///将串t插入到串s的第i个位置
LiString*InsStr(LiString*s,inti,LiString*t)
{
intk;
LiString*str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString*)malloc(sizeof(LiString));
s4=Concat(s1,s2);
printf("(13)输出串s4:");DispStr(s4);
return0;
}
p=p->next;
}
returnstr;
}
///输出串s的所有元素
voidDispStr(LiString*s)
{
LiString*p=s->next;
while(p!=NULL)
{
printf("%c",p->data);