C语言数据结构串的基本操作
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 个字符起
// 删除该串 T
StrInsert(S,i,V);
//
在原串 T 的位置插入串 V
i+=StrLength(V); //
在
插入的串 V 后面继续查找串 T
}
}while(i);
return 1;
}
void DestroyString() {
// 堆分配类型的字符串无法销毁 }
// 输出 T 字符串 void StrPrint(HString T) {
(*Sub).ch[i]=S.ch[pos-1+i]; (*Sub).length=len;
} return 1; }
// T 为非空串。若主串 S 中第 pos 个 字符之后存在与 T 相等的子串 , // 则返回第一个这样的子串在 S 中的 位置 , 否则返回 0 int Index(HString S,HString T,int pos) {
int i=1; // 从串 S 的第一个字符
起查找串 T
if(StrEmpty(T)) // T
是空串
return 0;
do
{
i=Index(*S,T,i); //
结果 i
为从上一个 i 之后找到的子串 T 的位
置
if(i) //
串 S 中存在串 T
{
StrDelete(S,i,StrLength(T));
;
StrAssign(&s,q);
printf(" 串 s 为 : ");
StrPrint(s);
i=StrCompare(s,t);
if(i<0)
c='<';
else if(i==0)
c='=';
else
c='>';
printf(" 串 s%c串 t\n",c);
Concat(&r,t,s);
printf(" 串 t 联接串 s 产生的串 r
实验结果及分析
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; }
为: ");
StrPrint(r);
StrAssign(&s,"oo");
printf(" 串 s 为 : ");
StrPrint(s);
StrAssign(&t,"o");
printf(" 串 t 为 : ");
StrPrint(t);
Replace(&r,t,s);
printf(" 把串 r 中和串 t 相同的子
InitString(&t);
InitString(&s);
InitString(&r);
StrAssign(&t,p);
printf(" 串 t 为 : ");
StrPrint(t);
printf(" 串长为 %d 串空否? %d(1:
空
0:
否 )\n",StrLength(t),StrEmpty(t))
长度为 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++)
// 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 而腾出位置
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);
串T
Status StrAssign(HString *T, char
*chars)
{
int i,j;
if((*T).ch)
free((*T).ch); //
释放 T 原
有空间
i = strlen(chars); //
求 chars
的长度 i
if(!i)
{
// chars 的长度为 0
(*T).ch = NULL;
(*T).length = i;
}
return 1;
}
// 由串 S 复制得串 T
int StrCopy(HString *T,HString S)
{
int i;
if((*T).ch)
free((*T).ch); //
释放 T 原
有空间
(*T).ch=(char*)malloc(S.lengt
h*sizeof(char)); //
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) {
}
// 将 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
&&
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;
分配串空间
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)
总结与体会 (调试程序的心得与体会, 若实验课上未完成调试, 要认真找出错误并分析原因 等。) 调试程序时,出现了许多错误。如:串的堆分配存储结构、串的联接等。另外还 有一些语法上的错误。 由于对所学知识点概念模糊, 试验课上未能完成此次上机 作业。后来经过查阅教材,浏览网页等方式,才完成试验。这次试验出现错误最 重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。 以后要都去练 习、实践,以完善自己的不足。