串的定长顺序存储表示

来源:互联网 发布:网络创世纪手机版安卓 编辑:程序博客网 时间:2024/05/22 07:05

串的定长顺序存储表示是一种类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。

在实现时主要实现以下功能:

int Length(SString s);                               //串长

bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串

void PrintString(char T[]);                          //输出

bool StringAssign(SString T,const char str[]);       //生成值为str的串

bool StrCopy(SString T, SString s);                  //将s拷贝到T

bool StrEmpty(SString T);                            //判空

int StrCompare(SString T,SString T1);                //比较

void ClearString(SString T);                         //清除

bool SubString(SString T,SString S,int pos,int len); //返回子串

bool StrInsert(SString S,int pos,SString T);         //插入
 
bool StrDelete(SString S,int pos,int len);           //删除


但是对于Replace()函数和Index()函数我仍有不懂得地方,故这里不进行编写。


具体的代码如下:

头文件:

#pragma once#include<iostream>using namespace std;#define MAX_STRING_SIZE 8typedef char SString[MAX_STRING_SIZE+1];int Length(SString s);                               //串长bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串void PrintString(char T[]);                          //输出bool StringAssign(SString T,const char str[]);       //生成值为str的串bool StrCopy(SString T, SString s);                  //将s拷贝到Tbool StrEmpty(SString T);                            //判空int StrCompare(SString T,SString T1);                //比较void ClearString(SString T);                         //清除bool SubString(SString T,SString S,int pos,int len); //返回子串bool StrInsert(SString S,int pos,SString T);         //插入 bool StrDelete(SString S,int pos,int len);           //删除


函数声明:

#include "String.h"int Length(SString s){return strlen(s);}bool StringConcat(SString T, SString s1, SString s2){int t_length = MAX_STRING_SIZE;int s1_length = Length(s1);int s2_length = Length(s2);if(t_length >= s1_length+s2_length){for(int i=0; i<s1_length; ++i){T[i] = s1[i];}for(int j=0; j<s2_length; ++j){T[i+j] = s2[j];}T[i+j] = '\0';return true;}else if(t_length>s1_length && t_length<s1_length+s2_length){for(int i=0; i<s1_length; ++i){T[i] = s1[i];}for(int j=0; j<t_length-s1_length; ++j){T[i+j] = s2[j];}T[i+j] = '\0';return false;}else if(t_length < s1_length){for(int i=0;i<t_length;++i){T[i] = s1[i];}T[i] = '\0';}return true;}void PrintString(char T[]){cout<<T<<endl;}bool StringAssign(SString T,const char str[]){for(int i=0;str[i] != '\0';++i){T[i] = str[i];}T[i] = '\0';return true;}bool StrCopy(SString T, SString s){int t_length = MAX_STRING_SIZE;int s_length = Length(s);if(s_length <= t_length){for(int i = 0;i < s_length;++i){T[i] = s[i];}T[i] = '\0';}else{for(int i = 0;i < t_length;++i){T[i] = s[i];}T[i] = '\0';}return true;}bool StrEmpty(SString T){if(Length(T) == 0){cout<<"串为空"<<endl;return true;}else{cout<<"串不为空"<<endl;return false;}}int StrCompare(SString T,SString T1){for(int i=0,j=0;i<Length(T),j<Length(T1);++i,++j){if(T[i]-'0' > T1[j]-'0'){return 1;}else if(T[i]-'0' == T1[j]-'0'){return 0;}else{return -1;}}exit(-1);}void ClearString(SString T){T[0] = '\0';}bool SubString(SString T,SString S,int pos,int len){if(pos > Length(S) || pos < 1 || len < 0 ){return false;}else if(len > Length(S)-pos+1){cout<<"无法返回,返回原始字符串:";for(int i=pos-1;i<Length(S);++i){T[i] = S[i];}T[i]='\0';}else{for(int i=pos-1;i<pos+len-1;++i){T[i] = S[i];}T[i]='\0';}return true;}bool StrInsert(SString S,int pos,SString T){if(pos < 1 || pos > Length(S)+1){return false;}else{for(int i = Length(S);i>=pos-1;--i){S[i+Length(T)] = S[i];}for(i  = 0;i < Length(T);++i){S[pos+i-1] = T[i];}}return true;}bool StrDelete(SString S,int pos,int len){if(pos < 0 || pos > Length(S)|| len < 0){return false;}else if(pos > Length(S)-len+1){S[pos-1] = '\0';}else{for(int i = pos+len;i <= Length(S)-1;++i){S[i-len] = S[i];}S[Length(S)-len] = '\0';}return true;}


