串的基本操作

合集下载

串的定义及其基本运算

串的定义及其基本运算
一个长度为零的串称为空串,表示为s =ˊˊ。
空格也是合法字符,它可以出现在较长的字符 串中,也可以单独出现 。例如A=ˊabc def ˊ就是 长度为7的字符串,因为abc和def中间有一个空 格字符。

串的基本运算
1. 求串的长度len(s); 2. 判断两个串是否相等equal(s,t); 3. 两个串的连接concat(s,t); 4. 求某串的子串sub(s,start,ln,t); 5. 插入子串insert(s1,i,s2); 6. 删除子串delete(s,i,j); 7. 置换replace(s,t,r)。
返回

数据结构
数据结构
1.1 串的定义
串(string)是由有限个字符组成的序列,又称为 字符串(character string),一般记为:
s=ˊa1 a2 a3…anˊ 其中s是串名,用单引号括起来的字符序列是串 的符值;。 n为ai串(1<中=字i<=符n)的可个以数是,字称母为、串数的字长或度其。他字

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;}。

串的基本操作

串的基本操作
if( S.ch ) {
free(S.ch); S.ch=NULL;
}
S.length = 0;
return OK;
}//ClearString
Status Concat (Hstring &T,Hstring Sl,HStringS2){ //用T返回s1和s2联接成的新串。
Status Concat (Hstring &T,Hstring S1,Hstring S2);
HString SubString ( Hstring S,int pos,int len);
//—————基本操作的算法描述—————
Status StrAssign( Hstring &T,char *chars){ //生成一个其值等于串常量chars的串T
Sub.ch[0..len-1]=S[pos-1..pos+len-2];
Sub.length=len;
}
return OK
}//SubString
if(Sub.ch)
if(!len) {Sub.ch=NULL; Sub.length=0;} //空子串
else { //完整子串
Sub.ch= (char *)malloc(len* sizeof(char));
if(T.ch) free(T.ch); //释放旧空间
if(!(T.ch=(char*)malloc((S1.length+S2.length) *sizeof(char)))) exit(OVERFLOW);
T.ch[0.. S1.length -1]=S1.ch[0..S1.length - 1];

串的基本操作

串的基本操作

串得基本操作一、实验目得、意义(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字符串的复制。

串操作实验报告

串操作实验报告

竭诚为您提供优质文档/双击可除串操作实验报告篇一:顺序串的基本操作实验报告宁波工程学院电信学院计算机教研室实验报告课程名称:数据结构实验项目:顺序串的基本操作实验人员:徐浩学号:10401010209班级:计科102指导教师:宋宏图实验位置:计算机中心二楼实验日期:20XX-10-13一、实验目的1)熟悉串的定义和串的基本操作。

2)掌握顺序串的基本运算。

3)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。

二、实验环境装有Visualc++6.0的计算机。

本次实验共计2学时。

三、实验内容编写一个程序,实现顺序串的各种基本运算,并在此基础上设计一个主程序。

具体如下:编写栈的基本操作函数顺序串类型定义如下所示:typedefstruct{charch[mAxsIZe];intlen;}seqstring;(1)串赋值Assign(s,t)?将一个字符串常量赋给串s,即生成一个其值等于t的串s(2)串复制strcopy(s,t)?将串t赋给串s(3)计算串长度strLength(s)?返回串s中字符个数(4)判断串相等strequal(s,t)?若两个串s与t相等则返回1;否则返回0。

(5)串连接concat(s,t)?返回由两个串s和t连接在一起形成的新串。

(6)求子串substr(s,i,j)?返回串s中从第i(1≤i≤strLength((:串操作实验报告)s))个字符开始的、由连续j个字符组成的子串。

(7)插入Insstr(s,i,t)?将串t插入到串s的第i(1≤i≤strLength(s)+1)个字符中,即将t的第一个字符作为s的第i个字符,并返回产生的新串(8)串删除Delstr(s,i,j)?从串s中删去从第i(1≤i≤strLength(s))个字符开始的长度为j的子串,并返回产生的新串。

(9)串替换Repstr(s,s1,s2)?在串s中,将所有出现的子串s1均替换成s2。

