串的三种实现方式

#include<iostream>
using namespace std;
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSTRLEN 10
typedef struct{
unsigned char str[MAXSTRLEN+1];
int length;//用来存放串的实际大小
}SString;
int Concat(SString &T,SString S1,SString S2){
if(S1.length+S2.length<MAXSTRLEN)
{ int i=0;
        while(i<S1.length)
{T.str[i]=S1.str[i];i++;}
int j=0;
while(j<S2.length)
{ T.str[i]=S2.str[j];
i++;j++;
}
T.str[i]='\0';//注意设置\0
}
else if(S1.length<MAXSTRLEN&&S1.length+S2.length>MAXSTRLEN)
{int i=0;
while(i<S1.length)
{T.str[i]=S1.str[i];i++;}
int j=0;
while(j<MAXSTRLEN-S1.length)
{T.str[i]=S2.str[j];i++;j++;}
T.str[i]='\0';//注意设置\0
}
else {
int i=0;
        while(i<MAXSTRLEN)
{T.str[i]=S1.str[i];i++;}
T.str[i]='\0';//注意设置\0
}return OK;
}
int SubString(SString&L,SString S,int len,int pos)
{int i=pos;int j;
for(j=0;j<len;j++,i++ )
L.str[j]=S.str[i-1];
L.str[j]='\0';
L.length=len;
return OK;
}
int InitSString(SString &L){
cin>>L.str;
cout<<"str="<<L.str<<endl;
int i=0;
while(L.str[i]) i++; L.length=i;
cout<<L.length<<endl;
return 0;
}
//====================================以上是串的定长顺序存储表示===================


//串的堆分配存储表示
typedef struct {
int length;
char *ch;
}Hstring;
int strAssign(Hstring&T,char *chars){//开辟空间
int i=0;
while(chars[i]) i++;
T.ch=(char*)malloc(i*sizeof(char));
if(!T.ch)exit(OVERFLOW);
for(int j=0;j<i;j++)T.ch[j]=chars[j];T.length=i;
return 0;}
int Strlength(Hstring T){
return T.length;
}
int clearstring(Hstring&L){//清空
if(L.ch)free(L.ch);
L.ch=0;L.length=0;
return 0;}


int Concat(Hstring &A,Hstring B,Hstring C)//合并
{
A.ch=(char*)malloc((B.length+C.length)*sizeof(char));
if(!A.ch)exit(OVERFLOW);int i=0;for(i;i<B.length;i++)A.ch[i]=B.ch[i];for(int j=0;j<C.length;j++,i++)A.ch[i]=C.ch[j];

A.length=B.length+C.length;
return 0;
}
int Substring(Hstring&T,Hstring S,int pos,int len){//用串T返回串S位置pos长度为len
T.ch=(char*)malloc(len*sizeof(char));
T.length=len;
int j;
for(j=0;j<len;j++,pos++){
T.ch[j]=S.ch[pos-1];
}return 0;
}
int printf(Hstring L){//输出
for(int y=0;y<L.length;y++)
cout<<L.ch[y];
return 0;}


int strcompare(Hstring S,Hstring H )//若S>H,返回值>0;若S=H,返回值=0;若S<H,返回值<0
{for(int i=0;i<S.length&&i<H.length;i++)
if(S.ch[i]!=H.ch[i]){break;}
if(i>=S.length||i>=H.length) return S.length-H.length;
else return S.ch[i]-H.ch[i];
}
//==================以上是串的堆分配存储表示=================================


#define CHUNKSIZE 80
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk*next;
}Chunk;
typedef struct{
Chunk*head,*tail;
int curlen;
}Lstring;


//=================以上是串的块链存储表示=====================================


//以下主函数实现前两种表达式
int  main(){
SString b,S,M,N,L;
cout<<"设置数据"<<endl;
cout<<"L.str=";
InitSString(L);
cout<<"设置数据"<<endl;
cout<<"S.str=";
InitSString(S);
cout<<"设置数据"<<endl;
cout<<"M.str=";
InitSString(M);
cout<<"合并M和S:";
    Concat(b,M,S);cout<<b.str<<endl;
cout<<"从s的第二个数取四个单位长度数据:";
SubString(N,S,4,2);cout<<N.str<<endl;
Hstring A,B,C;char*ch="bfcdefghijkl";
strAssign(A,ch);cout<<"A:";printf(A);cout<<endl;
strAssign(B,ch);cout<<"B:";printf(B);cout<<endl;
Concat(C,A,B);cout<<"C:";printf(C);cout<<endl;
cout<<"比较C与A的大小:";cout<<strcompare(C,A)<<endl;
Substring(C,A,2,5);cout<<"从A的第二个数取五个单位长度数据:"<<"C:";printf(C);cout<<endl;
cout<<"比较C与A的大小:";cout<<strcompare(C,A)<<endl;
return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下载好代码后直接在linux环境下减压,make之后即可产生可执行代码,压缩文件中已经包含了可执行代码。 通过的堆分配存储结构来实现的以下功能: //生成一个值等于常量chars的string int StrAssign(HString *str,char *chars); //返回string的长度 int StrLength(HString str); //比较两个的大小,如果str1 > str2,返回值>0,如果相等,返回0,如果str1 < str2,返回值<0 int StrCompare(HString str1,HString str2); //清空,释放所占用的空间 int ClearString(HString *str); //返回Str1和Str2联合而成的 HString Concat(HString str1,HString str2); //返回str的第pos个字符之后的长度为len的子 HString SubString(HString str,int pos,int len); //显示字符 int StrTrave(HString str); //-----------------------附加操作函数-------------------------- //以下操作可由基本操作来实现 //str1复制得到str2 int StrCopy(HString str1,HString *str2); //str为空,返回1,否则返回0 int StrEmpty(HString str); //如果主str中存在和substr相等的子,则返回子在主中pos个字符之后第一次出现的位置 ,运用了KMP算法 int Index(HString str,HString substr,int pos); //Index中包括了一个静态函数get_next(),这个函数可以得到字符的最简匹配值(kmp算法中字符匹配失败后的下一个最佳匹配值) //用字符Tstr替换主str中出现的所有与substr相等的子 int StrReplace(HString **str,HString substr,HString Tstr); //在str的第pos个字符之后插入substr int StrInsert(HString *str,HString substr,int pos); //从str的第pos个字符起删除len个字符 int StrDelete(HString **str,int pos,int len); //销毁现有str int StrDestory(HString *str);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值