C语言数据结构 串的基本操作

合集下载

实验三串基本操作的编程实现

实验三串基本操作的编程实现

实验三串基本操作的编程实现引言:串是由零个或多个字符组成的有限序列,是一种非常基础也非常重要的数据结构。

在本实验中,我们将学习串的基本操作,并使用C语言来实现这些操作。

1.实验目的:-掌握串的基本操作,包括串的初始化、判空、求长度、复制和拼接等操作;-学会使用C语言编程实现串的基本操作。

2.实验内容:本实验主要包括以下几个串的基本操作的编程实现。

2.1串的初始化操作在C语言中,我们可以使用字符数组来表示一个串。

以下是一个串的初始化操作的实现代码:```c#include <stdio.h>void InitString(char s[], char str[])int i;for (i = 0; str[i] != '\0'; i++)s[i] = str[i];}s[i]='\0';int maichar s[20];char str[] = "Hello, World!";InitString(s, str);printf("Initialized string: %s\n", s);return 0;```2.2串的判空操作判空操作即判断一个串是否为空串。

如果一个串的长度为0,则表示该串为空串。

以下是一个判空操作的实现代码示例:```c#include <stdio.h>#include <stdbool.h>bool IsEmptyString(char s[])return s[0] == '\0';int maichar s[20] = ""; // 空串if (IsEmptyString(s))printf("The string is empty.\n");} elseprintf("The string is not empty.\n");}return 0;```2.3串的长度操作求串的长度,即求一个串中字符的个数。

串的基本操作范文

串的基本操作范文

串的基本操作范文串是一种常见且重要的数据结构,其由一个个字符组成的有序序列。

本文就串的基本操作进行详细介绍,包括串的定义、串的表示方法、串的操作等内容。

一、串的定义串是由零个或多个字符组成的有序序列,其中字符的数目称为串的长度。

串是一种线性结构,通常用于表示文本或字符串。

二、串的表示方法1. 静态数组表示:利用C/C++等编程语言中的字符数组来表示串。

例如,“Hello”可以表示为一个字符数组char str[6] = "Hello",其中str[0]='H',str[1]='e',依此类推。

2. 动态数组表示:利用动态内存分配来创建存储串的数组。

例如,在C++中可以使用string类来表示串。

3.链表表示:采用链表的方式来表示串,每个节点存储一个字符,并用指针链接起来。

