数据结构之String

来源:互联网 发布:美国淘宝网站 编辑:程序博客网 时间:2024/06/16 13:58

静态表示方法

#include<iostream>using namespace std;#define MAXSTRLEN 255#define TRUE 1#define FALSE 0#define Status inttypedef unsigned char String[MAXSTRLEN]; Status StrAssign(String &T,char *chars);//创建串Status StrEmpty(String S);//判断串是否为空Status StrCompare(String S,String T);//比较串Status StrCopy(String &S,String T);//复制串int StrLength(String S);//返回串的长度Status Concat(String &T,String S1,String S2);//连接串Status SubString(String &Sub,String S,int pos,int length);//替换串int Index(String S,String T,int pos);Status Replace(String &S,String T,String V);Status StrInsert(String &S,int pos,String T);Status StrDelete(String &S,int pos,int length);void StrPrint(String S);void DestoryString(String &S);int main(){String S;//测试赋值函数if(StrAssign(S,"abcd")){printf("赋值成功\n");StrPrint(S);}//测试复制函数char t[20]="I like coding";String S1,T;StrAssign(T,t);if(StrCopy(S1,T)){printf("复制成功!\n");StrPrint(S1);}if(StrCompare(S,S1))printf("S和S1相等\n");elseprintf("S和S1不相等\n");String temp="";if(StrEmpty(temp))printf("temp为空字符串\n");elseprintf("temp不为空\n");printf("s的长度为%d\n",StrLength(S));String S2;if(Concat(S2,S,S1)){printf("连接成功  ");StrPrint(S2);}String s,V,ss;StrAssign(s,"bc");int pos=Index(S,s,1);printf("%d\n",pos);StrAssign(ss,"I am abcd haha ,you are a bitch");StrAssign(V,"heor");StrPrint(ss);if(Replace(ss,S,s)){printf("替换成功!:\n");StrPrint(ss);}//插入StrInsert(ss,2,s);StrPrint(ss);StrDelete(ss,2,2);StrPrint(ss);return 0;}Status StrAssign(String &T,char *chars){int m=strlen(chars);if(m>MAXSTRLEN)return FALSE;for(int i=0;i<m;i++)T[i+1]=chars[i];T[0]=m;return TRUE;}Status StrEmpty(String S){if(S[0]==0)return TRUE;return FALSE;}Status StrCompare(String S,String T){int i=1;if(S[0]==T[0])for(i=1;i<=S[0];i++)if(S[i]!=T[i])break;int n=S[0];if(i-1==n)return TRUE;return FALSE;}int StrLength(String S){return S[0];}Status StrCopy(String &S,String T){S[0]=T[0];for(int i=1;i<=S[0];i++)S[i]=T[i];return TRUE;}Status Concat(String &T,String S1,String S2){int uncut,i,j;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[j+i-1]=S2[j];uncut=TRUE;}else if(S1[0]<MAXSTRLEN&&S1[0]+S2[0]>MAXSTRLEN)//部分截断{T[0]=MAXSTRLEN;for(i=1;i<=S1[0];i++)T[i]=S1[i];for(j=1;j+S1[0]<=MAXSTRLEN;j++)T[i++]=S2[j];uncut=FALSE;}else if(S1[0]>=MAXSTRLEN){int i;T[0]=MAXSTRLEN;for(i=1;i<=MAXSTRLEN;i++)T[i]=S1[i];uncut=FALSE;}return uncut;}Status SubString(String &Sub,String S,int pos,int length){int flag=0;int i;if(length>S[0]-pos+1)return FALSE;Sub[0]=length;for(i=1;i<=length;i++)Sub[i]=S[i+pos-1];flag=1;return flag;}int Index(String S,String T,int pos){int m,n,i;String sub;if(pos>0){n=StrLength(S);m=StrLength(T);for(i=pos;i<=n-m+1;i++){if(SubString(sub,S,i,m))if(StrCompare(sub,T))return i;}}return FALSE;}Status Replace(String &S,String T,String V){int i,pos;if(S[0]<T[0]||S[0]<V[0])return FALSE;pos=Index(S,T,1);if(pos==0){printf("替换错误!\n");return FALSE;}else{if(T[0]==V[0])for(i=pos;i<=V[0];i++)S[i]=V[i];else if(T[0]<V[0]){int length=V[0]-T[0];for(i=S[0];i>=pos+length-1;i--)S[i+length]=S[i];for(i=pos;i<=V[0];i++)S[i]=V[i];}else if(T[0]>=V[0]){int length = T[0]-V[0];int n=StrLength(V);int m=StrLength(S);StrPrint(V);for(i=pos;i<=pos+n-1;i++)S[i]=V[i-pos+1];for(;i<=m-length;i++)S[i]=S[i+length];}}return TRUE;}Status StrInsert(String &S,int pos,String T){int i,m,n;m=StrLength(T);n=StrLength(S);if(pos<=n){for(i=n;i>=pos;i--)S[i+m]=S[i];for(i=1;i<=m;i++)S[pos+i-1]=T[i];}else{for(i=1;i<=m;i++)S[n+i]=T[i];}return TRUE;}Status StrDelete(String &S,int pos,int length){int m=StrLength(S);if(pos>m||length>m-pos+1)return FALSE;for(int i=pos;i<=m-length;i++)S[i]=S[i+length];return TRUE;}void StrPrint(String S){int n=S[0];for(int i=1;i<=n;i++)printf("%c",S[i]);printf("\n");}                                                                                                                                                  


