串的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串的基本操作
一、实验目的、意义
(1)理解串的堆分配存储结构。
(2)理解用它们表示时插入,生成串,联接串与求子串的算法。
(3)根据具体问题的需要,能够设计出相关算法。
二、实验内容及要求
说明1:学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
具体要求:
定义串的堆分配存储,完成串的基本操作:插入,生成串,联接串,求子串等。
三、实验所涉及的知识点
C语言算法、循环算法、串的堆分配存储结构、插入,生成串,联接
串与求子串的算法。
四、实验结果及分析
(所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。
)
五、总结与体会
(调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。
)
调试程序时,出现了许多错误。
如:串的堆分配存储结构、串的联接等。
另外还有一些语法上的错误。
由于对所学知识点概念模糊,试验课上未能完成此次上机作业。
后来经过查阅教材,浏览网页等方式,才完成试验。
这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。
以后要都去练习、实践,以完善自己的不足。
六、程序清单(包含注释)
#include <>
#include <>
#include <>
typedef char Status;
int strlen(char *p)
{
int i=0;
while(*p++)i++;
return i;
}
typedef struct
{
char *ch; ength=0;
(*T).ch=NULL;
}
h)
free((*T).ch); h = NULL;
(*T).length = 0;
}
else
{
h = (char*)malloc(i*sizeof(char)); h) h[j] = chars[j];
(*T).length = i;
}
return 1;
}
h)
free((*T).ch); h=(char*)malloc*sizeof(char)); h) h[i]=[i];
(*T).length=;
return 1;
}
h)
{
free((*S).ch);
(*S).ch=NULL;
}
(*S).length=0;
return 1;
}
h)
free((*T).ch); ength=+;
(*T).ch=(char *)malloc((*T).length*sizeof(char)); h) exit(0);
for(i=0;i<;i++) h[i]=[i];
for(i=0;i<;i++) h[+i]=[i];
return 1;
}
h)
free((*Sub).ch); h=NULL;
(*Sub).length=0;
}
else
{ h=(char*)malloc(len*sizeof(char));
if(!(*Sub).ch)
exit(0);
for(i=0;i<=len-1;i++)
(*Sub).ch[i]=[pos-1+i];
(*Sub).length=len;
}
return 1;
}
ength+1) h = (char*)realloc((*S).ch,
((*S).length+*sizeof(char));
if(!(*S).ch)
exit(0);
for(i=(*S).length-1;i>=pos-1;--i) h[i+]=(*S).ch[i];
for(i=0;i<;i++)
(*S).ch[pos-1+i]=[i]; ength+=;
}
return 1;
}
ength<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的第一个字符起查找串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)); // 删除该串T
StrInsert(S,i,V); // 在原串T的位置插入串V
i+=StrLength(V); // 在插入的串V后面继续查找串T }
}while(i);
return 1;
}
void DestroyString()
{
// 堆分配类型的字符串无法销毁
}
// 输出T字符串
void StrPrint(HString T)
{
int i;
for(i=0;i<;i++)
printf("%c",[i]);
printf("\n");
}
int main()
{
int i;
char c,*p="God bye!",*q="God luck!";
// 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='=';
else
c='>';
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为: ", ;
StrPrint(s);
StrCopy(&t,r);
printf("复制串t为串r,串t为: ");
StrPrint(t);
StrInsert(&t,6,s);
printf("在串t的第6个字符前插入串s后,串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;
}。