测试文件:

#include"String.h"void main(){SString T;char str[] = "bit";SString s1 = "hello";SString s2 = "world";StrInsert(s1,2,s2);PrintString(s1);SubString(T,s1,1,6);PrintString(T);StringConcat(T,s1,s2);PrintString(T);StrCopy(T,s1);PrintString(T);StringAssign(T,str);PrintString(T);StrDelete(s2,1,1);PrintString(s2);StrEmpty(T);if(StringAssign(s1,s2)==1){cout<<"前串大于后串"<<endl;}else if(StringAssign(s1,s2)==0){cout<<"前串等于后串"<<endl;}else{cout<<"前串小于后串"<<endl;}ClearString(T);    StrEmpty(T);}


希望大家能够指出我的不足,谢谢~我会努力改进的。

经过今天的学习,我对于串的定长顺序存储表示有了新的理解,特改正如下,并附上Index()和Replace()的函数实现过程。

头文件:

#pragma once#include<iostream>#include<assert.h>using namespace std;#define MAX_STRING_SIZE 8typedef char SString[MAX_STRING_SIZE+1];int Length(SString s);                               //串长bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串void PrintString(char T[]);                          //输出bool StringAssign(SString T,const char *str);       //生成值为str的串bool StrCopy(SString T, SString s);                  //将s拷贝到Tbool StrEmpty(SString T);                            //判空int StrCompare(SString T,SString T1);                //比较void ClearString(SString T);                         //清除void DestroyString(SString T);                       //摧毁bool SubString(SString T,SString S,int pos,int len); //返回子串bool StrInsert(SString S,int pos,SString T);         //插入 bool StrDelete(SString S,int pos,int len);           //删除int Index(SString T,SString S,int pos);              //匹配int Replace(SString S,SString T,SString V);          //替换


函数定义:

#include "String.h"int Length(SString s){return strlen(s);}bool StringConcat(SString T, SString s1, SString s2){int t_length = MAX_STRING_SIZE;int s1_length = Length(s1);int s2_length = Length(s2);if(t_length >= s1_length+s2_length){for(int i=0; i<s1_length; ++i){T[i] = s1[i];}for(int j=0; j<s2_length; ++j){T[i+j] = s2[j];}T[i+j] = '\0';return true;}else if(t_length>s1_length && t_length<s1_length+s2_length){for(int i=0; i<s1_length; ++i){T[i] = s1[i];}for(int j=0; j<t_length-s1_length; ++j){T[i+j] = s2[j];}T[i+j] = '\0';return false;}else if(t_length < s1_length){for(int i=0;i<t_length;++i){T[i] = s1[i];}T[i] = '\0';}return true;}void PrintString(char T[]){cout<<T<<endl;}bool StringAssign(SString T,const char *str){assert(str != NULL);for(int i=0;i<strlen(str);++i)/*str[i] != '\0'*/{T[i] = str[i];}T[i] = '\0';return true;}bool StrCopy(SString T, SString s){for(int i=0;i<Length(s);++i)/*str[i] != '\0'*/{T[i] = s[i];}T[i] = '\0';return true;}bool StrEmpty(SString T){return Length(T) == 0;}int StrCompare(SString T,SString S){int result = 0;while(*T != '\0' || *S != '\0'){result = *T-*S;if(result != 0){break;}T++;S++;}if(result < 0){return -1;}else if(result > 0){return 1;}else{return 0;}}/*int StrCompare(SString T,SString S){while(*T != '\0' && *S != '\0'){if(*T > *S){return 1;}else if(*T < *S){return -1;}else{T++;S++;}}if(*T == '\0' && *S == '\0'){return 0;}else if(*T != '\0' && *S == '\0'){return 1;}else{return -1;}}*/void ClearString(SString T){T[0] = '\0';}void DestroyString(SString T){T[0] = '\0';}bool SubString(SString T,SString S,int pos,int len){if(pos > Length(S) || pos < 1 || len < 0 ){return false;}else if(len > Length(S)-pos+1){cout<<"无法返回,返回原始字符串:";for(int i=pos-1;i<Length(S);++i){T[i] = S[i];}T[i]='\0';}else{for(int i=pos-1;i<pos+len-1;++i){T[i] = S[i];}T[i]='\0';}return true;}bool StrInsert(SString S,int pos,SString T){if(pos < 0 || pos > Length(S)){return false;}else{for(int i = Length(S);i>=pos-1;--i){S[i+Length(T)] = S[i];}for(i  = 0;i < Length(T);++i){S[pos+i-1] = T[i];}}return true;}bool StrDelete(SString S,int pos,int len){if(pos < 0 || pos > Length(S)|| len < 0){return false;}else if(pos > Length(S)-len+1){S[pos-1] = '\0';}else{for(int i = pos+len;i <= Length(S)-1;++i){S[i-len] = S[i];}S[Length(S)-len] = '\0';}return true;}int Index(SString S,SString T,int pos)//串的定位操作(在主串S中的第pos个位置开始查找子串T,如果主串S中存在与串T值相等的子串,返回子串在主串第pos个字符后第一次出现的位置){int i,j;if(StrEmpty(T)){return 0;}i = pos;j = 0;while(i < Length(S) && j < Length(T)){if(S[i] == T[j]){i++;j++;}else//如果当前对应位置的字符不相等,则从串S的下一个字符开始,从T的第0个字符开始比较{i = i-j+1;j = 0;}}if(j >= Length(T))//如果在串S中找到串T,则返回子串T在主串S中的位置{return i-j+1;}else{return -1;}}int Replace(SString S,SString T,SString V)//串的替换操作(如果串S中存在子串T,则用V替换串S中的所有子串T){int i = 0;int flag;if(StrEmpty(T)){return 0;}do{i = Index(S,T,i);//利用串的定位操作在串S中查找T的位置if(i){StrDelete(S,i,Length(T));//如果找到子串T,则将S中的串T删除flag = StrInsert(S,i,V);if(!flag)//将V插入{return 0;}i += Length(V);}}while(i);return 1;}



测试函数:

#include"String.h"void main(){char *s3 = "abbaba";char *s4 = "ba";char *str ="bit";char *s1 = "hello";char *s2 = "world";SString T;SString S;SString D;SString E;SString F;SString T1;SString S1;StringAssign(T1,s3);StringAssign(S1,s4);cout<<Index(T1,S1,0)<<endl;StringAssign(T,s1);StringAssign(S,s2);StringAssign(D,str);Replace(T1,S1,D);PrintString(T1);StrInsert(T,2,S);PrintString(T);SubString(E,T,1,6);PrintString(E);StringConcat(F,T,S);PrintString(F);StrCopy(T,S);PrintString(T);StrDelete(S,1,1);PrintString(S);StrEmpty(T);if(StringAssign(T,S)==1){cout<<"前串大于后串"<<endl;}else if(StringAssign(T,S)==0){cout<<"前串等于后串"<<endl;}else{cout<<"前串小于后串"<<endl;}ClearString(T);    StrEmpty(T);}


如果还有需要改进的地方我会继续改进的,谢谢大家。

0 0
原创粉丝点击