串实际上是一个字符数组,一般第一位适用于存储字符串的长度,注意char c=2;实际上是对应存储的ASCII码,使用的时候需要直接传换成int型,int a=c就解决了。


动态表示

#include<iostream>#include<cstring>using namespace std;#define OK 1#define ERROR 0#define SSIZE 100#define Status int#define OVERFLOW 0typedef struct{char *ch;//若为空串,按长度分配int length;}HString;void StrInit(HString &S);Status StrAssign(HString &T,char *chars);int StrLength(HString S);int StrCompare(HString S,HString T);Status ClearString(HString &S);Status Concat(HString &S,HString S1,HString S2);HString SubString(HString S,int pos,int length);void StrPrint(HString S);int main(){int n;char a[100]="abc",b[100]="bcd";HString S,T,SS;StrInit(S);StrInit(T);StrInit(SS);StrAssign(S,a);StrAssign(T,b);n=StrCompare(S,T);if(n>0)printf("S>H\n");else if(n==0)printf("S=H\n");elseprintf("S<H\n");//连接操作if(Concat(SS,S,T))StrPrint(SS);elseprintf("连接失败!\n");HString V;V=SubString(SS,1,3);StrPrint(V);return 0;}void StrInit(HString &S){S.ch=NULL;S.length=0;}Status StrAssign(HString &T,char *chars){int n;n=strlen(chars);if(T.ch)free(T.ch);if(n==0){T.ch=NULL;T.length=0;}else{T.ch=(char*)malloc(n*sizeof(char));if(!T.ch)exit(ERROR);for(int i=0;i<n;i++)T.ch[i]=chars[i];T.length=n;}return OK;}int StrLength(HString S){return S.length;}int StrCompare(HString S,HString T){//if(strcmp(S,T)>0)   //这种方法不行,因为字符串结尾没有终结符,所以不能够比较//return 1;//else if(strcmp(S,T)==0)//return 0;//else//return -1;for(int i=0;i<S.length&&i<T.length;i++)if(S.ch[i]!=T.ch[i])return S.ch[i]-T.ch[i];return S.length-T.length;}Status ClearString(HString &S){if(S.ch){free(S.ch);S.ch=NULL;}S.length=0;return OK;}Status Concat(HString &S,HString S1,HString S2){int i;if(S.ch)free(S.ch);S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char));if(!S.ch)return ERROR;//申请内存失败;S.length=S1.length+S1.length;for(i=0;i<S1.length;i++)S.ch[i]=S1.ch[i];for(i=0;i<S2.length;i++)S.ch[i+S1.length]=S2.ch[i];return OK;}HString SubString(HString S,int pos,int length){HString T;StrInit(T);T.ch=(char*)malloc(length*sizeof(char));if(pos+length+1>S.length)exit(0);for(int i=pos;i<pos+length;i++)T.ch[i-pos]=S.ch[i];T.length=length;return T;}void StrPrint(HString S){for(int i=0;i<S.length;i++)printf("%c",S.ch[i]);printf("\n");}



0 0
原创粉丝点击