(10)输出串Dispstr(s)?输出串s的所有元素值(11)判断串是否为空Isempty(s)编写主函数调用上述函数实现下列操作:(1)建立串s=“abcdefghijklmn”,串s1=“xyz”,串t=“hijk”(2)复制串t到t1,并输出t1的长度(3)在串s的第9个字符位置插入串s1而产生串s2,并输出s2(4)删除s第2个字符开始的5个字符而产生串s3,并输出s3(5)将串s第2个字符开始的3个字符替换成串s1而产生串s4,s4(6)提取串s的第8个字符开始的4个字符而产生串s5,并输出s5(7)将串s1和串t连接起来而产生串s6,并输出s6 (8)比较串s1和s5是否相等,输出结果程序:#include#definemAxsIZe100typedefstruct{charch[mAxsIZe];intlen;}sqstring;voidstrAssign(sqstringfor(i=0;t[i]!=\0;i++)s.ch[i]=t[i];s.len=i;}voidstrcopy(sqstring并输出for(i=0;i s.ch[i]=t.ch[i];s.len=t.len;}voidstrequal(sqstrings,sqstringt){//判断串相等intsame=1,i;if(s.len!=t.len){same=0;}else{for(i=0;i if(s.ch[i]!=t.ch[i]){same=0;break;}}if(same==0)printf("s1,s5不相等");elseprintf("s1,s5相等");printf("\n");}voidstrLength(sqstrings){//计算串长度printf("t1的长度:");printf("%d",s.len);printf("\n");}sqstringconcat(sqstrings,sqstringt){//串连接sqstringstr;inti;str.len=s.len+t.len;for(i=0;i str.ch[i]=s.ch[i];for(i=0;i str.ch[s.len+i]=t.ch[i];returnstr;}sqstringsubstr(sqstrings,inti,intj){//求子串sqstringstr;intk;str.len=0;if(is.len||js.len)returnstr;for(k=i-1;k str.ch[k-i+1]=s.ch[k];str.len=j;returnstr;}sqstringInsstr(sqstrings1,inti,sqstrings2){//插入intj;sqstringstr;str.len=0;if(is1.len+1)returnstr;for(j=0;j str.ch[j]=s1.ch[j];for(j=0;j str.ch[i+j-1]=s2.ch[j];for(j=i-1;j str.ch[s2.len+j]=s1.ch[j];str.len=s1.len+s2.len;returnstr;}sqstringDelstr(sqstrings,inti,intj){//删除intk;sqstringstr;str.len=0;if(is.len||i+j>s.len+1)returnstr;for(k=0;k str.ch[k]=s.ch[k];for(k=i+j-1;k str.ch[k-j]=s.ch[k];str.len=s.len-j;returnstr;sqstringRepstr(sqstrings,inti,intj,sqstringt){//替换intk;sqstringstr;str.len=0;if(is.len||i+j-1>s.len)returnstr;for(k=0;k str.ch[k]=s.ch[k];for(k=0;k str.ch[i+k-1]=t.ch[k];for(k=i+j-1;k str.ch[t.len+k-j]=s.ch[k];str.len=s.len-j+t.len;returnstr;}voidDispstr(sqstrings){//输出串所有元素inti;if(s.len>0){for(i=0;i printf("%c",s.ch[i]);printf("\n");}}voidIsempty(sqstrings){//判断串是否为空if(s.len>0)printf("串不为空");elseprintf("串为空");printf("\n");}篇二:串实验报告篇三:字符串实验报告数据结构字符串实验班级:计算机应用技术10-1学号:10602101048姓名:姚福刚一、实验目的及要求:掌握有关字符串的基本操作和存储结构,并编写相应的基本操作算法。

4.1串及其基本运算

4.1串及其基本运算

4.1串及其基本运算串(即字符串)是⼀种特殊的线性表,它的数据元素仅由⼀个字符组成,计算机⾮数值处理的对象经常是字符串数据,如在汇编和⾼级语⾔的编译程序中,源程序和⽬标程序都是字符串数据;在事物处理程序中,顾客的姓名、地址、货物的产地、名称等,⼀般也是作为字符串处理的。

另外串还具有⾃⾝的特性,常常把⼀个串作为⼀个整体来处理,因此,在这⼀章我们把串作为独⽴结构的概念加以研究,介绍串的串的存储结构及基本运算。

4.1.1 串的基本概念1.串的定义串是由零个或多个任意字符组成的字符序列。

