数据结构-串的查找与替换不会源程序
数据结构第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)
串-数据结构实验报告

三、.实习题 1. 将上述实例打入计算机,调试运行。 字符串常量的提供有多种手段。可以在定义串类型同时初始化串 值: char t[]="abc",*v="%%%"; 还可以使用语句gets(s)进行输入;也可以用scanf("%s",s)进行输入。 请你试着用不同的方法修改、调试、运行程序。 【源程序】: #include <stdio.h> #include <string.h> #include<stdlib.h> int index(char *s, char *t,int pos); void replace(char *s,char *t,char *v); void main() //主函数 { char *s,t[]="abc",*v="%%%"; s=(char *)malloc(100*sizeof(char)); printf("\n s=?"); scanf("%s",s); printf("\n s=%s\n",s); printf("\n t=%s v=%s\n",t,v); replace(s,t,v); /* 调用串置换函数 */ printf("\n\n new string=%s\n",s);
} end_main /* 串的置换,将主串s中的t串,置换为v串 */ void replace(char *s,char *t,char *v) { int i,j,k,po,sl,tl; sl=strlen(s); tl=strlen(t); printf("\n sl=%d tl=%d\n",sl,tl); po=0; while( po< sl-tl+1) { k=index(s,t,po); /* 调用串匹配函数 */ printf("\n k=%2d",k); if(k==-1) break; i=k-1; for(j=0;j<=tl-1;j++) { s[i]=v[j];i++;} po=k+tl; printf(" pos=%2d",po); } } /* replace */ /* 串匹配函数 */ /* 从主串s的第pos个字符开始查找子串t,函数结果是子串t在主 串s的pos开始之后首次出现的位置 */ int index(char *s, char *t, int pos) {int i,j,sl,tl; i=pos; j=1; sl=strlen(s); tl=strlen(t); while(i<=sl && j<=tl) if(s[i-1]==t[j-1]) {i++; j++; } else { i=i-j+1+1; j=1;} if(j>tl) return(i-tl); else return(-1); } /* index */ 程序运行截图如下
《数据结构与算法(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 算法。
数据结构

复杂性的阶
例如 W1(n)=n2 W2(n)=25*n
很显然,当输入尺寸n<25时, W1算法较之W2算法快;若n≥25时正好相反。 算法分析考虑一般情况n→∞。当n>n0时,如果存在正的常数C( 即考虑除基 本运算外所必须的附加操作),使得W1(n)≤C*W2(n),则我们称W1较之W2是 低阶的或同阶的;如果同样也有W2较之W1是低阶的或同阶的,则称W1与W2 是同阶的。例如W1(n)= 和W2=370*n2是同阶的。由此看出两个最坏情况分 析之间相差常数因子,则它们是同阶的。如果一个问题有多种算法,我们首 先寻求低阶的算法,然后再来解决那些可以减少工作量但不影响阶的细节问 题。
在一维数组中找X
实数矩阵相乘 排序 图的运算
输入尺寸
问 题 输 入 尺 寸
数组元素个数n 在一维数组中找X
实数矩阵相乘
排序
矩阵的阶n*m
表元素个数n
图的运算
顶点数n,边数m
输入情况
同一个算法,可以从不同的输入情况讨论它的复杂性。但由于情况太多, 讨论起来很复杂。于是,对每一种算法均从两种情况来讨论它的复杂性:
for j:=1 to 100 do
begin tax←a[i,j]-3200/12; int←irate[j]/365/12-i; b←tax/3*4; end;
end;{for}
尽可能在编译时赋值
编译时分配某一存储单元给某变量,同时立即赋上值,增加不 了多少编译时间, 却节省了目标码执行时间。
const C1=3200/12; MC=365*12; C2=4/3; begin … begin for i:=1 to 100 do for j:=1 to 100 do begin tax←a[i,j]-C1;int←irate[j]/MC-i; b←C2*tax; end;
数据结构(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个最长重复子串 及其位置。
parse()函数

parse()函数parse()函数是一种在计算机程序中进行字符串解析和转换的功能。
其功能是将字符串数据解析为程序所需要的数据类型或格式,并执行一些操作,例如查找和替换特定的字符串,将数据转换为另一种格式或生成新的数据结构。
通常情况下,程序需要从用户输入或其他数据来源中获取数据,而这些数据通常是以字符串的形式提供的。
然而,程序需要对这些字符串进行解析和转换才能处理它们。
这就是parse()函数的作用,它可以将字符串数据转换为数字、日期、时间、布尔值等数值类型,或者将其转换为数组、对象等复杂数据结构。
接下来,我们将介绍parse()函数在不同编程语言中的用法和功能。
Python语言中的parse()函数在Python语言中,常见的字符串解析功能可以使用内置的字符串方法来实现,例如split()和replace()函数。
然而,在某些情况下,程序需要更高级的字符串解析功能,例如解析日期和时间字符串。
这时,可以使用Python内置的dateutil库中的parse()函数。
dateutil库是一个用于处理日期和时间的Python库,其中的parse()函数可以解析字符串表示的日期和时间,并将其转换为Python 内置的datetime对象。
例如,以下代码展示了如何解析一个日期字符串,并将其转换为datetime对象:import dateutil.parser as parserdate_str = "2022-10-17"date_obj = parser.parse(date_str)print(date_obj)#输出:2022-10-17 00:00:00在以上代码中,我们首先导入dateutil库中的parser模块,然后定义了一个日期字符串date_str。
接着,我们通过调用parse()函数将日期字符串解析为datetime对象,并将其保存到date_obj变量中。
最后,我们使用print()函数将datetime对象输出到控制台。
2022年安徽农业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年安徽农业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、下述文件中适合于磁带存储的是()。
A.顺序文件B.索引文件C.哈希文件D.多关键字文件2、无向图G=(V,E),其中:V={a,b,c,d,e,f},E={(a,b),(a, e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进行深度优先遍历,得到的顶点序列正确的是()。
A.a,b,e,c,d,fB.a,c,f,e,b,dC.a,e,b,c,f, dD.a,e,d,f,c,b3、链表不具有的特点是()。
A.插入、删除不需要移动元素B.可随机访问任一元素C.不必事先估计存储空间D.所需空间与线性长度成正比4、已知串S='aaab',其next数组值为()。
A.0123B.1123C.1231D.12115、已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7}, E={<V1,V2>,<V1,V3>,<V1,V4>,<V2,V5>,<V3,V5>, <V3,V6>,<V4,V6>,<V5,V7>,<V6,V7>},G的拓扑序列是()。
A.V1,V3,V4,V6,V2,V5,V7B.V1,V3,V2,V6,V4,V5,V7C.V1,V3,V5,V2,V6,V7D.V1,V2,V5,V3,V4,V6,V76、下列关于无向连通图特性的叙述中,正确的是()。
Ⅰ.所有的顶点的度之和为偶数Ⅱ.边数大于顶点个数减1 Ⅲ.至少有一个顶点的度为1A.只有Ⅰ B.只有Ⅱ C.Ⅰ和Ⅱ D.Ⅰ和Ⅲ7、下列选项中,不能构成折半查找中关键字比较序列的是()。
A.500,200,450,180 B.500,450,200,180C.180,500,200,450 D.180,200,500,4508、已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为()。
数据结构4

S4连接S1,结果‘QRSTUVWXYZ’,S1全部被截断。
Data Structure
2013-6-27
Page 14
Status Concat(SString &T,SString S1,SString S2){
// 以T返回由S1和S2联接而成的新串,若未截断,返回TRUE,否则FALSE If(S1[0]+S2[0]<=MAXSTRLEN){ //未截断
2013-6-27
Page 23
基础知识题
简述空串和空格串(或称空格符串)的区别。 设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), Replace(s, 'STUDENT',q), Concat(SubString(s,6,2),Concat(t,SubString(s,7,8)))
if ( pos<1 || pos>s[0] || len<0 || len > s[0]-pos+1) return ERROR;
Sub[1..len] = S[pos..pos+len-1];
Sub[0] = len; return OK; } // SubString
Data Structure
Data Structure 2013-6-27 Page 7
DestroyString (&S) 初始条件:串 S 存在。 操作结果:串 S 被销毁。 StrEmpty (S) 初始条件:串 S 存在。 操作结果:若 S 为空串,则返回 TRUE,否则返回 FALSE。 StrCompare (S, T) 初始条件:串 S 和 T 存在。 操作结果:若S>T,则返回值>0;若S=T,则返回值=0;若 S<T,则返回值<0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计
———串的查找与替换、
目录
(一)设计思路 (1)
(二)问题描述 (1)
(三)内容要求 (1)
(四)设计目的 (1)
(五)设计实现 (5)
(六)设计调试 (10)
(七)设计总结 (15)
(八)参考文献 (15)
(一)设计目的
数据结构课程设计的目的是:通过设计掌握数据结构课程中学到的基本理论和算法并综合运用于解决实际问题中,它是理论与实践相结合的重要过程。
设计要求会如何对实际问题定义相关数据结构,并采用恰当的设计方法和算法解决问题,同时训练学生进行复杂程序设计的技能和培养良好的程序设计习惯。
(二)问题描述:
打开一篇英文文章,在该文章中找出所有给定的单词,然后对所有给定的单词替换为另外一个单词,再存盘。
(三)内容要求:
1.根据题目要求进行需求分析,分析出该项任务的主要功能和设计重点。
2.根据需求分析的内容划分模块
3.进行程序设计
(四)设计思路
计算机上的非数值处理的对象基本上上字符串数据,字符串一般简称为串。
串(string)是由零个或多个字符组成的有限序列,一般记为s=`a1a2…an`(n 大于零)。
通常称字符在序列中的序号为该字符在串中的位置,子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。
当两个串的每个字符都相等时(串值相等),称这两个串是相等的。
在子串的查找定位过程中,分别利用计数指针j和k指示被替换串和替换串中当前正待比较的字符位置。
所用算法的基本思想是:首先利用指针i来完成被替换串和替换串在文本中的遍历,从被替换串和替换串的第一个字符起进行比较,若相等则继续逐个比较后续字符;否则完成一次比较,指针i递增进行下一次的比较。
以此类推,直至匹配成功。
现根据问题描述作如下分析:
首先利用标准库函数fopen()打开一个文件,然后从文件中读取字符串保
存到数组中,完成文件的读入。
其次,根据键盘输入的选择命令(数字1~4)程序调用不同功能模块来完成相应的操作。
本设计所采用的数据结构
char String[65535]; //长度要大于输入文本文件的长度!
char findString[50]; //输入的要查找的字符
char replaceString[50]; //输入的替换后的string
程序中各部分功能函数:
void InitStr()/*从文件初始化数组*/;
void InputReplaceChar()/*输入要替换的字符串*/;
int FindString()/*查找第一个出现要查找字符的下标*/;
void FindStrings()/*查看文章中共有多少个要查找的字符*/;
void Insert(char source[],int index,char target[])/*从指定的下标开始插入target数组中的元素*/;
void Replace()/*将String中要替换的内容替换掉*/;
void Save()/*保存修改后的文章信息*/;
void Menu()/*程序主菜单*/。
程序中用户选择命令(数字1~4)设置:
“1”:文本文件显示;
“2”:子串查找;
“3”:子串替换;
“4”:退出整个程序。
程序设计流程图如图(一)所示:
否
图(一)程序流程图
程序运行后显示主菜单,提示用户根据需要选择不同的命令操作。
程序根据键盘输入的选择命令(数字1~4)调用不同功能模块来完成相应的操作。
如果用户输入的命令是“1”,主函数调用InitStr()函数从文件进行初始化数组,利用标准输入函数将该数组输出到标准输出上;如果用户输入的命令是“2”,主函数调用FindStrings()函数查找匹配的字符串并连同匹配的字符串个数一并输出到标准输出上;如果用户输入的命令是“3”,主函数调用Replace()函数,将String中要替换的内容替换掉;如果用户输入的命令是“4”,程序自动退出。
(五)设计实现
程序中所用数据结构定义:
char String[65535]; //长度要大于输入文本文件的长度!
char findString[50]; //输入的要查找的字符
char replaceString[50]; //输入的替换后的string
Replace();
break;
case 4:// “4”:退出整个程序
Save();
exit(0);
default:
printf("\n输入错误!\n");
printf("按任意键返回.....\n");
getchar();
} } }
(六)设计调试
程序的开发与调试均在Microsoft Visual C++环境下进行。
首先程序运行后显示程序的主菜单,主菜单命令选择设置“1”:文本文件显示;“2”:子串查找;“3”:子串替换;“4”:退出整个程序。
程序根据用户输入的命令(数字1~4)进行相应的操作。
主菜单显示如图(二):
图(二)程序主菜单
在程序主菜单中任意输入命令进行测试。
输入命令一,如图(三):
图(三)程序主菜单命令输入一
输入命令一后程序的运行结果:显示文本文件的内容。
如图(四):
图(四)程序命令一的运行结果
输入命令二后程序的运行结果:选择命令二,进行字符串的查找测试。
从图(六)中可以看到查找后的结果。
图中显示出查找到的字符串getchar的数量为3个,并显示查找成功等信息。
如图(五)、(六):
图(五)程序命令二字符串查找
图(六)程序命令二字符串查找
输入命令三后程序的运行结果:选择命令三,进行字符串的替换测试。
从图(八)中可以看到替换后的结果。
图中显示出被替换的字符串getchar和替换后的字符串charget,并显示替换成功等信息。
如图(七)、(八):
图(七)程序命令三字符串替换
图(八)程序命令三字符串替换
再次输入命令一查看命令三是否真正替换成功:从图(九)中可以看到替换后的结果,在图中鼠标箭头所指的方向看以看到原先文本文件(对比前面的程序测试图)中最后一行(当然,先前是查找到三个,这里只以最后一行容易观察到的来进行说明)的getchar()已经被替换成了charget(),说明程序替换成
功,并将替换后的文本文件进行了保存。
如图(九):
图(九)程序命令三字符串替换的验证
再次输入命令二进行字符串的查找测试,输入的字符串仍为先前查找过的getchar字符串,从图(十)中可以看到程序的运行结果(图中鼠标箭头所指的位置),共查找到0个getchar。
这是因为在上一步的字符串替换测试中已经将字符串getchar替换成了charget并保存了原始文本文件,所以在此处显示共查找到0个getchar。
图(十)程序命令二字符串查找的验证
最后输入命令四,测试程序是否能正常退出。
从图(十一)最后一行可以看到程序已经退出,DOS命令窗口正显示“Press any key to continue”来提示用户如何退出DOS命令窗口。
如图(十一):
图(十一)程序命令四程序退出命令验证
(七)设计总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节。
数据结构是程序设计的基本算法,经过这次数据结构的课程设计对于实际应用数据结构有很大帮助,尤其是对于串的学习上。
在数据结构课程的学习及其课程设计中要感谢杨老师的悉心教导以及研究生师姐在实验课上的指导。
(八)参考文献:
《数据结构(C语言版)》严蔚敏吴伟民清华大学出版社
《数据结构实践指导教程》阮宏一华中科技大学出版社。