串的基本操作
串的定义及其基本运算

空格也是合法字符,它可以出现在较长的字符 串中,也可以单独出现 。例如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)的可个以数是,字称母为、串数的字长或度其。他字
angularjs 字符串基本操作

在AngularJS中,可以使用JavaScript的字符串基本操作来处理字符串。
以下是一些常见的字符串基本操作:1. 获取字符串长度:使用字符串的`length`属性可以获取字符串的长度。
例如:`var str = "Hello World"; var len = str.length;`,`len`的值为11。
2. 字符串连接:使用加号(+)可以将两个字符串连接起来。
例如:`var str1 = "Hello"; var str2 = "World"; var result = str1 + " " + str2;`,`result`的值为"Hello World"。
3. 字符串截取:使用`substring()`方法可以截取字符串的一部分。
该方法接受两个参数,第一个参数是起始位置,第二个参数是结束位置(可选)。
例如:`var str = "Hello World"; var subStr = str.substring(6, 11);`,`subStr`的值为"World"。
4. 字符串查找:使用`indexOf()`方法可以查找字符串中某个子串的位置。
该方法接受一个参数,即要查找的子串。
如果找到了,返回子串的起始位置;如果找不到,返回-1。
例如:`var str = "Hello World"; var index = str.indexOf("World");`,`index`的值为6。
5. 字符串替换:使用`replace()`方法可以将字符串中的某个子串替换为另一个字符串。
该方法接受两个参数,第一个参数是要替换的子串,第二个参数是替换后的字符串。
例如:`var str = "Hello World"; var newStr = str.replace("World", "AngularJS");`,`newStr`的值为"Hello AngularJS"。
数据结构 串基本操作代码

数据结构串基本操作代码本文档涉及附件:________1.附件1:________数据结构串基本操作代码示例本文所涉及的法律名词及注释:________1.数据结构:________在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
2.串:________串是由零个或多个字符组成的有限序列,在计算机中常用字符串表示。
第一章串的定义和基本概念1.1 定义:________串是由零个或多个字符组成的有限序列。
1.2 基本概念:________●空串:________不包含任何字符的串。
●子串:________串中任意个连续的字符组成的序列称为子串。
●主串:________包含子串的串称为主串。
●子序列:________串中删除部分字符但不改变其相对位置所得到的新串称为子序列。
第二章串的存储结构2.1 顺序存储结构:________字符串可以采用一维数组来存储,每个字符占据一个存储单元,依次存储在连续的存储单元中。
2.2 链式存储结构:________字符串可以采用链表来存储,每个节点包含一个字符和指向下一个节点的指针。
第三章串的基本操作3.1 串的赋值:________将一个串赋值给另一个串,即将源串的字符串复制到目标串中。
3.2 串的连接:________将两个串连接起来,形成一个新的串。
3.3 串的长度:________统计一个串的长度,即字符的个数。
3.4 串的比较:________比较两个串是否相等。
3.5 串的截取:________从一个串中截取出指定位置的若干个字符,形成一个新的子串。
3.6 串的插入:________将一个串插入到另一个串的指定位置上。
3.7 串的删除:________删除一个串中指定位置的若干个字符。
3.8 串的替换:________将一个串中的指定字符替换成其他字符。
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;}。
串的基本操作

串得基本操作一、实验目得、意义(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姓名:姚福刚一、实验目的及要求:掌握有关字符串的基本操作和存储结构,并编写相应的基本操作算法。
串的定义和基本运算(精)

(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-
实验三 串基本操作的编程实现

实验三串基本操作的编程实现实验三串基本操作的编程实现实验三串基本操作的编程实现【实验目的】内容:串基本操作的编程实现要求:串成基本操作的编程同时实现(2学时,检验型),掌控串成的创建、结点、填入、删掉等基本操作的编程同时实现,也可以进一步编程同时实现搜寻、分拆、剪裁等操作方式,存储结构可以在顺序结构或链接结构、索引结构中自由选择,也可以全部同时实现。
也引导学生利用基本操作展开一些应用领域的程序设计。
【实验性质】检验性实验(学时数:2h)【实验内容】字符串长度排序,字符串的替代。
【思考问题】1.字符串的顺序存储和链表存储的差异?c语言中就是如何同时实现字符串的?2.在字符串处置方面主要存有什么操作方式?3.字符串的操作方式的主要特点就是什么?4.列举几个字符串的应用领域范例?【参考代码】(一)字符串长度排序intstrlen(char*s){。
}/*主程序:读取字符串长度后,输出该字符串的长度*/voidmain(){charstring[50];/*声明长度为50的字符串数组*/intlength;/*字符串长度*/printf(\gets(string);/*读取字符串存到变量string*/length=strlen(string);/*计算字符串string的长度*/printf(\}/*期望的结果*//*pleaseinputstring:howareyou?*//*theinputstringlengthis12*/(二)字符串的替换/*将字符串s2从字符串s1的某一个边线pos替代s1的子串*/char*strrep(char*s1,char*s2,intpos){。
}/*主程序:输入两字符串,再进行字符串取代*/voidmain(){charstring1[100];/*声明字符串数组1*/charstring2[50];/*声明字符串数组2*/intposition;/*展开替代的初始边线*/printf(\/*读取原始字符串并存入\gets(string1);printf(\/*加载欲替代的子字符串并取走\gets(string2);printf(\/*读取进行字符串替换的起始位置\scanf(\strrep(string1,string2,position);/*进行字符串的取代*/printf(\}/*期望的结果*//*pleaseinputoriginalstring:myfavoritecolorisblack.*//*pleaseinputsubstitutestring:white*//*pleaseinputsubstituteposition:22*//*the finalstring:myfavoritecoloriswhite.*/【实验小结】(总结本次实验的重难点及心得体会、体会、斩获)得分_____________批改日期_____________教师亲笔签名____________。
串 串

上一页
返回
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章 串

第四章串讲课提要【主要内容】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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串的基本操作一、实验目的、意义(1)理解串的堆分配存储结构。
(2)理解用它们表示时插入,生成串,联接串与求子串的算法。
(3)根据具体问题的需要,能够设计出相关算法。
二、实验内容及要求说明1:学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
具体要求:定义串的堆分配存储,完成串的基本操作:插入,生成串,联接串,求子串等。
三、实验所涉及的知识点C语言算法、循环算法、串的堆分配存储结构、插入,生成串,联接串与求子串的算法。
四、实验结果及分析(所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。
)五、总结与体会(调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。
)调试程序时,出现了许多错误。
如:串的堆分配存储结构、串的联接等。
另外还有一些语法上的错误。
由于对所学知识点概念模糊,试验课上未能完成此次上机作业。
后来经过查阅教材,浏览网页等方式,才完成试验。
这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。
以后要都去练习、实践,以完善自己的不足。
六、程序清单(包含注释)#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为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).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.length*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,否则返回0int 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])return S.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.length;(*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*sizeof(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;}// 算法4.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;}// 算法4.4// 在串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-len;i++)(*S).ch[i]=(*S).ch[i+len];(*S).length-=len;(*S).ch=(char*)realloc((*S).ch,(*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;}Love is not a maybe thing. You know when you love someone.。