⼀般记作:s="a1 a2 … an""其中s 是串名。

在本书中,⽤双引号作为串的定界符,引号引起来的字符序列为串值,引号本⾝不属于串的内容;ai(1<=i<=n)是⼀个任意字符,它称为串的元素,是构成串的基本单位,i 是它在整个串中的序号; n 为串的长度,表⽰串中所包含的字符个数,当n=0 时,称为空串,通常记为Ф。

2.⼏个术语⼦串与主串:串中任意连续的字符组成的⼦序列称为该串的⼦串。

包含⼦串的串相应地称为主串。

⼦串的位置:⼦串的第⼀个字符在主串中的序号称为⼦串的位置。

串相等:称两个串是相等的,是指两个串的长度相等且对应字符都相等。

4.1.2 串的基本运算串的运算有很多,下⾯介绍部分基本运算:1.求串长StrLength(s)操作条件:串s 存在操作结果:求出串s 的长度。

2.串赋值StrAssign(s1,s2)操作条件: s1 是⼀个串变量,s2 或者是⼀个串常量,或者是⼀个串变量(通常s2 是⼀个串常量时称为串赋值,是⼀个串变量称为串拷贝)。

操作结果:将s2 的串值赋值给s1, s1 原来的值被覆盖掉。

3.连接操作:StrConcat (s1,s2,s) 或StrConcat (s1,s2)操作条件:串s1,s2 存在。

操作结果:两个串的连接就是将⼀个串的串值紧接着放在另⼀个串的后⾯,连接成⼀个串。

串的定义和基本运算(精)

串的定义和基本运算(精)
return OK; }
(2)判断串是否为空 int StringEmpty(STRING s) { if (!s.length) return TRUE;
else return FALSE; } (3)求串的长度 int Length(STRING s) { return s.length; }
s1->str=(char*)malloc(sizoef(char));s1->str[0]=’\0’;s1>length=0;return ERROR;} s1->str=(char*)malloc((len+1)*sizeof(char)); if (!s1.str) return ERROR; s1->str[0..len-1]=s2.str[start-1..start+len -2]; s1->str[len]=’\0’; s1->length=len; return OK; }
4.1 串
4.1.1 串的定义和基本运算
串是字符串的简称。它是一种在数据元素的组成 上具有一定约束条件的线性表,即要求组成线性表的 所有数据元素都是字符,所以,人们经常又这样定义 串:串 (n0) 其中,s是串的名称,用双引号(“”)括起来的 字符序列是串的值;ai可以是字母、数字或其他字符; 串中字符的数目n被称作串的长度。当n=0时,串中没 有任何字符,其串的长度为0,通常被称为空串。
//若s已经存在,将它占据的空间释放掉 for (len=0,ch=string_constant;ch;len++,ch++);
//求string_constant串的长度 if (!len) { s->str=(char*)malloc(sizeof(char));s-

数据结构串的性质和基本操作本

数据结构串的性质和基本操作本
S
S s s p r i n p r i n

