C语言数据结构串的基本操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
char *ch; // 若是非空串 , 则按
串长分配存储区 , 否则 ch 为 NULL
int length; //
串长度
}HString;
// 初始化 ( 产生空串 ) 字符串 T
void InitString(HString *T)
{
(*T).length=0;
(*T).ch=NULL;
}
// 生成一个其值等于串常量 chars 的
(*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; for(i=0;i<T.length;i++)
printf("%c",T.ch[i]); printf("\n"); }
int main() {
int i; char c,*p="God luck!"; HString t,s,r;
bye!",*q="God
// HString 类型必需初始化
InitString(&t);
InitString(&s);
InitString(&r);
StrAssign(&t,p);
printf(" 串 t 为 : ");
StrPrint(t);
printf(" 串长为 %d 串空否? %d(1:
空
0:
否 )\n",StrLength(t),StrEmpty(t))
(*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)); //
实验九串的基本操作
#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
(*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 的子串
长度为 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); //
}
// 将 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
释放旧
空间
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++)
(*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];
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) {
{
if(S.length == 0 && S.ch ==
NULL)
return 1;
else
return 0;
}
// 若 S>T,则返回值 >0; 若 S=T,则返回
值 =0; 若 S<T,则返回值 <0
int StrCompare(HString S,HString
T)
{
int i;
for(i=0;i<S.length
总结与体会 (调试程序的心得与体会, 若实验课上未完成调试, 要认真找出错误并分析原因 等。) 调试程序时,出现了许多错误。如:串的堆分配存储结构、串的联接等。另外还 有一些语法上的错误。 由于对所学知识点概念模糊, 试验课上未能完成此次上机 作业。后来经过查阅教材,浏览网页等方式,才完成试验。这次试验出现错误最 重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。 以后要都去练 习、实践,以完善自己的不足。
;
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
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));
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 为 : ");
&&
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)
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 个字符起
实验结果及分析
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; }
串用串 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 为: ",
if(StrCompare(sub,T)!=0)//
将
求得的子串与 T 对比,若不等则 i++
++i;
else
return i;
}
}
return 0;
}
// 在串 S 的第 pos 个字符之前插入串
Ts
int 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 而腾出位置
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 个位置开始求得子串
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
StrInsert(S,i,V);
//
在原串 T 的位置插入串 V
i+=StrLength(V); //
在
插入的串 V 后面继续查找串 T
}
}while(i);
return 1;
}
void DestroyString() {
// 堆分配类型的字符串无法销毁 }
// 输出 T 字符串 void StrPrint(HString T) {
为: ");
StrPrint(r);
StrAssign(&s,"oo");
printf(" 串 s 为 : ");
StrPrint(s);
StrAssign(&t,"o");
printf(" 串 t 为 : ");
StrPrint(t);
Replace(&r,t,s);
printf(" 把串 r 中和串 t 相同的子
串T
Status StrAssign(HString *T, char
*chars)
{
int i,j;
if((*T).ch)
free((*T).ch); //
释放 T 原
有空间
i = strlen(chars); //
求 chars
的长度 i
Fra Baidu bibliotek
if(!i)
{
// chars 的长度为 0
(*T).ch = NULL;