1串的基本操作一、实验目的、意义(1)理解串的堆分配存储结构。(2)理解用它们表示时插入,生成串,联接串与求子串的算法。(3)根据具体问题的需要,能够设计出相关算法。二、实验内容及要求说明1:学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。具体要求:定义串的堆分配存储,完成串的基本操作:插入,生成串,联接串,求子串等。三、实验所涉及的知识点C语言算法、循环算法、串的堆分配存储结构、插入,生成串,联接串与求子串的算法。四、实验结果及分析(所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)五、总结与体会2(调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。)调试程序时,出现了许多错误。如:串的堆分配存储结构、串的联接等。另外还有一些语法上的错误。由于对所学知识点概念模糊,试验课上未能完成此次上机作业。后来经过查阅教材,浏览网页等方式,才完成试验。这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。以后要都去练习、实践,以完善自己的不足。六、程序清单(包含注释)#includestdio.h#includemalloc.h#includestdlib.htypedefcharStatus;intstrlen(char*p){inti=0;while(*p++)i++;returni;}typedefstruct{char*ch;//若是非空串,则按串长分配存储区,否则ch为NULLintlength;//串长度}HString;//初始化(产生空串)字符串TvoidInitString(HString*T){(*T).length=0;(*T).ch=NULL;}//生成一个其值等于串常量chars的串TStatusStrAssign(HString*T,char*chars){inti,j;if((*T).ch)free((*T).ch);//释放T原有空间i=strlen(chars);//求chars的长度iif(!i)3{//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;ji;j++)//拷贝串(*T).ch[j]=chars[j];(*T).length=i;}return1;}//由串S复制得串TintStrCopy(HString*T,HStringS){inti;if((*T).ch)free((*T).ch);//释放T原有空间(*T).ch=(char*)malloc(S.length*sizeof(char));//分配串空间if(!(*T).ch)//分配串空间失败exit(0);for(i=0;iS.length;i++)//拷贝串(*T).ch[i]=S.ch[i];(*T).length=S.length;return1;}//若S为空串,则返回1,否则返回0intStrEmpty(HStringS){if(S.length==0&&S.ch==NULL)return1;elsereturn0;}//若ST,则返回值0;若S=T,则返回值=0;若ST,则返回值0intStrCompare(HStringS,HStringT){inti;for(i=0;iS.length&&iT.length;++i)if(S.ch[i]!=T.ch[i])4returnS.ch[i]-T.ch[i];returnS.length-T.length;}//返回S的元素个数,称为串的长度intStrLength(HStringS){returnS.length;}//将S清为空串intClearString(HString*S){if((*S).ch){free((*S).ch);(*S).ch=NULL;}(*S).length=0;return1;}//用T返回由S1和S2联接而成的新串intConcat(HString*T,HStringS1,HStringS2){inti;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;iS1.length;i++)//将S1接到新串T的后面(*T).ch[i]=S1.ch[i];for(i=0;iS2.length;i++)//将S2接到新串T的后面(*T).ch[S1.length+i]=S2.ch[i];return1;}//用Sub返回串S的第pos个字符起长度为len的子串。intSubString(HString*Sub,HStringS,intpos,intlen){inti;if(pos1||posS.length||len0||lenS.length-pos+1)return0;if((*Sub).ch)free((*Sub).ch);//释放旧空间5if(!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;}return1;}//算法4.1//T为非空串。若主串S中第pos个字符之后存在与T相等的子串,//则返回第一个这样的子串在S中的位置,否则返回0intIndex(HStringS,HStringT,intpos){intn,m,i;HStringsub;InitString(&sub);if(pos0){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;elsereturni;}}return0;}//算法4.46//在串S的第pos个字符之前插入串TsintStrInsert(HString*S,intpos,HStringT){inti;if(pos1||pos(*S).length+1)//pos不合法return0;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;iT.length;i++)(*S).ch[pos-1+i]=T.ch[i];//插入T(*S).length+=T.length;}return1;}//从串S中删除第pos个字符起长度为len的子串intStrDelete(HString*S,intpos,intlen){inti;if((*S).lengthpos+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));return1;}//用V替换主串S中出现的所有与T相等的不重叠的子串intReplace(HString*S,HStringT,HStringV){inti=1;//从串S的第一个字符起查找串Tif(StrEmpty(T))//T是空串return0;do{i=Index(*S,T,i);//结果i为从上一个i之后找到的子串T的位置if(i)//串S中存在串T{StrDelete(S,i,StrLength(T));//删除该串T7StrInsert(S,i,V);//在原串T的位置插入串Vi+=StrLength(V);//在插入的串V后面继续查找串T}}while(i);return1;}voidDestroyString(){//堆分配类型的字符串无法销毁}//输出T字符串voidStrPrint(HStringT){inti;for(i=0;iT.length;i++)printf(%c,T.ch[i]);printf(\n);}intmain(){inti;charc,*p=Godbye!,*q=Godluck!;HStringt,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(i0)c='';elseif(i==0)c='=';else8c='';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);return0;}