字符串ADT定义与实现.docx
- 文档编号:5126030
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:12
- 大小:17.35KB
字符串ADT定义与实现.docx
《字符串ADT定义与实现.docx》由会员分享,可在线阅读,更多相关《字符串ADT定义与实现.docx(12页珍藏版)》请在冰豆网上搜索。
字符串ADT定义与实现
计算机实验:
字符串ADT定义与实现
目的
掌握字符串的定义及基本操作的实现。
问题描述
用堆存储方式保存字符串,实现字符串的各种基本操作,包括赋值、替换、取子串、串连接等。
步骤
1. 用C语言定义字符串的ADT和基本操作。
2. 实现赋值、替换、取子串、串连接等操作。
3. 测试自己完成的练习,观察每个操作的执行效果。
设备和环境
PC计算机、Windows操作系统、C/C++开发环境
结论
能够理解并掌握字符串的定义和堆存储方式的实现方法。
思考题
1. 估算各个操作的复杂度和空间利用效率。
#include
#include
#define OK1
#define ERROR0
#define OVERFLOW-1
#define NOTFOUND-2
#define MAXLEN10000 //每次读入的字符串的最大长度
#define MAXCMD20 //每个命令的最大长度
#define MAXN10 //字符串的最大个数
typedef struct
{
char *ch; //若是非空串,则按串长分配储存区,否则ch为NULL
int length; //串长度
}String;
int StrAssign(String&T,char *chars)
{
if (T.ch)free(T.ch);
int i,len;
for (len=0;chars[len];len++); //计算chars的长度存入len
if (!
len)
{
T.ch=NULL;
T.length=0;
}
else
{
if (!
(T.ch=(char*)malloc(len*sizeof(char)))) return OVERFLOW;
for (i=0;i T.length=len; } return OK; } int StrLength(StringT) { return T.length; } int StrCompare(StringT,StringS) { int i; for (i=0;i if (T.ch[i]! =S.ch[i]) return T.ch[i]>S.ch[i]? 1: -1; return T.length-S.length; } int StrClear(String&T) { if (T.ch){free(T.ch);T.ch=NULL;} T.length=0; return OK; } int StrConcat(String&T,StringS1,StringS2) { if (T.ch)free(T.ch); if (! (T.ch=(char*)malloc(sizeof(char)*(S1.length+S2.length)))) return OVERFLOW; int i; for (i=0;i T.ch[i]=S1.ch[i]; for (i=0;i T.ch[i+S1.length]=S2.ch[i]; T.length=S1.length+S2.length; return OK; } int StrSub(String&T,StringS,int pos,int len) { if (pos<0||pos>=S.length||len<0||pos+len-1>S.length-1) return ERROR; //输入数据不合法 if (T.ch)free(T.ch); if (! len) { T.ch=NULL; T.length=0; } else { if (! (T.ch=(char*)malloc(len*sizeof(char)))) return OVERFLOW; int i; for (i=0;i T.ch[i]=S.ch[pos+i]; T.length=len; } return OK; } int StrCover(String&T,int pos,char *chars) { if (pos>T.length-1) return ERROR; //输入数据不合法 int i,len; for (len=0;chars[len];len++); if (pos+len-1>T.length-1) if (! (T.ch=(char*)realloc(T.ch,(pos+len)*sizeof(char)))) return OVERFLOW; else T.length=pos+len; for (i=0;i return OK; } int StrFind(StringT,char *S1) { int i,j; for (i=0;i { for (j=0;i+j if (T.ch[i+j]! =S1[j]) break; if (! S1[j]) return i; //表示已经找到可行的起始位置 } return NOTFOUND; //没有找到可行的起始位置,返回-1 } int StrReplace(String&T,char *S2,char *S1) { int pos,i,len1,len2; for (len1=0;S1[len1];len1++); //计算串S1的长度 for (len2=0;S2[len2];len2++); //计算串S2的长度 while (1) //判断T串中是否存在串S1 { pos=StrFind(T,S1); if (pos==NOTFOUND) break; if (len1==len2) //当串S1与串S2一样长时,可以直接替换 { for (i=pos;i T.ch[i]=S2[i-pos]; } else if (len1 { if (! (T.ch=(char*)realloc(T.ch,(T.length+len2-len1)*sizeof(char)))) return OVERFLOW; for (i=T.length-1;i>=pos+len1;i--)T.ch[i+len2-len1]=T.ch[i]; for (i=pos;i T.length+=len2-len1; } else if (len1>len2) //当串S2小于串S1时,先将T串的S1串后面的串往前移,返回将S2串覆盖T串中的S1串 { for (i=pos+len1;i for (i=pos;i T.length-=len1-len2; } } return OK; } int StrPrint(StringT) { int i; if (T.length) { for (i=0;i printf("\n"); } else printf("NothingtoPrint.\n"); return OK; } int CharsCompare(char *T,char *S) { int i; for (i=0;T[i]&&S[i];i++) if (T[i]! =S[i]) return T[i]>S[i]? 1: -1; return T[i]? 1: 0; } int main() { char cmd[MAXCMD]={0}; //命令 int ret; //函数的返回值 StringS[MAXN]={0},*p,*pa,*pb; //S: 字符串 p: 指向字符串的指针 char tmp[MAXLEN]={0},tmpa[MAXLEN]={0},tmpb[MAXLEN]={0}; char Sn[3],Sa[3],Sb[3]; printf("***********************************************\n"); printf("每次读入的字符串的最大长度: %d\n",MAXLEN); printf("可操作的字符串的个数为: %d(即编号为: %d~%d)\n",MAXN,0,MAXN-1); printf("请保证输入格式的正确性O(∩_∩)O~\n"); printf("***********************************************\n"); while (1) { scanf("%s",cmd);//读入命令项 if (cmd[0]=='#') break; //询问已完成 if (! CharsCompare(cmd,"StrAssign\0")) { scanf("%s",Sn); //对Sn字符串进行操作 scanf("%s",tmp); //chars的初始值 p=&S[Sn[1]-'0']; ret=StrAssign(*p,tmp); } else if (! CharsCompare(cmd,"StrLength\0")) { scanf("%s",Sn); p=&S[Sn[1]-'0']; ret=StrLength(*p); printf("%s'slengthis%d.\n",Sn,ret); ret=OK; } else if (! CharsCompare(cmd,"StrCompare\0")) { scanf("%s%s",Sa,Sb); pa=&S[Sa[1]-'0'];pb=&S[Sb[1]-'0']; ret=StrCompare(*pa,*pb); printf("%s",Sa); if (ret==0)printf("="); else if (ret==1)printf(">"); else if (ret==-1)printf("<"); printf("%s\n",Sb); ret=OK; } else if (! CharsCompare(cmd,"StrClear\0")) { scanf("%s",Sn); p=&S[Sn[1]-'0']; ret=StrClear(*p); } else if (! CharsCompare(cmd,"StrConcat\0")) { scanf("%s%s%s",Sn,Sa,Sb); p=&S[Sn[1]-'0'];pa=&S[Sa[1]-'0'];pb=&S[Sb[1]-'0']; ret=StrConcat(*p,*pa,*pb); if (ret==OK)StrPrint(*p); } else if (! CharsCompare(cmd,"StrSub\0")) { int pos,len; scanf("%s%s%d%d",Sa,Sb,&pos,&len); pa=&S[Sa[1]-'0'];pb=&S[Sb[1]-'0']; ret=StrSub(*pb,*pa,pos,len); if (ret==OK)StrPrint(*pb); } else if (! CharsCompare(cmd,"StrCover\0")) { int pos; scanf("%s%d%s",Sn,&pos,tmp); p=&S[Sn[1]-'0']; ret=StrCover(*p,pos,tmp); if (ret==OK)StrPrint(*p); } else if (! CharsCompare(cmd,"StrFind\0")) { scanf("%s%s",Sn,tmp); p=&S[Sn[1]-'0']; ret=StrFind(*p,tmp); if (ret! =NOTFOUND)printf("In%s,the%dthisequalto%s\n",Sn,ret,tmp); else printf("NotFound\n"); ret=OK; } else if (! CharsCompare(cmd,"StrReplace\0")) { scanf("%s%s%s",Sn,tmpa,tmpb); p=&S[Sn[1]-'0']; ret=StrReplace(*p,tmpa,tmpb); if (ret==OK)StrPrint(*p); } else if (! CharsCompare(cmd,"StrPrint\0")) { scanf("%s",Sn); p=&S[Sn[1]-'0']; ret=StrPrint(*p); } else { printf("TheCommandisError.\n"); } if (ret==OK)printf("ThisCommandisSuccessful.\n\n"); else if (ret==ERROR)printf("TheinputdataisError.\n\n"); else if (ret==OVERFLOW)printf("OVERFLOW.\n\n"); } return 0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符串 ADT 定义 实现