数据结构之字符串的对分配存储相关函数实现

参考书籍:严蔚敏《数据结构》(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;
} 

运行结果

posted @ 2019-08-19 20:24  昨夜昙花  阅读(6)  评论(0)    收藏  举报