三、串的基本操作串具有以下基本操作:1. 求串的长度:即求出串中字符的个数,常用的函数有strlen(,可以直接调用。

例如,strlen("Hello")将返回5,表示串的长度为52. 求子串:从串中截取一个子串。

常用的函数有substr(等。

例如,substr("Hello World", 6, 5)将返回"World",表示从原串中的第6个字符开始,截取长度为5的子串。

3. 拼接串:将两个串拼接起来得到一个新的串。

常用的函数有strcat(,可以直接调用。

例如,strcat("Hello", " World")将返回"Hello World",表示将第二个串拼接到第一个串的末尾。

4. 比较串:判断两个串是否相等。

常用的函数有strcmp(,可以直接调用。

例如,strcmp("Hello", "Hello")将返回0,表示两个串相等。

数据结构(C语言版)_第3章 串与数组

数据结构(C语言版)_第3章 串与数组
typedef struct lnode {
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个最长重复子串 及其位置。

串的知识点总结

串的知识点总结

串的知识点总结1. 串的基本概念串是由零个或多个字符组成的有限序列,通常用来表示文本数据。

在编程语言中,串通常被定义为一个字符数组或字符串变量。

例如,在C语言中,字符串通常被定义为char类型的数组,而在Java语言中,字符串则是一个类对象。

2. 串的存储结构串的存储结构有两种常见形式:一是定长顺序存储结构,二是链式存储结构。

定长顺序存储结构是将串的字符按照顺序存储在一块连续的存储空间中,这种方式可以通过下标来访问任意位置的字符,但是需要预先分配足够的存储空间。

链式存储结构则是使用链表来存储串的字符,这种方式可以动态分配内存空间,但是访问任意位置的字符需要从链表头开始遍历,效率较低。

3. 串的基本操作串的基本操作包括串的创建、复制、连接、比较、插入和删除等。

创建串是指将一组字符转换成串的操作;复制是指将一个串的内容复制到另一个串中;连接是指将两个串连接在一起形成一个新的串;比较是指比较两个串的大小关系;插入是指在一个串中的指定位置插入一个子串;删除是指删除一个串中的指定子串。

这些操作都是串的基本操作,它们在实际应用中有着重要的作用。

4. 串的模式匹配串的模式匹配是指在一个主串中查找与给定模式串相匹配的子串的过程。

常见的模式匹配算法有暴力匹配算法、KMP算法和Boyer-Moore算法等。

暴力匹配算法是最简单的模式匹配算法,它的时间复杂度为O(m*n),其中m为主串长度,n为模式串长度;KMP算法是一种高效的模式匹配算法,它的时间复杂度为O(m+n),其中m为主串长度,n为模式串长度;Boyer-Moore算法是一种更加高效的模式匹配算法,它的时间复杂度为O(m*n),其中m为主串长度,n为模式串长度。

5. 串的应用串在计算机科学中有着广泛的应用,它在各种应用中都有着重要的作用。

例如,在文本编辑器中,串被用来表示文本文件的内容;在数据库系统中,串被用来表示数据的各种属性;在网络通信中,串被用来表示网页的URL地址等。

c语言描述-串的基本操作

c语言描述-串的基本操作

c语⾔描述-串的基本操作串的定长顺序存储(部分代码)连接两个串:串的第⼀个空间存储串长#define MIXSIZE 100typedef int Status;typedef char SString[MIXSIZE+1];Status Concat(SString *s3,SString s1,SString s2){if(s1[0]+s2[0]<=MIXSIZE){printf("fgsd\n");for(int i=1;i<=s1[0];i++){*s3[i]=s1[i];}for(int i=s1[0]+1;i<s1[0]+s2[0];i++){*s3[i]=s2[0];}*s3[0]=s1[0]+s2[0];return TRUE;}else if(s1[0]<MIXSIZE&&(s1[0]+s2[0]>MIXSIZE)){printf("fgsd\n");for(int i=1;i<=s1[0];i++){*s3[i]=s1[i];}for(int i=s1[0]+1,j=1;(void)(i<=MIXSIZE),j<=MIXSIZE-s1[0];j++,i++){*s3[i]=s2[j];}*s3[0]=MIXSIZE;return FALSE;}else{for(int i=1;i<=MIXSIZE;i++){*s3[i]=s1[i];}*s3[0]=MIXSIZE;return FALSE;}}求⼦串:void SubString(SString *s3,SString s1,int pos,int len){if(pos<1||len>s1[0]||len<0||len>s1[0]-pos+1)printf("⾮法操作!\n");for(int i=1,j=pos;(void)(i<len),j<pos+len-1;i++,j++){*s3[i]=s1[j];}*s3[0]=len;}串的堆分配存储表⽰#include<stdio.h>#include <stdlib.h>#include<string.h>typedef struct{char *ch;int length;}HString;//将字符串chars复制到字符串T中void StrAssign(HString *T,char *chars){int len = 0;while(*(chars+len)!='\0') //计算串的长度{len++;}if(len==0) //串chars为空的情况{T->ch=NULL;T->length=0;}else{T->ch=(char *)malloc(len * sizeof(char));for(int i=0;i<len;i++){T->ch[i]=*(chars+i);}T->length=len;}}//打印串T元素void Print_str(HString *T ){int i=0;while(i<T->length){printf("%c",T->ch[i++]);}printf("\n");}//返回串长度int StrLength(HString *T){return T->length;}//⽐较两串int StrCompare(HString *T,HString *S ){int i;if(T->length!=S->length){if(T->length>S->length){printf("字符串不等,s1的长度⼤于s2\n");return 1;}else{printf("字符串不等,s1的长度⼩于s2\n");return -1;}}else{for(i=0;i<T->length;i++){if(T->ch[i]>S->ch[i]){printf("长度相等,但s1>s2\n");return 1;}else if(T->ch[i]<S->ch[i]){printf("长度相等,但s1>s2\n");return -1;}}printf("字符串相等\n");return 0;}}//连接两的字符串void Concat(HString *T,HString *s1,HString *s2){T->ch=(char *)malloc((s1->length+s2->length)*sizeof(char)); if(!T->ch)exit(0);for(int i=0;i<s1->length;i++)T->ch[i]=s1->ch[i];}for(int i=s1->length,j=0;i<s1->length+s2->length;i++,j++) {T->ch[i]=s2->ch[j];}T->length=s1->length+s2->length;}//求⼦串void SubString(HString *T,HString *S,int pos,int len){T->ch=(char *)malloc(len*sizeof(char));if(!T->ch)exit(0);for(int i=pos-1,j=0;i<pos+len;i++,j++){T->ch[j]=S->ch[i];}T->length=len;}//清空串void ClearString(HString *T ){if(T->ch){free(T->ch);T->ch=NULL;}T->length=0;}//主函数,可对函数进⾏测试int main(){char s1[100];char s2[100];printf(" 请输⼊字符串s1:\n");gets(s1);printf("请输⼊字符串s2:\n");gets(s2);HString S,S1,S2,*p,*p1,*p2;p=&S; p1=&S1; p2=&S2;StrAssign(p1, s1);//StrAssign(p2, s2);//StrCompare(p1, p2);//Concat(p, p1, p2);//SubString(p, p1, 2, 4);//Print_str(p1);//ClearString(p1);//Print_str(p1);}串的模式匹配算法1、传统算法int Index(HString *T,HString *S, int pos){int j=0;while(pos<T->length&&j<S->length){if(T->ch[pos]==S->ch[j]){pos++;j++;}else{pos=pos-j+2;j=1;}}if(j>=S->length){int len;len=pos-S->length+1;printf("%d",len);return len;}else{return 0;}。

数据结构串的基本操作

数据结构串的基本操作

串的生成(StrAssign)、串的比较(StrCompare)、串的联接(StrCombine)、求串的长度(StrLength)和求串的子串(StrSub)这5个操作构成的集合为OperationSet中的最小操作子集。

#include <stdio.h>#include <stdlib.h>#define MaxSize 100typedef struct{char data[MaxSize];int len;}SqString;void StrAssign(SqString &str,char cstr[]){int i;for (i=0;cstr[i]!='\0';i++)str.data[i]=cstr[i];str.len=i;}SqString StrCombine(SqString s,SqString t){SqString str;int i;str.len=s.len+t.len;for (i=0;i<s.len;i++)str.data[i]=s.data[i];for (i=0;i<t.len;i++)str.data[s.len+i]=t.data[i];return str;}SqString SubStr(SqString s,int i,int j){SqString str;int k;str.len=0;if(i<=0 || i>s.len || j<0 || i+j-1>s.len){printf("参数不正确\n");return str;}for(k=i-1;k<i+j-1;k++)str.data[k-i+1]=s.data[k];str.len=j;return str;}int StrCompare(SqString s,SqString t){int same=1,i;if (s.len!=t.len)same=0;elsefor (i=0;i<s.len;i++)if (s.data[i]!=t.data[i]){same=0;break;}return same;}SqString RepStr(SqString s,int i,int j,SqString t) {int k;SqString str;str.len=0;if (i<=0 || i>s.len || i+j-1>s.len){printf("参数不正确\n");return str;}for (k=0;k<i-1;k++)str.data[k]=s.data[k];for (k=0;k<t.len;k++)str.data[i+k-1]=t.data[k];for (k=i+j-1;k<s.len;k++)str.data[t.len+k-j]=s.data[k];str.len=s.len-j+t.len;return str;}int StrLength(SqString s){return s.len;}void ShowS(SqString s){int i;if (s.len>0){for (i=0;i<s.len;i++)printf("%c",s.data[i]);printf("\n");}}int main(){SqString s,s1,s2,s3,s4,s5;printf("--------------开始字符串的操作-------------\n");printf("建立串S和S1\n");StrAssign(s,"makesuccess");StrAssign(s1,"you");printf("输出串S\n");ShowS(s);printf("输出串S1\n");ShowS(s1);printf("输出串S的长度\n");printf("%d\n",StrLength(s));printf("输出串S1的长度\n");printf("%d\n",StrLength(s1));printf("提取串S的第2个字符开始的3个字符而生成串S2\n");s2 = SubStr(s,2,3);printf("输出串S2\n");ShowS(s2);printf("将串S1和S2连接起来而生成串S3\n");s3 = StrCombine(s1,s2);printf("输出串S3\n");ShowS(s3);printf("将串S的第4个字符开始的3个字符替换成串S1而生成串S4\n");s4 = RepStr(s,4,3,s1);printf("输出串S4\n");ShowS(s4);printf("串S4的长度\n");printf("%d\n",StrLength(s4));printf("提取串S4的第5个字符开始的4个字符而生成串S5\n");s5 = SubStr(s4,5,4);printf("输出串S5\n");ShowS(s5);printf("---------------字符串的操作完成-------------\n");return 0;}。

数据结构(C语言版CHAP4

数据结构(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语言进行编程,需要在计算机上安装相应的开发环境,如GCC编译器等。

三、实验内容1. 串的初始化串的初始化是指将一个空串创建出来,并为其分配内存空间。

在实验中,可以使用字符数组来表示串,并通过赋值操作将空串初始化。

2. 串的插入串的插入是指在指定位置插入一个或多个字符。

在实验中,可以通过遍历数组,将插入位置之后的字符依次后移,然后将待插入的字符放入指定位置。

3. 串的删除串的删除是指删除指定位置的一个或多个字符。

在实验中,可以通过遍历数组,将删除位置之后的字符依次前移,覆盖待删除的字符。

4. 串的查找串的查找是指在串中查找指定字符或子串,并返回其位置。

在实验中,可以通过遍历数组,逐个比较字符或子串,找到匹配的位置。

五、实验步骤1. 初始化串首先,创建一个字符数组,并将其初始化为空串。

2. 插入字符在指定位置插入一个字符,可以通过遍历数组,将插入位置之后的字符依次后移,然后将待插入的字符放入指定位置。

3. 删除字符删除指定位置的一个字符,可以通过遍历数组,将删除位置之后的字符依次前移,覆盖待删除的字符。

4. 查找字符在串中查找指定字符,可以通过遍历数组,逐个比较字符,找到匹配的位置。

六、实验结果经过实验,我们成功实现了串的初始化、插入、删除和查找等基本操作。

通过不断调试和优化,我们的程序能够高效地处理大量的字符操作,具有较好的性能和稳定性。

七、实验总结通过本次实验,我们深入理解了数据结构中串的原理和应用。

串的基本操作

串的基本操作

串得基本操作一、实验目得、意义(1)理解串得堆分配存储结构。

(2)理解用它们表示时插入,生成串,联接串与求子串得算法。

(3)根据具体问题得需要,能够设计出相关算法。

二、实验内容及要求说明1:学生在上机实验时,需要自己设计出所涉及到得函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应得输出作出分析;修改输入数据,预期输出并验证输出得结果,加深对有关算法得理解。

具体要求:定义串得堆分配存储,完成串得基本操作:插入,生成串,联接串,求子串等。

三、实验所涉及得知识点C语言算法、循环算法、串得堆分配存储结构、插入,生成串,联接串与求子串得算法。

四、实验结果及分析(所输入得数据及相应得运行结果,运行结果要有提示信息,运行结果采用截图方式给出。

)五、总结与体会(调试程序得心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。

)调试程序时,出现了许多错误、如:串得堆分配存储结构、串得联接等。

另外还有一些语法上得错误。

由于对所学知识点概念模糊,试验课上未能完成此次上机作业。

后来经过查阅教材,浏览网页等方式,才完成试验。

这次试验出现错误最重要得原因就就是对课本知识点理解不深刻以及编写代码时得粗心。

以后要都去练习、实践,以完善自己得不足。

六、程序清单(包含注释)#include 〈stdio、h>#include 〈malloc。

h〉#include <stdlib。

h〉typedef char Status;int strlen(char *p){inti=0;while(*p++)i++;return i;}typedef struct{ﻩchar *ch;ﻩ// 若就是非空串,则按串长分配存储区,否则ch为NULLint length; // 串长度}HString;// 初始化(产生空串)字符串Tvoid InitString(HString *T){(*T)。

length=0;ﻩ(*T)、ch=NULL;}//生成一个其值等于串常量chars得串TStatus StrAssign(HString *T, char *chars){ﻩint i,j;if((*T)。

顺序串的基本操作

顺序串的基本操作

《数据结构》实验#include<stdio.h>#include<string.h>#define maxnum 100typedef struct{char str[maxnum];int length;}SString;void creat(SString &s){printf("请输入主串s:\n");gets(s.str);s.length=strlen(s.str);}void Strcopy(SString &t,SString &f){int i;printf("请输入串f:\n");gets(f.str);f.length=strlen(f.str);for(i=0;i<f.length;i++){t.str[i]=f.str[i];}printf("字符串复制成功!\n");}int Strcompare(SString s,SString &t){ int i,j,k;i=0;j=0;printf("请输入要比较的串:\n");gets(t.str);t.length=strlen(t.str);while(i<s.length&&j<t.length){if(s.str[i]==t.str[i]){i++;j++;}else{return k=s.str[i]-t.str[i];}}if(j==t.length)return k=s.length-t.length;else i++;j++;return k;}void concat(SString &sub,SString s,SString &t){ int i,j;printf("请输入要联接的串:\n");gets(t.str);t.length=strlen(t.str);if(s.length+t.length<maxnum) {for(i=0;i<s.length;i++)sub.str[i]=s.str[i];for(j=0;j<t.length;j++)sub.str[j+s.length]=t.str[j]; sub.length=s.length+t.length; }else if(s.length<maxnum){for(i=0;i<s.length;i++)sub.str[i]=s.str[i];for(j=0;j<maxnum-s.length;j++) sub.str[j+s.length]=t.str[j]; sub.length=maxnum;}else{for(i=0;i<maxnum;i++)sub.str[i]=s.str[i];sub.length=maxnum;}}void Insert(SString &s,SString &t){ int i,j,k;t.length=strlen(t.str);printf("请输入要插入的位置:\n"); scanf("%d",&j);for(i=j-1;i<s.length;i++){s.str[i+t.length]=s.str[i];}for(k=0,i=j-1;i<j+t.length-1;i++) {s.str[i]=t.str[k];k++;}s.length+=t.length;printf("字符串插入成功:\n");}void Delete(SString &s){int i,j,len;printf("请输入要删除的位置:\n"); scanf("%d",&j);printf("请输入要删除串的长度:\n"); scanf("%d",&len);for(i=j-1+len;i<s.length;i++){s.str[i-len]=s.str[i];}s.length-=len;}void print(SString &s){int i;for(i=0;i<s.length;i++){printf("%c ",s.str[i]);}}void main(){SString s,a,b,c,d,e,f;int x;char y;creat(s);do{printf("请输入要操作的项:\n");printf("*****************************************\n");printf("* 2字符串的复制。

实现串的基本操作

实现串的基本操作

实现串的基本操作一、前言在计算机科学中,串(string)是由零个或多个字符组成的有限序列。

它是计算机科学中基本的数据结构之一,常用于文本处理和数据压缩等领域。

串的基本操作包括:串的创建、串的赋值、串的连接、串的比较、子串的提取、插入和删除等。

本文将详细介绍这些操作。

二、串的创建1. 静态创建静态创建是指在程序运行前就已经确定了字符串内容,并将其存储在静态存储区中。

这种方式通常用于存储不会发生变化的字符串,如程序中使用的提示信息等。

静态创建示例:char str[] = "Hello, world!";2. 动态创建动态创建是指在程序运行时根据需要动态分配内存空间来存储字符串。

这种方式通常用于存储需要动态改变的字符串,如用户输入的信息等。

动态创建示例:char *str = (char*)malloc(sizeof(char)*20);strcpy(str, "Hello, world!");三、串的赋值1. 直接赋值直接赋值是指将一个已有字符串直接赋给另一个字符串。

直接赋值示例:char str1[] = "Hello";char str2[10];str2 = str1;2. 字符数组赋值字符数组赋值是指将一个字符数组中的内容赋给另一个字符数组。

字符数组赋值示例:char str1[] = "Hello";char str2[10];strcpy(str2, str1);3. 指针赋值指针赋值是指将一个指向字符串的指针赋给另一个指向字符串的指针。

指针赋值示例:char *str1 = "Hello";char *str2;str2 = str1;四、串的连接串的连接是指将两个字符串合并为一个字符串。

串的连接示例:char str1[] = "Hello";char str2[] = ", world!";strcat(str1, str2);五、串的比较串的比较是指判断两个字符串是否相等。

串基本操作的编程实现

串基本操作的编程实现

串基本操作的编程实现串(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. 串的比较比较是指判断两个串是否相等。

数据结构的串操作

数据结构的串操作

数据结构的串操作数据结构的串操作
⒈概述
⑴串的定义
⑵串的基本操作
⒉串的存储结构
⑴顺序存储结构
⑵链式存储结构
⒊串的基本操作
⑴串的长度
⑵串的比较
⑶串的连接
⑷串的截取
⑸串的插入
⑹串的删除
⑺串的替换
⒋字符串匹配算法
⑴朴素模式匹配算法
⑵ KMP 算法
⑶ Boyer-Moore 算法
⑷ Rabin-Karp 算法
附件:
⒈示例代码
⒉数据集
法律名词及注释:
⒈串:在计算机科学中,串(String)是由零个或多个字符组成的有限序列。

⒉顺序存储结构:串的顺序存储结构是将串的字符按线性次序逐个存储在一组地址连续的存储单元里。

⒊链式存储结构:串的链式存储结构是通过定义一个节点类型来存储串的字符,每个节点包含一个字符和一个指向下一个节点的指针。

⒋朴素模式匹配算法:朴素模式匹配算法是最简单的字符串匹
配算法之一,通过对目标串的每个字符依次与模式串进行比较,直
到找到匹配的位置或遍历完所有字符。

⒌ KMP 算法:KMP 算法是一种高效的字符串匹配算法,通过利
用模式串的前缀和后缀信息,在匹配失败时将模式串移动比朴素算
法更远的位置,减少比较次数。

⒍ Boyer-Moore 算法:Boyer-Moore 算法是一种基于多种规则
的字符串匹配算法,通过从右到左比较模式串和目标串的字符,根
据不匹配字符在模式串中的位置和字符表进行移动,提高匹配效率。

⒎ Rabin-Karp 算法:Rabin-Karp 算法是一种利用哈希函数的
字符串匹配算法,通过计算目标串和模式串的哈希值,并逐个比较,减少比较次数。

数据结构(串)

数据结构(串)

数据结构(串)数据结构(串)数据结构中的串(String)是由字符构成的有限序列。

在计算机科学中,串是一种基本的数据结构,被广泛应用于字符串处理、文本搜索、模式匹配等领域。

1. 串的定义和基本操作串可以使用多种方式来定义和表示,常见的方式有:- 定长顺序存储表示:使用数组来存储串,数组的长度和最大串长相等,不足的部分用特定字符填充(通常用空格)。

- 堆分配存储表示:使用堆(动态内存分配区)来存储串,可以根据实际需要动态分配和释放串的存储空间。

- 串的块链存储表示:将串分成多个块,将每个块使用链表进行表示,将各块在一起组成完整的串。

串的基本操作包括:- 串的赋值:将一个串赋值给另一个串。

- 串的连接:将两个串按顺序连接成一个新的串。

- 串的比较:比较两个串的大小关系。

- 串的截取:从一个串中截取出一段子串。

- 串的插入:将一个串插入到另一个串的指定位置。

- 串的删除:删除一个串中指定位置的字符或一段子串。

- 串的替换:将一个串中指定位置的字符或一段子串替换成另一个串。

2. 串的匹配算法串的匹配是指在一个主串中查找一个模式串的过程。

常见的串匹配算法包括:- 朴素匹配算法:也称为暴力匹配算法,是最简单的匹配算法。

它从主串的第一个字符开始,与模式串逐个字符进行比较,若不匹配,则主串向后移动一位,直到找到匹配的子串或主串遍历完。

- KMP算法:即Knuth-Morris-Pratt算法,通过利用模式串自身的信息,减少字符的比较次数。

该算法具有线性时间复杂度,是一种高效的匹配算法。

- Boyer-Moore算法:基于模式串中的字符发生不匹配时的启发式策略,通过跳跃式地移动模式串,减少字符的比较次数,从而提高匹配效率。

3. 串的应用串作为一种基本的数据结构,在实际应用中具有广泛的用途,主要包括以下几个方面:- 字符串处理:串在文本编辑、编译器设计、语法分析、文件操作等方面都有广泛应用。

- 模式匹配:串的匹配算法常被用于字符串搜索、DNA序列分析、信息检索等领域。

数据结构串的实验报告

数据结构串的实验报告

一、实验目的1. 理解串的定义、性质和操作;2. 掌握串的基本操作,如串的创建、复制、连接、求子串、求逆序、求长度等;3. 熟练运用串的常用算法,如串的模式匹配算法(如KMP算法);4. 培养编程能力和算法设计能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 串的创建与初始化2. 串的复制3. 串的连接4. 串的求子串5. 串的求逆序6. 串的求长度7. 串的模式匹配算法(KMP算法)四、实验步骤1. 串的创建与初始化(1)创建一个串对象;(2)初始化串的长度;(3)初始化串的内容。

2. 串的复制(1)创建一个目标串对象;(2)使用复制构造函数将源串复制到目标串。

3. 串的连接(1)创建一个目标串对象;(2)使用连接函数将源串连接到目标串。

4. 串的求子串(1)创建一个目标串对象;(2)使用求子串函数从源串中提取子串。

5. 串的求逆序(1)创建一个目标串对象;(2)使用逆序函数将源串逆序。

6. 串的求长度(1)获取源串的长度。

7. 串的模式匹配算法(KMP算法)(1)创建一个模式串对象;(2)使用KMP算法在源串中查找模式串。

五、实验结果与分析1. 串的创建与初始化实验结果:成功创建了一个串对象,并初始化了其长度和内容。

2. 串的复制实验结果:成功将源串复制到目标串。

3. 串的连接实验结果:成功将源串连接到目标串。

4. 串的求子串实验结果:成功从源串中提取了子串。

5. 串的求逆序实验结果:成功将源串逆序。

6. 串的求长度实验结果:成功获取了源串的长度。

7. 串的模式匹配算法(KMP算法)实验结果:成功在源串中找到了模式串。

六、实验总结通过本次实验,我对串的定义、性质和操作有了更深入的了解,掌握了串的基本操作和常用算法。

在实验过程中,我遇到了一些问题,如KMP算法的编写和调试,但在老师和同学的指导下,我成功地解决了这些问题。

数据结构 串基本操作代码

数据结构 串基本操作代码

数据结构串基本操作代码简介本文档介绍了数据结构中串的基本操作代码,包括串的定义、串的赋值、串的比较、串的连接、串的替换等。

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`或者循环遍历比较。

数据结构串基本操作代码

数据结构串基本操作代码

数据结构串基本操作代码串是由零个或多个字符组成的有限序列,是数据结构中的一种基本数据类型。

常见的串操作有串的存储、串的插入、串的删除、串的替换、串的连接、串的比较等。

以下是对串基本操作的代码实现:1.串的存储串的存储可以使用数组或链表来实现。

下面是基于数组的实现方式。

```C++#define MAX_LEN 100 // 定义串的最大长度typedef structchar data[MAX_LEN]; // 存储串的字符数组int length; // 当前串的长度} String;//初始化串void InitString(String &s)s.length = 0;//串赋值void AssignString(String &s, char str[])int len = strlen(str);for (int i = 0; i < len; i++)s.data[i] = str[i];}s.length = len;//输出串void PrintString(String s)for (int i = 0; i < s.length; i++)cout << s.data[i];}cout << endl;```2.串的插入在指定位置上插入指定内容。

```C++//串的插入void InsertString(String &s, int pos, char str[]) int len = strlen(str);if (s.length + len > MAX_LEN)return; // 串已满,无法插入for (int i = s.length - 1; i >= pos; i--)s.data[i + len] = s.data[i];}for (int i = pos, j = 0; j < len; i++, j++)s.data[i] = str[j];}s.length += len;```3.串的删除删除指定位置上的字符。

串的定义及其基本运算

串的定义及其基本运算
例如操作前:s1="he",s2=" bei",
则操作结果是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章 串
特别规定,空串是任意串的子串,任意串是其自身 的子串。 串相等:两个串相等,是指两个串的长度相等且对 应字符都相同。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验九串的基本操作#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef char Status;int strlen(char *p){int i=0;while(*p++)i++;return i;}typedef struct{char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL int length; // 串长度}HString;// 初始化(产生空串)字符串Tvoid InitString(HString *T){(*T).length=0;(*T).ch=NULL;}// 生成一个其值等于串常量chars的串TStatus StrAssign(HString *T, char *chars){int i,j;if((*T).ch)free((*T).ch); // 释放T原有空间i = strlen(chars); // 求chars 的长度iif(!i){// chars的长度为0(*T).ch = NULL;(*T).length = 0;}else{// chars的长度不为0(*T).ch = (char*)malloc(i*sizeof(char)); // 分配串空间if(!(*T).ch) // 分配串空间失败exit(0);for(j = 0; j < i; j++) // 拷贝串(*T).ch[j] = chars[j];(*T).length = i;}return 1;}// 由串S复制得串Tint StrCopy(HString *T,HString S) {int i;if((*T).ch)free((*T).ch); // 释放T原有空间(*T).ch=(char*)malloc(S.lengt h*sizeof(char)); // 分配串空间if(!(*T).ch) // 分配串空间失败exit(0);for(i=0;i<S.length;i++) // 拷贝串(*T).ch[i]=S.ch[i];(*T).length=S.length;return 1;}// 若S为空串,则返回1,否则返回0 int StrEmpty(HString S){if(S.length == 0 && S.ch == NULL)return 1;elsereturn 0;}// 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0int StrCompare(HString S,HString T){int i;for(i=0;i<S.length && i<T.length;++i)if(S.ch[i] != T.ch[i])returnS.ch[i]-T.ch[i];return S.length-T.length;}// 返回S的元素个数,称为串的长度int StrLength(HString S){return S.length;}// 将S清为空串int ClearString(HString *S){if((*S).ch){free((*S).ch);(*S).ch=NULL;}(*S).length=0;return 1;}// 用T返回由S1和S2联接而成的新串int Concat(HString *T,HString S1,HString S2){int i;if((*T).ch)free((*T).ch); // 释放旧空间(*T).length=S1.length+S2.leng th;(*T).ch=(char*)malloc((*T).length*sizeof(char )); //分配新串的长度if(!(*T).ch)exit(0);for(i=0;i<S1.length;i++) //将S1接到新串T的后面(*T).ch[i]=S1.ch[i];for(i=0;i<S2.length;i++) //将S2接到新串T的后面(*T).ch[S1.length+i]=S2.ch[i] ;return 1;}// 用Sub返回串S的第pos个字符起长度为len的子串。

int SubString(HString *Sub, HString S,int pos,int len){int i;if(pos<1||pos>S.length||len<0 ||len>S.length-pos+1)return 0;if((*Sub).ch)free((*Sub).ch); // 释放旧空间if(!len) // 空子串{(*Sub).ch=NULL;(*Sub).length=0;}else{ // 完整子串(*Sub).ch=(char*)malloc(len*s izeof(char));if(!(*Sub).ch)exit(0);for(i=0;i<=len-1;i++)(*Sub).ch[i]=S.ch[pos-1+i];(*Sub).length=len;}return 1;}// T为非空串。

若主串S中第pos个字符之后存在与T相等的子串,// 则返回第一个这样的子串在S中的位置,否则返回0int Index(HString S,HString T,int pos){int n,m,i;HString sub;InitString(&sub);if(pos>0){n=StrLength(S);m=StrLength(T);i=pos;while(i<=n-m+1) //从第i 个位置开始求与T等长的子串,循环直到找到{SubString(&sub,S,i,m);//从第i个位置开始求得子串if(StrCompare(sub,T)!=0)//将求得的子串与T对比,若不等则i++++i;elsereturn i;}}return 0;}// 在串S的第pos个字符之前插入串Tsint StrInsert(HString *S,int pos,HString T){int i;if(pos<1||pos>(*S).length+1) // pos不合法return 0;if(T.length) // T非空,则重新分配空间,插入T{(*S).ch = (char*)realloc((*S).ch,((*S).length+T.length)*sizeof (char));if(!(*S).ch)exit(0);for(i=(*S).length-1;i>=pos-1; --i) // 为插入T而腾出位置(*S).ch[i+T.length]=(*S).ch[i ];for(i=0;i<T.length;i++)(*S).ch[pos-1+i]=T.ch[i]; // 插入T(*S).length+=T.length;}return 1;}// 从串S中删除第pos个字符起长度为len的子串int StrDelete(HString *S,int pos,int len){int i;if((*S).length<pos+len-1)exit(0);for(i=pos-1;i<=(*S).length-le n;i++)(*S).ch[i]=(*S).ch[i+len];(*S).length-=len;(*S).ch=(char*)realloc((*S).c h,(*S).length*sizeof(char));return 1;}// 用V替换主串S中出现的所有与T 相等的不重叠的子串int Replace(HString *S,HString T,HString V){int i=1; // 从串S的第一个字符起查找串Tif(StrEmpty(T)) // T是空串return 0;do{i=Index(*S,T,i); // 结果i 为从上一个i之后找到的子串T的位置if(i) // 串S中存在串T{StrDelete(S,i,StrLength(T)); // 删除该串TStrInsert(S,i,V); // 在原串T的位置插入串Vi+=StrLength(V); // 在插入的串V后面继续查找串T}}while(i);return 1;}void DestroyString(){// 堆分配类型的字符串无法销毁}// 输出T字符串void StrPrint(HString T){int i;for(i=0;i<T.length;i++)printf("%c",T.ch[i]);printf("\n");}int main(){int i;char c,*p="God bye!",*q="God luck!";HString t,s,r;// HString类型必需初始化InitString(&t);InitString(&s);InitString(&r);StrAssign(&t,p);printf("串t为: ");StrPrint(t);printf("串长为%d 串空否?%d(1:空0:否)\n",StrLength(t),StrEmpty(t)) ;StrAssign(&s,q);printf("串s为: ");StrPrint(s);i=StrCompare(s,t);if(i<0)c='<';else if(i==0)c='=';elsec='>';printf("串s%c串t\n",c);Concat(&r,t,s);printf("串t联接串s产生的串r 为: ");StrPrint(r);StrAssign(&s,"oo");printf("串s为: ");StrPrint(s);StrAssign(&t,"o");printf("串t为: ");StrPrint(t);Replace(&r,t,s);printf("把串r中和串t相同的子串用串s代替后,串r为:\n");StrPrint(r);ClearString(&s);printf("串s清空后,串长为%d 空否?%d(1:空 0:否)\n",StrLength(s),StrEmpty(s));SubString(&s,r,6,4);printf("串s为从串r的第6个字符起的4个字符,长度为%d 串s为: ",s.length);StrPrint(s);StrCopy(&t,r);printf("复制串t为串r,串t为: ");StrPrint(t);StrInsert(&t,6,s);printf("在串t的第6个字符前插入串s后,串t为: ");StrPrint(t);StrDelete(&t,1,5);printf("从串t的第1个字符起删除5个字符后,串t为: ");StrPrint(t);printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n",Index(t,s,1));printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n",Index(t,s,2));system("pause");return 0;}实验结果及分析总结与体会(调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。

相关文档
最新文档