哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告
return i-T[0]; else
return 0; } else
return 0; }
Status StrInsert(SString S,int pos,SString T) {
// 初始条件: 串S和T存在,1≤pos≤StrLength(S)+1
// 操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE int i;
if(pos<1||pos>S[0]+1) return ERROR;
if(S[0]+T[0]<=MAXSTRLEN) {
///完全插入
for(i=S[0]; i>=pos; i--) S[i+T[0]]=S[i];
for(i=pos; i ///部分插入 for(i=MAXSTRLEN; i<=pos; i--) S[i]=S[i-T[0]]; for(i=pos; i Status StrDelete(SString S,int pos,int len) { // 初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 // 操作结果: 从串S中删除第pos个字符起长度为len的子串 int i; if(pos<1||pos>S[0]-len+1||len<0) return ERROR; 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 for(i=pos+len; i<=S[0]; i++) S[i-len]=S[i]; S[0]-=len; return OK; } Status Replace(SString S,SString T,SString V) { // 初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) // 操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 int i=1; // 从串S的第一个字符起查找串T if(StrEmpty(T)) // T是空串 return ERROR; do { i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置 if(i) // 串S中存在串T { StrDelete(S,i,StrLength(T)); // 删除该串T StrInsert(S,i,V); // 在原串T的位置插入串V i+=StrLength(V); // 在插入的串V后面继续查找串T } } while(i); return OK; } void DestroyString() { // 由于SString是定长类型,无法销毁 } void StrPrint(SString T) { // 输出字符串T。另加 int i; for(i=1; i<=T[0]; i++) printf(\ printf(\// printf(\} int main() { 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 char g='1'; int i,j; Status k; char s,c[MAXSTRLEN+1]; SString t,s1,s2; printf(\请输入串s1: \ gets(c); k=StrAssign(s1,c); if(!k) { printf(\串长超过MAXSTRLEN(=%d)\\n\ exit(0); } printf(\串长为%d 串空否?%d(1:是 0:否)\\n\ StrCopy(s2,s1); printf(\拷贝s1生成的串为: \ StrPrint(s2); printf(\请输入串s2: \ gets(c); k=StrAssign(s2,c); if(!k) { printf(\串长超过MAXSTRLEN(%d)\\n\ exit(0); } i=StrCompare(s1,s2); if(i<0) s='<'; else if(i==0) s='='; else s='>'; printf(\串s1%c串s2\\n\ k=Concat(t,s1,s2); printf(\串s1联接串s2得到的串t为: \ StrPrint(t); if(k==FALSE) printf(\串t有截断\\n\ ClearString(s1); printf(\清为空串后,串s1为: \ StrPrint(s1); printf(\串长为%d 串空否?%d(1:是 0:否)\\n\ printf(\求串t的子串,请输入子串的起始位置,子串长度: \ scanf(\ k=SubString(s2,t,i,j); 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 if(k) { printf(\子串s2为: \ StrPrint(s2); } printf(\从串t的第pos个字符起,删除len个字符,请输入pos,len: \ scanf(\ StrDelete(t,i,j); printf(\删除后的串t为: \ StrPrint(t); i=StrLength(s2)/2; StrInsert(s2,i,t); printf(\在串s2的第%d个字符之前插入串t后,串s2为:\\n\ StrPrint(s2); i=Index(s2,t,1); printf(\的第%d个字母起和t第一次匹配\\n\ SubString(t,s2,1,1); printf(\串t为:\ StrPrint(t); Concat(s1,t,t); printf(\串s1为:\ StrPrint(s1); Replace(s2,t,s1); printf(\用串s1取代串s2中和串t相同的不重叠的串后,串s2为: \ StrPrint(s2); while(g!='0')scanf(\} // main4-1.cpp 检验bo4-1.cpp的主程序 // c1.h (程序名) #include #include #include #include // #include 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 #define INFEASIBLE -1 // #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE // c4-1.h 串的定长顺序存储表示 #define MAXSTRLEN 30 // 用户可在255以内定义最大串长(1个字节) typedef char SString[MAXSTRLEN+1]; // 0号单元存放串的长度 // bo4-1.cpp 串采用定长顺序存储结构(由c4-1.h定义)的基本操作(14个) // SString是数组,故不需引用类型。此基本操作包括算法4.2,4.3,4.5 Status StrAssign(SString &T,char *chars) { /// 生成一个其值等于chars的串T int i; if(strlen(chars)>MAXSTRLEN) return ERROR; else { T[0]=strlen(chars); for(i=1; i<=T[0]; i++) T[i]=*(chars+i-1); return OK; } } Status StrCopy(SString T,SString S) { /// 由串S复制得串T int i; for(i=0; i<=S[0]; i++) T[i]=S[i]; return OK; } Status StrEmpty(SString S) { /// 若S为空串,则返回TRUE,否则返回FALSE if(S[0]==0) return TRUE; else return FALSE; } int StrCompare(SString S,SString T)