
第四章 串、数组和广义表 —— 顺序串的基本操作
发布日期:2021-05-06 10:56:15
浏览次数:21
分类:技术文章
本文共 4378 字,大约阅读时间需要 14 分钟。
顺序串的基本操作
#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define MAXSTRLEN 255typedef int Status;typedef int ElemType;typedef unsigned char SString[MAXSTRLEN + 1]; //0号单元存放串的长度using namespace std;Status StrAssign(SString T,char chars[]){ //赋值 //生成一个其值等于chars的串T。 int i; if(strlen(chars)>MAXSTRLEN) return ERROR; T[0]=strlen(chars); for(i=0; i<=T[0]; i++) { T[i+1]=chars[i]; } return OK;}Status StrCopy(SString T,SString S){ //复制//由串S复制得串T int i; for(i=1; i<=S[0]; i++) { T[i]=S[i]; } T[0]=S[0]; return OK;}Status StrEmpty(SString S){ //判空 if(S[0]==0) return TRUE; else return FALSE;}Status Strcompare(SString S,SString T){ //比较 //若S>T,则返回值>0,若S=T,则返回值=0;若S <0 int i; for(i=1; i<=S[0]&&i<=T[0]; i++) { if(S[i]!=T[i]) return S[i]-T[i]; } return S[0]-T[0];}Status StrLength(SString S){ //长度 return S[0];}Status Concat(SString T,SString S1,SString S2){ //连接 //用串T返回由S1和S2连接而成的新串。 int i,j; Status uncut; if(S1[0]+S2[0]<=MAXSTRLEN)//未截断 { T[0]=S1[0]+S2[0]; for(i=1; i<=S1[0]; i++) { T[i]=S1[i]; } for(j=1; j<=S2[0]; j++) { T[S1[0]+j]=S2[j]; } uncut=TRUE; } else if(S1[0] MAXSTRLEN { T[0]=MAXSTRLEN; for(i=1; i<=MAXSTRLEN; i++) { T[i]=S1[i]; } uncut=FALSE; } return uncut;}Status SubString(SString Sub,SString S,int pos,int len){ //求子串 //用Sub返回串S的第pos个字符起长度为len的子串 int i,j; if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1) return ERROR; if(!len) { Sub=NULL; Sub[0]=0; } else { for(i=1,j=pos; i<=len-1,j<=pos+len-1; i++,j++) Sub[i]=S[j]; Sub[0]=len; } return OK;}Status Index(SString S,SString T,int pos){ /*模式匹配 若主串S中存在和串T相同的子串,则返回它在主串S的第pos个 字符之后第一次出现的位置,否则函数值为0*/ int n, m,i; SString Sub; if(pos>0) { n=StrLength(S); m=StrLength(T); i=pos; while(i<=n-m+1) { SubString(Sub, S, i, m); if (Strcompare(Sub, T) != 0) ++i; else return i; } } return 0;}Status StrInsert(SString S,int pos,SString T){ //插入函数 //在串S的第pos个字符之前插入串T。 int i; if (pos<1 || pos>S[0]) return ERROR; if (S[0] + T[0] < MAXSTRLEN)//完全插入 { for (i = S[0]; i >= pos; i--) { S[i + T[0]] = S[i]; } for (i = 1; i <=T[0]; i++) { S[pos-1+i] = T[i]; } S[0] = S[0] + T[0]; return TRUE; } else { for (i = S[0]; i >= MAXSTRLEN-S[0]; i--) { S[MAXSTRLEN-S[0]+1] = S[i]; } for (i = 1; i <= MAXSTRLEN - S[0]; i++) { S[pos - 1 + i] = T[i]; } return FALSE; }}Status StrDelete(SString S,int pos,int len){ //删除 //从串S中删除第pos个字符起长度为len的子串 int i; if (pos<1 || pos>S[0]) return ERROR; else for (i = pos + len ; i<=S[0]; i++) { S[i-len] = S[i]; } S[0] -= len; return OK;}Status StrPrint(SString S){ //输出函数 int i; for (i = 1; i <= S[0]; i++) { cout << S[i]; } cout << endl; return 0;}int main(){ int pos,len; SString S1,S2,T1,T2,Sub; char a[100], b[100],c[100]; cout << "请输入两个串,分别赋值给串s1和串s2" << endl; cin >> a >> b; StrAssign(S1, a); StrAssign(S2, b); cout << "把串S1拷贝给T1,输出T1:"; StrCopy(T1, S1); StrPrint(T1); cout< 0) cout << "S1>S2" << endl; else if (Strcompare(S1, S2) < 0) cout << "S1 << endl; else cout << "S1=S2" << endl; cout< > pos>> len; if (SubString(Sub, T2, pos, len) == 1) { cout << "所选区间的子串Sub为:"; StrPrint(Sub); } else cout << "求子串失败!" << endl; cout< >c; StrAssign(Sub,c); cout<<"请输入要从哪个位置之后开始查询:"; cin>>pos; if (Index(T2,Sub,pos)) { cout<<"pos的值为:"; cout< < > pos; if (StrInsert(S1, pos, S2) == 1) { cout << "输出串S1:"; StrPrint(S1); } else cout << "插入失败" << endl; cout< > pos >> len; if (StrDelete(S1, pos, len) == 1) { cout << "输出删除后的串S1:"; StrPrint(S1); } else cout << "删除失败" << endl; return 0;}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年03月12日 23时05分56秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
jQuery练习t167,从0到1
2019-03-03
jQuery练习t271,从0到1
2019-03-03
jQuery练习t310,从0到1
2019-03-03
asp.net代码练习 work015 回调技术
2019-03-03
PHP7.0--如何使用函数的引用
2019-03-03
【JokerのZYNQ7020】LINUX_EMIO_BUTTON。
2019-03-03
傅里叶变换的初级理解三
2019-03-03
F1 score的意义
2019-03-03
python36+centos7离线安装tensorflow与talib的方法
2019-03-03
hdf5与hdfs的区别
2019-03-03
scala运行的方式
2019-03-03
isnull与isna的区别
2019-03-03
python自带超参调优包
2019-03-03
判断python模型是否安装的办法
2019-03-03
xgboost与gbdt的区别
2019-03-03
软件测试中使用coverage统计python代码的覆盖率
2019-03-03
从double到float的强制类型转换
2019-03-03
QLabel控件功能示例
2019-03-03
vue项目中报/sockjs-node/info错误
2019-03-03
20个非常有用的Java程序片段
2019-03-03