数据结构串的堆分配的基本操作
函数
Status InitString(HString &T)
Status StrAssign(HString &T,char *chars)
Status StrLength(HString S)
Status StrCompare(HString S,HString T)
void ClearString(HString S,HString T)
Status printStr(HString S)
HString ConcatString(HString &S,HString S1,HString S2)
Status SubString(HString Sub,HString S,int pos,int len)
int Index(HString S,HString T,int pos)
HString StrInsert(HString S,int pos,HString T)
HString StrDelete(HString S,int pos,int len)
Status Replace(HString S,HString T,HString V)
直接放代码:
#include<stdio.h>
#include<stdlib.h>
#include<String.h>
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int Status ;
typedef struct{
char *ch;
int length;
}HString;
Status InitString(HString &T){
T.ch=NULL;
T.length=0;
return OK;
}
Status StrAssign(HString &T,char *chars){
int i=0;
char *c;
if (T.ch )
free(T.ch );
for(c = chars; *c; ++c){
i++;
}
if(!i){
T.ch = NULL;
T.length = 0;
}else{
if(!(T.ch = (char *)malloc (i*sizeof (char)))){
exit(OVERFLOW);
}
for(int j=0;j<i;j++){
T.ch[j]=chars[j];
}
T.length = i;
}
return OK;
}
Status StrLength(HString S){
return S.length ;
}
Status StrCompare(HString S,HString T){
int i;
for(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 ;
}
void ClearString(HString S,HString T){
if(S.ch){
free(S.ch );
S.ch = NULL;
}
S.length = 0;
}
Status printStr(HString S){
for(int i=0;i<=S.length-1;i++){
printf("%c",S.ch[i]);
}
return OK;
}
HString ConcatString(HString &S,HString S1,HString S2){
if(S.ch){
free(S.ch);
}
if(!(S.ch = (char *)malloc ((S1.length +S2.length)*sizeof (char)))){
exit(OVERFLOW );
}
for(int i=0; i < S1.length;i++){
S.ch[i] = S1 .ch[i];
}
S.length = S1.length+S2.length ;
for(int i = S1.length;i < S.length;i++){
S.ch[i] = S2.ch [i-S1.length];
}
return S;
}
Status SubString(HString Sub,HString S,int pos,int len){
int i,j;
if(pos<1 || pos > S.length || len <0 || len>S.length-pos+1 ){
return ERROR ;
}
if(Sub.ch){
free(Sub.ch);
}
if(!len){
Sub.ch = NULL;
Sub.length = 0;
}else{
Sub.ch = (char *)malloc (len * sizeof (char));
for(i=0,j=pos-1;i<len-1,j<=pos+len-2;i++,j++){
Sub.ch[i] = S.ch[j];
}
Sub.length = len;
}
printStr(Sub);
return OK;
}
int Index(HString S,HString T,int pos){
int i=pos-1,j=0;
while(i < S.length && j<T.length){
if( S.ch[i]==T.ch[j] ){
i++;
j++;
}
else{
i=i-j+1;
j=0;
}
}
if(j>=T.length)
return i-j+1;
else
return 0;
}
HString StrInsert(HString S,int pos,HString T){
int i;
if(pos<1||pos>S.length+1){
exit(OVERFLOW);
}
if(!(S.ch = (char *)realloc (S.ch,(S.length+T.length)*sizeof(char)))){
exit(OVERFLOW);
}
for(i =StrLength(S);i>=pos-1;i--){
S.ch[i+T.length] = S.ch[i];
}
for(i = pos-1; i <= pos+T.length-2; i++){
S.ch[i] = T.ch[i-pos+1];
}
S.length=S.length+T.length;
return S;
}
HString StrDelete(HString S,int pos,int len){
int i;
if (pos<1 || pos>S.length - len + 1 || len < 0)
exit(OVERFLOW);
for (i = pos + len -1 ; i <= S.length -1 ; i++){
S.ch[i - len] = S.ch[i];
}
S.length =S.length-len;
return S;
}
Status Replace(HString S,HString T,HString V){
int pos= 0;
if(S.length <=0)
return ERROR;
do{
pos=Index(S,T,pos);
if(pos){
StrDelete(S,pos,StrLength(T));
StrInsert(S,pos,V);
}
}while(pos);
return OK;
}
int main(){
HString Str,S,T,S1,S2,V,Sub;
S.ch=NULL;
S.length=0;
S1.ch=NULL;
S1.length=0;
S2.ch=NULL;
S2.length=0;
T.ch=NULL;
T.length=0;
Str.ch=NULL;
Str.length=0;
V.ch=NULL;
V.length=0;
Sub.ch=NULL;
Sub.length=0;
char s[100],s1[100],s2[100],str[100],v[100];
int pos=3,len=2;
printf("请输入一个字符串S: ");
gets_s(s);
if(StrAssign (T,s))
printf("字符串的长度为:%d\n",StrLength(T));
printf("比较串的大小: ");
printf("%d\n",StrCompare(S,T));
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("将S串清空\n");
ClearString(S,T);
printf("S串已清空\n");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("用T连接有s1和s2生成的新串: \n");
printf("请输入第一个字符串s1: ");
gets_s(s1);
StrAssign(S1,s1);
printf("输入字符串S1的长度为: %d",StrLength(S1));
printf("\n请输入第个二个字符串s2: ");
gets_s(s2);
StrAssign(S2,s2);
printf("输入字符串S2的长度为: %d",StrLength(S2));
S = ConcatString(S,S1,S2);
printf("\n连接生成的新串S是: ");
printStr(S);
printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\n返回第1个字符之后的子串S2的位置是: %d ",Index(S,S2,1));
printf("\n返回插入在主串S的第3个位置插入子串S2: ");
S = StrInsert(S,pos,S2);
printStr(S);
printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("返回删除主串S的第3个位置的长度为2的子串: ");
S = StrDelete(S,pos,len);
printStr(S);
printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\n用Sub返回串S的第3个字符起长度为2的子串: ");
SubString(Sub,S,3,2);
printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("串S存在,用V替换S中与Str相等的串\n");
printf("原来的S串是: ");
printStr(S);
printf("\n请输入S中要替换的串Str: ");
gets_s(str);
StrAssign(Str,str);
printf("请输入新串V: ");
gets_s(v);
StrAssign(V,v);
printf("替换之后的字符串S: ");
Replace(S,Str,V);
printStr(S);
printf("\n\n\n");
return OK;
}
运行截图: