数据结构之字符串的对分配存储相关函数实现
参考书籍:严蔚敏《数据结构》(C语言版)75页
编程软件:DEVC++
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char *ch;
int length;
}HString;
int strAssign(HString *T,char *chars)
{
char *c;
int i;
if(T->ch) free(T->ch);//if T is not empty,free it
for(i = 0,c = chars; *c ; ++i,++c); //here we get:length of chars = i;
if(!i){T->ch = NULL;T->length = 0;} //if i = 0,chars is empty,so t.ch=null,t.length=0;nothing happend;
else{
T->ch = (char*)malloc(i*sizeof(char));if(!T->ch) return 0;//T.ch = null,malloc failed ,return 0;
for(c = chars; *c ; c++)//assign
{
*T->ch = *c;
*T->ch++;
}
//PARTICULAR ATTENTION: now the pointer T->ch is point to the end of the memory
//PARTICULAR ATTENTION: we have to reset T->ch with(T->ch = T->ch - i;)
//PARTICULAR ATTENTION: add '\0' to end the string,without it ,printf("%s",T->ch) will generate random code
*T->ch++ = '\0';//but if you don't use printf--->%s,there is no need to add '\0'
T->length = i;
T->ch = T->ch - T->length - 1;
}
return 1;
}
int strInsert(HString *S,int pos,HString T)
{
if(pos<1 || pos>S->length)return 0;
if(T.length)
{
S->ch = (char*)realloc(S->ch,(T.length+S->length)*sizeof(char));//realloc a memory,pointed by S->ch
if(!S->ch)return 0;
for(int i = S->length - 1; i >= pos - 1;--i)
S->ch[i+T.length] = S->ch[i]; //move T.length elements after S->ch[pos-1] to new postion
for(int i = 0; i<T.length;i++)//insert T
S->ch[pos+i] = T.ch[i];
if(pos != S->length)
S->length += T.length;
else
S->length += T.length;
S->ch[S->length] = '\0';//PARTICULAR ATTENTION: without it ,printf("%s",T->ch) will generate random code
}
return 0;
}
int strLength(HString S)
{
return S.length;
}
//if s1>s2 return 1,if s1=s2 return 0,otherwise return -1
int strCmp(HString s1,HString s2)
{
for(int i=0;i<s1.length&&i<s2.length;i++)
if(s1.ch[i] != s2.ch[i]) return s1.ch[i] - s2.ch[i];
return s1.length - s2.length;
}
int strClear(HString *S)
{
if(S->ch){free(S->ch);S->ch = NULL;}
S->length = 0;
return 1;
}
int strCat(HString *T,HString s1,HString s2)
{
if(T->length) strClear(T);
if(!(T->ch = (char*)malloc((s1.length+s2.length)*sizeof(char)))) return 0;
for(int i = 0;i<s1.length;i++)
T->ch[i] = s1.ch[i];
for(int i = 0;i<s2.length;i++)
T->ch[s1.length+i] = s2.ch[i];
T->length = s1.length + s2.length;
T->ch[T->length] = '\0';
return 1;
}
//copy a string from s to sub,pos is where to begin,len is length of the string
int subString(HString *sub,HString s,int pos,int len)
{
if(pos<1 || pos>s.length || s.length == 0 || len<0 || len>s.length-pos-1)return 0;
if(sub->ch) free(sub->ch);
if(!len)
{
sub->ch = NULL;
sub->length = 0;
}else{
sub->ch = (char*)malloc(len*sizeof(char));
for(int i = 0;i<len;i++)
sub->ch[i] = s.ch[pos+i-1];
sub->length = len;
sub->ch[len] = '\0';//end of string,conveniet to print with %s
}
return 1;
}
int main()
{
//test strAssign
printf("-----test strAssign------\n");
HString string;
int i = 0;
char chars[] = "hello ";
strAssign(&string,chars);
printf("string length is :%d\n",string.length);
printf("string = %s\n",string.ch);
//test strInsert
printf("\n-----test strInsert------\n");
HString string1;
char *chars1 = "world";
strAssign(&string1,chars1);
strInsert(&string,6,string1);
printf("string length is :%d\n",string.length);
printf("string = %s\n",string.ch);
//test strCmp
printf("\n-----test strCmp------\n");
HString string2;
char *chars2 = "hello world";
strAssign(&string2,chars2);
if(!strCmp(string,string2))
printf("string = string2\n");
else if(strCmp(string,string2)>0)
printf("string > string2\n");
else
printf("string < string2\n");
//test strCat
printf("\n-----test strCat------\n");
HString string3;
strCat(&string3,string2,string1);
printf("string3 length is :%d\n",string3.length);
printf("string3 = %s\n",string3.ch);
//test subString
printf("\n-----test subString------\n");
HString string4;
subString(&string4,string3,7,5);
printf("string4 length is :%d\n",string4.length);
printf("string4 = %s\n",string4.ch);
return 1;
}
运行结果


浙公网安备 33010602011771号