g
^
g # # # # ^
直接采用第一种链表 存储串值,进行操 作时效率太低。
串的块链存储表示
块的结构定义
#define CHUNKSIZE 80 ∥可由用户定义的块大小
typedef struct Chunk{ ∥结点结构
char ch[CHUNKSIZE];
本章内容
4.1 串的定义 4.2 串的表示和实现
1.串的顺序存储结构 2.串的链式存储结构
4.3 串的模式匹配算法
1.朴素的模式匹配算法
2.KMP算法
串的定义和相关概念
1.串的定义
串( String ) : 由零个或多个字符组成的有限序列。 记为:s=’a1a2…an’(n≥0)
2.相关概念
s为串名, ’a1a2…an’为串值,n为串的长度。 ai,约束为字符集中的字符。 空串(Null String):n=0,记为:Ф 。 子串在主串中的位置:以子串的第一个字符在 空格串 (blank string) :串中仅包含空格字符。 主串中的位置来表示。 串相等:当且仅当两个串的串值相等(两个串的长 子串:串中任意个连续的字符组成的子序列称为 该串的子串。包含子串的串被称为主串。 度相等,并且各个对应的字符也都相等)。
例如:串的联接算法中需分三种情况处理:
Status Concat(SString S1, SString S2, SString &T) {
// 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。
return uncut; } // Concat
if (S1[0]+S2[0] <= MAXSTRLEN) {// 未截断 T[1..S1[0]] = S1[1..S1[0]]; else if (S1[0] <MAXSTRSIZE) { // 截断 T[S1[0]+1..S1[0]+S2[0]] = S2[1..S2[0]]; T[1..S1[0]] = S1[1..S1[0]]; T[0] = S1[0]+S2[0]; uncut else { // 截断(仅取 S1) = TRUE; } T[S1[0]+1..MAXSTRLEN] = T[0..MAXSTRLEN] = S1[0..MAXSTRLEN]; S2[1..MAXSTRLEN-S1[0]]; // T[0] == S1[0] == MAXSTRLEN T[0] = MAXSTRLEN; uncut = FALSE; } uncut = FALSE; }

串 串

串       串
对于插入操作,如果串中最后一个字符的存储位置后面没有剩余空间或 剩余空间的长度小于将要插子串的长度,那么要完成这个子串的插入操 作,必须先申请一块新的、长度合适的存储块。然后,先复制插入点前 的子串,再接上插入的子串,最后在复制插入点后的子串。这样的操作 较麻烦。当删除一个子串时,或者用“F”符代替被删除的字串字符( 这时的“F”个数应等于被删除子串的长度);或者移动原串中的字符 将存储的空间压缩以实现删除。
上一页
返回
5.2 串的存储结构
如同线性表一样,串也有顺序存储结构和链式存储结构。 任何一种存储结构对于不同串的运算并非都是十分有效的。对于串的插
入和删除操作,顺序存储结构是不方便的,而链式存储结构则显得方便 些。对于访问串的字符操作,如访问单个字符,对链式存储结构是不困 难的;当要访问一组连续的字符时,则用链式存储结构要比顺序存储结 构麻烦。所以应针对不同的应用来选择串的存储结构。 5.2.1 串的顺序存储结构 串的顺序存储结构称为顺序串。顺序串就是把串中的字符依次存放在一 组连续的存储空间中。也就是用向量存储串。例如,对于串 =“PROGRAM”,当用向量来存储时,其存储状态如图5-1所示。
上一页 下一页Leabharlann 返回5.2 串的存储结构结点大小大于1的结点结构类型如下: struct linkstringnode {char data[chunksize];/* chunksize 为结点大小*/ struct linkstringnode *next; } 串链式存储时,链串通常是由头指针唯一确定的,其操作与线性表类似
该软件采用Client/Server (客户/服务器)体 系结构,包含了电子电路原理图设计、多层印制 电路板设计(包含印制电路板自动布线)、通用 可编程逻辑器件设计、模拟电路与数字电路混合 信号仿真及分析、图表生成、电子表格生成、同 步设计、联网设计、3D模拟等功能。

串的基本操作

串的基本操作

一.实验目的如果计算机语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉及串操作的软件系统时,用户必须自己实现串类型。

试着实现串类型,并写一个串的基本操作演示系统。

二.实验内容实现若干串的常用基本操作,如串赋值、求串长、串替换、串比较、求子串及串的模式匹配等。

模块设计本程序包含两个模块:主程序模块、串操作模块。

其调用关系如图2所示。

图2 模块调用关系示意图三.实验步骤(可选)数据类型定义(1) 字符串的定义typedef struct{char *ch; //串存放的数组int curLen; //串的长度}HString;(2) 全局变量声明#define OK 1 //操作成功#define OVERFLOW 0 //溢出#define ERROR 0 //出错系统主要子程序详细设计(1)主程序模块设计主函数。

设定用户操作界面,调用操作模块函数。

void main(){输出操作菜单;Switch (1){输出操作序号c;switch (c){调用相应函数执行相应操作;输出操作结果;}}}(2)求子串int substring(HString &Sub,HString S,int pos,int len){ //´串sub返回串S的第pos个字符起长度为len的子串int i;if(pos<0||pos>S.curLen||len<0||len>S.curLen-pos){ //若位置或长度不合法,退出printf("输入不合法\n");exit(OVERFLOW); //退出}else{if(Sub.ch) free(Sub.ch); //释放子串sub原有空间if(!len) //若长度len为0{ //就爱那个子串置为空串Sub.ch=NULL;Sub.curLen=0;}else //若长度len不为0{Sub.ch=(char*)malloc(len*sizeof(char));for(i=0; i<len; i++){ //从串S的第pos个字符开始依次复制其后长度为len的字符串sub中Sub.ch[i]=S.ch[pos-1+i];Sub.curLen=len; //修改串sub的串长}}return OK;}}(3)子串定位(串的模式匹配)int Index(HString &ob1,HString &ob2,int pos){ //判断从第pos个字符起,ob2是否为ob1的子串//若是返回ob2在ob1中的起始位置,否则返回-1if(pos<0||pos>ob1.curLen){//若输入的数值pos不在ob1的串长范围内printf("输入有误\n");exit(ERROR);}for(int i=pos-1; i<=StrLength(ob1)-StrLength(ob2); i++){ //从ob1的第pos个字符起查找子串ob2int j=0; //从ob2的第一个字符起开始查找while(j<StrLength(ob2)) //j控制查找位置,逐个字符查找,直到超出子串串长{if(ob1.ch[i+j]==ob2.ch[j]) //若找到匹配字符j++; //则依次向后查找else break; //一旦失配,则跳出查找,此时j还未能达到子串串长}if(j==StrLength(ob2)) //若j达到子串串长,即ob2的所有字符都能和ob1匹配return i; //返回ob2在ob1的起始位置i}return -1; //ob2不是ob1的子串,返回-1}(4)串替换void Replace(HString &ob1,HString &ob2,HString &ob3){ //将原串ob1的所有子串ob2都替换为插入串ob3printf("原串:");for(int i=0; i<ob1.curLen; i++)printf("%c",ob1.ch[i]);printf("\n 子串:");for(int j=0; j<ob2.curLen; j++)printf("%c",ob2.ch[j]);printf("\n");printf("插入串:");for(int k=0; k<ob3.curLen; k++)printf("%c",ob3.ch[k]);printf("\n");int len=StrLength(ob2); //ob2的长度while(Index(ob1,ob2,0)!=-1) //当ob2是ob1的子串,替换所有的ob2 {int len2=StrLength(ob3)+StrLength(ob1)-StrLength(ob2); //新串的长度int i=Index(ob1,ob2,0); //调用子串定位函数char *p=new char[StrLength(ob1)-i-len+1]; //临时数组char *q=new char[len2]; //存储新串的数组for(int j=i+len; j<StrLength(ob1); j++)p[j]=ob1.ch[j]; //将不用替换的后部分存入数组pfor(int k=0; k<i; k++)q[k]=ob1.ch[k]; //将不用替换的前部分存入数组q for(int m=i; m<i+StrLength(ob3); m++)q[m]=ob3.ch[m-i]; //替换子串int b=i+len;for(int n=i+StrLength(ob3); n<len2; n++){ //将不用替换的后部分存入数组qq[n]=p[b];b++; //数组q存储着新串}ob1.curLen=len2;for(int l=0; l<len2; l++)ob1.ch[l]=q[l]; //将新串赋值给ob1做循环替换}printf("新串:");for(int h=0; h<ob1.curLen; h++)printf("%c",ob1.ch[h]);}(5)串比较int Compare(HString s1, HString s2){ //若s1<s2则返回值<0; 若s1=s2则返回值=0; 若s1>s2则返回值>0int i;for(i=0; i<s1.curLen&&i<s2.curLen; ++i)if(s1.ch[i]!=s2.ch[i])return (s1.ch[i]-s2.ch[i]);return (s1.curLen-s2.curLen);}四.实验的结果及分析。

串的定义及基本运算

串的定义及基本运算
同的情况,即此趟比较不成功,将主串的指针指向本
趟比较开始位置的下一个字符(i=i-j+2) ,同时将
子串的位置返回到第一个位置。
进行下次比较,直到匹配成功或者主串已经结束。
2020年1月30日
17
• 算法举例
主 串 S abbaba 子 串 T aba
第1趟 S a b b a b a T aba
3. 设定长串存储空间:char s[MAXSIZE+1]; 用s[0] 存放串的实际长度,串值存放在s[1]~s[MAXSIZE],字 符的序号和存储位置一致,应用更为方便。
2020年1月30日
10
4.2.2 定长顺序串的基本运算
第四章 串
1.串联接:把两个串s1和s2首尾连接成一个新串s 。 int StrConcat1(s1,s2,s) { int i=0 , j, len1, len2;
(ii)在最坏的情况下,如果不成功的匹配都发生在子 串(t)的最后一个字符的位置,即每趟比较都要进行 m 次,这样比较的趟数要 n 趟,因此,此情况下的时 间复杂度为 O(n*m)。
例如:s="aaaaaaaaaab"
t="aaaab"
2020年1月30日
20
第四章 串
算法分析 优点:算法简单 实现容易 缺点:算法复杂度高; 重复比较次数比较,只要不匹配的情况,要 从新开始;回溯次数比较多。
8.串删除 StrDelete(s,i,len) 操作条件:串s存在,1≤i≤StrLength(s), 0≤len≤StrLength(s)-i+1。 操作结果:删除串s 中从第i个字符开始的长度为 len的子串,s的串值改变。
9.串替换 StrRep(s,t,r) 操作条件:串s,t,r存在,t不为空。 操作结果:用串r 替换串s中出现的所有与串t相等

第4章 串

第4章 串

第四章串讲课提要【主要内容】1.串的有关概念及基本操作2.串的存储结构3.串操作应用举例【教学目标】1.掌握串的有关概念及基本运算2.熟悉串的存储结构3.熟悉串操作应用举例学习指导1.概念和术语•串(String)(或字符串):是由零个或多个字符组成的有限序列。

一般记为s= “a1a2…an”(n≥0)其中,s是串的名,用双引号括起来的字符序列是串的值。

•串的长度:串中字符的个数n。

•子串和主串:串中任意个连续的字符组成的子序列称为该串的子串。

包含子串的串相应地称为主串。

•空串:不包含任何字符的串,表示为“Ф”。

•空格串:由一个或多个空格字符组成的串。

例如:“”。

2.串的基本操作(1)用串变量赋值assign(s,t)和用串常量赋值create(s,ss)(2)判等函数equal(s, t)(3)求长函数length(s)(4)连接函数concat(s,t)(5)求子串函数substring(s, pos , len)(6)定位函数index(s,t)(7)置换函数replace(s,t,v)(8)插入子串insert(s,pos,t)(9)删除子串delete(s,pos,k)(10)串的复制copy(s,t)【例3-1】已知字符串:a=“an apple”,b=“other hero”,c=“her”,求:(1)concat(substr(a,1,2),b)。

(2)replace(a,substr(a,5,1),c)。

(3)index(a,c)和index(b,c)。

解:(1)返回值为“another hero”,其中substr(a,1,2)的返回值为“an”。

(2)返回值为“an aherherle”,其中sub(a,5,1)的返回值为“p”。

(3)返回值分别为0和3。

3.串的顺序存储结构(顺序串)串的顺序存储方式类似于线性表的顺序存储方式,其存储结构用C语言描述为:typedef struct strnode {char data[maxlen];int len;}SeqString; //定义顺序串类型【例3-2】设定串采用顺序存储结构,写出对串s1和串s2比较大小的算法。

串的基本操作演示实验报告

串的基本操作演示实验报告

串的基本操作演示实验报告学号:姓名:班级:一.实验环境问题描述:如果语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉及串操作的软件系统时,用户必须自己实现串类型。

试实现串类型,并写一个串的基本操作的演示系统。

基本要求: 在教科书4.2。

2节用堆分配存储表示实现HString串的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数).参数合法性检查必须严格。

说明:(在格式中,Φ表示0个、1个或多个空格所组成的串。

〈串标识〉表示一个内部名或一个串文字。

前者是一个串的唯一标识,是一种内部形式的(而不是字符形式的)标识符。

后者是两端由单引号括起来的仅可打印字符组成的序列.串内每两个连续的单引号表示一个单引号符。

)利用上述基本操作函数构造以下系统:它是一个命令解释程序,循环往复地处理用户键入的每一条命令,直至终止程序的命令为止。

命令定义如下:(1) 赋值.格式:AΦ〈串标识>Φ<回车〉用〈串标识>所表示的值建立新串,并显示新串的内部名和串值。

如:A′Hi!′(2)判相等。

格式:EΦ〈串标识1>Φ〈串标识2〉Φ〈回车〉若两串相等,则显示“EQUAL",否则显示“UNEQUAL”。

(3)联接。

格式:CΦ<串标识1〉Φ〈串标识2>Φ〈回车〉将两串联接产生结果串,它的内部名和串值都显示出来.(5) 求子串格式:SΦ〈串标识〉Φ+〈数1〉Φ+〈数2〉Φ<回车>如果参数合法,则显示子串的内部名和串值。

<数〉不带正负号.(6)子串定位. 格式:IΦ〈串标识1〉Φ〈串标识2〉Φ〈回车〉显示第二个串在第一个串中首次出现时的位置。

(7)串替换格式:RΦ〈串标识1〉Φ〈串标识2〉Φ〈串标识2>Φ〈回车〉将第一个串中出现所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。

(0)退出格式:QΦ<回车> 结束程序的运行.二、实验内容编写一个程序,实现顺序串的各种基本运算,并在此基础上设计一个主程序.具体如下:编写栈的基本操作函数顺序串类型定义如下所示:typedef struct node{char data;struct node *next;}linkstring;(1)串赋值 Assign(s,t)将一个字符串常量赋给串s,即生成一个其值等于t的串s(2)串复制 StrCopy(s,t)将串t赋给串s(3)计算串长度 StrLength(s)返回串s中字符个数(4)判断串相等StrEqual(s,t)若两个串s与t相等则返回1;否则返回0。

串的最小基本操作数

串的最小基本操作数

串的最小基本操作数
一、关于“串的最小基本操作数”的理解
串这个概念在计算机科学里还挺有趣的呢。

就像是一条由字符组成的小链子,而我们要研究它的最小基本操作数。

那这个最小基本操作数到底是啥呢?简单来说,就是对这个串进行操作时,最少需要的操作次数。

比如说,要对一个串进行查找、替换或者连接等操作,我们想办法用最少的步骤完成,这个最少的步骤数就是我们要找的最小基本操作数啦。

二、一些相关的思考
这让我想到在生活里,我们也总是追求效率,就像这个串的操作一样。

如果把生活里的任务看作是串,那我们肯定也希望用最少的动作去完成它。

比如说整理房间,我们会想怎么最快地把东西归位,这其实就有点像找串的最小基本操作数的感觉。

再比如做饭的时候,怎么用最少的步骤做出一道美味的菜呢。

三、实际例子
咱们来举个简单的例子吧。

有一个串是“abcde”,如果我们要在这个串里查找字符“c”,一种很笨的方法可能是一个一个字符去比对,这样可能要比对好几次。

但如果我们有更聪明的算法,可能一下子就能定位到“c”,这个时候,聪明算法所用的操作数就是更接近最小基本操作数的。

又比如我们要把两个串“abc”和“def”连接起来,直接相加是一种操作方法,但也许还有更高效的内存操作方式,可以减少不必要的步骤,这个减少后的操作次数就是我们在这个连接操作里追求的最小基本操作数。

四、总结
串的最小基本操作数这个概念虽然听起来有点抽象,但它在计算机科学里是很重要的呢。

它能让程序运行得更高效,就像我们在生活里找到更高效的做事方法一样。

无论是开发软件,还是处理数据,理解这个概念都能让我们的操作更加优化。

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

1上机实训3:串的基本操作一、实训目的通过实训,掌握串的运算(赋值,比较,联结,插入子串,模式匹配……等)二、实验理论知识1)串的基本概念及其含义串( string)是由零个或多个字符组成的有限序列,一般记作:s='a1a2…an'(n≥0),其中s为串的名字,用单引号括起来的字符序列为串的值;ai(1≤i≤n)可以是字母、数字或其它字符(取决于程序设计语言所使用的字符集);n为串中字符的个数,称为串的长度。

2)串的存储表示及其实现●顺序存储可以用一组地址连续的存储单元依次存放串的各个字符,这是串的顺序存储结构,也称为顺序串●链式存储和线性表的链式存储结构相类似,也可采用链表方式存储串值。

串的这种链式存储结构简称为链串。

用链表存储字符串,每个结点需要有两个域:一个数据域(data)和一个指针域(Next),其中数据域存放串中的字符,指针域存放后继结点的地址。

3)模式匹配问题三、实训案例与分析【实例1】串的存储与基本运算【实例分析】在本实例中练习计算字符串的长度、字符串的复制、字符串的比较、字符串的连接、字符串的插入等基本操作。

在设计时1)编写一个菜单函数,根据不同情况做(1-5)不同选择。

2)如果选择1,即要求计算输入字符串的长度。

3)如果选择2,完成字符串的复制。

4)如果选择3,完成字符串的比较。

5)如果选择4,完成两个字符串的连接。

6)如果选择5,字符串的插入。

【参考程序】#include <stdio.h>#define MAX 128typedef enum {fail,success} status;typedef enum {false,true} boolean;main(){ int strlen();void strass();boolean strcmp();status strcat( );status strins();int t,n,i;boolean b;status st;char s[MAX],s1[MAX],s2[MAX];printf("\n1. The length of string\n");printf(" 2. The assignment of string\n");printf(" 3. A string compare with another string:\n"); printf(" 4. A string connect with another string:\n"); printf(" 5. A string to be inserted into another string\n"); printf(" Please input a operation:");/*输入操作选项*/ scanf("%d",&t);switch(t){case 1:printf("please input a string:\n");getchar();gets(s);n=strlen(s);printf("the length is: %d",n);break;case 2:printf("please input the first string:\n");getchar();gets(s1);printf("please input the second string:\n");getchar();gets(s2);strass(s1,s2);break;case 3:printf("please input the first string:\n"); getchar();gets(s1);printf("please input the second string: \n"); gets(s2);b=strcmp(s1,s2);if (b==true)printf("equal\n");elseprintf("not equal\n");break;case 4:printf("please input the first string:\n"); getchar();gets(s1);printf("please input the second string:\n"); gets(s2);st=strcat(s1,s2);if(st==success)printf("answer is %s\n",s1);elseprintf("error!\n");break;case 5:printf("please input the first string:\n"); getchar();gets(s1);printf("please input the second string:\n"); gets(s2);printf("please input i:");scanf("%d",&i);st=strins(s1,i,s2);if(st==success)printf("answer is: %s\n",s1);else printf("error!\n");break;case 0:break;default: printf("There isn't this operation!");}}int strlen(s) /*求字符串的长度子函数*/char s[];{ int i;for(i=0;s[i]!='\0';i++);return (i);}void strass(s1,s2)char s1[],s2[];{ int i=0;while(s1[i]!='\0'){ s2[i]=s1[i];i++;}s2[i]='\0';printf("s2 is %s",s2);}boolean strcmp(s1,s2) /*字符串比较子函数*/ char s1[],s2[];{ int i=0;while (s1[i]==s2[i] && s1[i]!='\0' && s2[i]!='\0') i++;if (s1[i]=='\0' && s2[i]=='\0')return (true);elsereturn (false);}status strcat (s1,s2) /*字符串连接子函数*/char s1[],s2[];{ int i,j,k;i=strlen(s1);j=strlen(s2);if((i+j)>=MAXN)return(fail);for(k=0;k<=j;k++)s1[i+k]=s2[k];return (success);}status strins (s1,i,s2)char s1[],s2[];int i;{ int m,n,k;m=strlen(s1);n=strlen(s2);if (i<0||i>m||(m+n)>MAXN )return (fail) ;for(k=m;k>=i;k--)s1[k+n]=s1[k];for(k=0;k<n;k++)s1[i+k]=s2[k];return (success);}【测试数据与结果:】计算字符串的长度1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another string Please input a opertation:1please input a string:you are a boy!the length is: 14字符串的复制1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another string Please input a opertation:2please input the first string:you are a boy!please input the second string:i am a girl!s2 is you are a boy!字符串的比较1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another string Please input a opertation:3please input the first string:you are a boy!please input the second string:i am a girl!not equal字符串的连接1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another stringPlease input a opertation:4please input the first string:you are a boy!please input the second string:i am a girl!answer is:you are a boy!i am a girl!字符串的插入1. The length of string2. The assignment of string3. A string compare with another string:4. A string connect with another string:5. A string to be inserted into another stringPlease input a opertation:5please input the first string:you are a boy!please input the second string:i am a girl!please input i:2answer is i am a girl! you are a boy!【实例2】统计主串指定单词在主串中出现的次数和位置【实例描述】统计主串指定单词在主串中出现的次数和位置,要求:1)输入以回车作为结束符的一串字符作为主串;2)求主串中指定单词出现的次数和位置,注意单词与子串的区别;【实例分析】假设num存放出现次数,初始化为0,position[i]存放每一次匹配时的位置。

相关文档
最新文档