HString

using namespace std;

#include <iostream>

#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define TRUE 1
#define FALSE -1

typedef struct {
	/************************************************************************/
	/*串的堆分配存储表示					                                     */
	/*Went 2011-11-8 17:41											  */
	/************************************************************************/
	char *ch;				//若是非空串,则按串长分配存储区,否则ch为NULL
	int length;				//串长度
}HString;

int StrAssign(HString &T, const char *chars) {
	//生成一个其值等于串常量chars的串T
	int len = strlen(chars);
	int i;
	if (T.ch)	
		T.ch == NULL;			
	if (!len) {
		T.ch = NULL;
		T.length = 0;
	}
	else {
		if (!(T.ch = (char *)malloc(len * sizeof(char))))
			return OVERFLOW;
		for(i = 0; i < len; i++)
			T.ch[i] = chars[i];
		T.length = len;
	}
	return OK;
}

int StrLength(HString S) {
	//返回S的元素个数,称为串的长度
	if (!S.ch)
		return ERROR;
	return S.length;
}

int StrCompare(HString S, HString T) {
	//若S > T,则返回值 > 0;若S = T,则返回值=0;若S < T,则返回值 < 0
	if (!S.ch || !T.ch)
		return ERROR;
	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;
}

int StrCopy(HString &T, HString S) {
	//串S存在,由串S复制得串T
	if (!S.ch)
		return ERROR;
	int i;
	if (T.ch)
		free(T.ch);			//释放T原有空间
	if (!S.length) {
		T.ch = NULL;
		T.length = 0;
	}
	else {
		if (!(T.ch = (char *)malloc(S.length * sizeof(char))))
			return OVERFLOW;
		for(i = 0; i < S.length; i++)
			T.ch[i] = S.ch[i];
		T.length = S.length;
	}
	return OK;
}

int StrEmpty(HString S) {
	//串S存在,若S为空串,返回TRUE,否则返回FALSE
	if (!S.ch)
		return ERROR;
	if (S.length)
		return FALSE;
	else
		return TRUE;
}

int ClearString(HString &S) {
	//串S存在,将S清为空串
	if (!S.ch)
		return ERROR;
	free(S.ch);
	S.ch = NULL;
	S.length = 0;
	return OK;
}

int Concat(HString &T, HString S1, HString S2) {
	//串S1,S2存在。用T返回由S1和S2连接而成的新串
	if (!S1.ch || !S2.ch)
		return ERROR;
	int i, j;
	if (T.ch)
		T.ch = NULL;				//释放旧空间
	if (!(T.ch = (char *)malloc((S1.length + S2.length) * sizeof(char))))
		return OVERFLOW;
	for(i = 0; i < S1.length; i++)
		T.ch[i] = S1.ch[i];
	T.length = S1.length + S2.length;
	for (i = S1.length, j = 0; i < T.length, j < S2.length; i++, j++)
		T.ch[i] = S2.ch[j];
	return OK;
}

int SubString(HString &Sub, HString S, int pos, int len) {
	//串S存在,1《pos《StrLength(S)且0《len《StrLength(S)-pos+1
	//用Sub返回串S的第pos个字符起长度为len的子串
	if (pos < 1 || pos > S.length || len < 0 || len > S.length - pos + 1)
		return ERROR;
	if (Sub.ch)
		Sub.ch = NULL;			//释放旧空间
	if (!len) {					//空子串
		Sub.ch = NULL;
		Sub.length = 0;
	}
	else {
		int i, j;
		Sub.ch = (char *)malloc(len * sizeof(char));
		for(i = 0, j = pos - 1; i < len, j < pos + len - 1; i++, j++)
			Sub.ch[i] = S.ch[j];
		Sub.length = len;
	}
	return OK;
}

int Index(HString S, HString T, int pos) {
	//串S和T存在,T是非空串,1《pos《StrLength(S)
	//若主串S中存在和串T值相同的子串,则返回它在珠串S中第pos个字符之后第一次出现的位置,否则返回0
	int len1, len2, i, j;
	len1 = S.length;
	len2 = T.length;
	i = pos - 1;
	j = 0;
	while(i < len1 && j < len2) {
		if (S.ch[i] == T.ch[j]) {
			i++;
			j++;
		}
		else {
			i = i - j + 1;				//对应字符不相等,重新比较
			j = 0;
		}
	}
	if (j == len2) 
		return i - len2 + 1;
	return 0;
}

int StrInsert(HString &S, int pos, HString T) {
	//串S,T存在,1《pos《StrLength(S)+ 1
	//在串S的第pos个字符之前插入串T
	if (!S.ch || !T.ch || pos < 1 || pos > S.length + 1)
		return ERROR;
	if (T.length) {
		if (!(S.ch = (char *)realloc(S.ch, (S.length + T.length) * sizeof(char))))
			return OVERFLOW;
		int i, j;
		for(i = S.length - 1; i > pos - 2; i--) 
			S.ch[i + T.length] = S.ch[i];
		for(i = pos - 1, j = 0; i < pos + T.length - 1, j < T.length; i++, j++)
			S.ch[i] = T.ch[j];
		S.length += T.length;
	}
	return OK;
}

int StrDelete(HString &S, int pos, int len) {
	//串S存在,1《pos《StrLength(S) - len + 1
	//从串S中删除第pos个字符起长度为len的子串
	if (!S.ch || pos < 1 || pos > S.length || len < 0 || len > S.length - pos + 1)
		return ERROR;
	int i;
	for(i = pos - 1; i < S.length - len; i++)
		S.ch[i] = S.ch[i + len];
	S.length -= len;
	S.ch = (char *)realloc(S.ch, S.length * sizeof(char));
	return OK;
}

int Replace(HString &S, HString T, HString V) {
	//串S,T,V存在。T是非空串
	//用V替换主串S中出现在所有与T相等的不重叠的子串
	if (!S.ch || !T.ch || !V.ch || !T.length)
		return ERROR;
	int i = 1;
	while(i) {
		i = Index(S, T, i);
		if (i) {
			StrDelete(S, i, T.length);
			StrInsert(S, i, V);
			i += V.length;
		}
	}
	return OK;
}

int main() {
	char *chars1 = "hello\n";
	char *chars2 = "he";
	char *chars3 = "123";
	HString s, v, t, sub;
	int i;
	StrAssign(t, chars1);
	StrAssign(s, chars2);
	StrAssign(v, chars3);
	/*for(i = 0; i < t.length; i++)
		cout << t.ch[i];
	cout << StrLength(t) << endl;
	StrAssign(s, chars2);
	cout << StrCompare(s, t) << endl;*/
	//StrCopy(s, t);
	//ClearString(s);
	/*for(i = 0; i < s.length; i++)
		cout << s.ch[i];
	Concat(v, s, t);
	for(i = 0; i < v.length; i++)
		cout << v.ch[i];
	SubString(sub, s, 3, 3);
	for(i = 0; i < sub.length; i++)
		cout << sub.ch[i];
	StrAssign(v, chars3);*/
	/*StrInsert(t, 1, v);
	for(i = 0; i < t.length; i++)
		cout << t.ch[i];
	cout << t.length << endl;*/
	/*StrDelete(t, 2, 3);
	for(i = 0; i < t.length; i++)
		cout << t.ch[i];
	cout << t.length << endl;*/
	Replace(t, s, v);
	for(i = 0; i < t.length; i++)
		cout << t.ch[i];
	system("pause");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值