看数据结构写代码(17) 串的堆式存储

在写这个串的定义的时候,觉得 有几点问题:1.各种释放内存, 2. 操作的效率 和步骤有点麻烦 3. 各种出错。

希望以后完善,


欢迎指出代码不足

// seqString.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>

enum E_State
{
	E_State_Error = 0,
	E_State_Ok,
};

struct String
{
	char * base;
	int len;//串长度
};

void StringInit(String * s){
	s->base = NULL;
	s->len = 0;
}

void StringClear(String * s){
	s->base = NULL;
	s->len = 0;
}

void StringDestory(String * s){
	free(s->base);
	StringClear(s);
}

E_State StringAssign(String * to,const char * from){
	int len = 0;
	const char * p = from;
	while (*p != '\0') {len++,p++;}
	free(to->base);
	if (len != 0)
	{
		to->base = (char *)malloc(sizeof(char)*len);
		if (to->base == NULL)
		{
			return E_State_Error;
		}
		//赋值..
		for (int i = 0; i < len; i++) to->base[i] = from[i];
		to->len = len;
	}
	else
	{
		StringClear(to);
	}
	return E_State_Ok;
}

int StringLen(String s){
	return s.len;
}

bool StringEmpty(String s){
	return s.len == 0 ? true : false;
}

E_State StringCopy(String * to,String from){
	int len = from.len;
	free(to->base);
	if (len != 0)
	{
		to->base = (char *)malloc(sizeof(char)*len);
		if (to->base == NULL)
		{
			return E_State_Error;
		}
		//赋值..
		for (int i = 0; i < len; i++) to->base[i] = from.base[i];
		to->len = len;
	}
	else
	{
		StringClear(to);
	}
	return E_State_Ok;
}

int StringCmp(String s1,String s2){
	int len1 = s1.len;
	int len2 = s2.len;
	for (int i = 0; i < len1 && i < len2; i++)
	{
		char c1 = s1.base[i];
		char c2 = s2.base[i];
		if (c1 != c2 )
		{
			return c1 - c2;
		}
	}
	return len1 - len2;
}

E_State StringConcat(String * dst,String src1,String src2){
	int len = src1.len + src2.len;
	free(dst->base);
	if (len != 0)
	{
		dst->base = (char *) malloc(sizeof(char) * len);
		if (dst->base == NULL)
		{
			return E_State_Error;
		}
		//赋值..
		int i = 0;
		for (; i < src1.len; i++) dst->base[i] = src1.base[i];
		for (i = 0; i < src2.len; i++) dst->base[src1.len+i] = src2.base[i];
		dst->len = len;
	}
	else
	{
		StringClear(dst);
	}
	return E_State_Ok;

}

E_State StringSubString(String src,int pos,int len,String * sub){
	int stringLen = src.len;
	if (pos < 1 || pos > stringLen || len < 0 || len > stringLen - pos + 1)
	{
		return E_State_Error;
	}
	free(sub->base);
	if (len == 0)
	{
		StringClear(sub);
	}
	else
	{
		sub->base = (char *) malloc(sizeof(char) * len);
		if (sub->base == NULL)
		{
			return E_State_Error;
		}
		for (int i = 0; i < len; i++) sub->base[i] = src.base[pos-1+i];
		sub->len = len;
	}
	return E_State_Ok;

}

int StringIndex(String s,String sub,int pos){
	if (pos >= 1)
	{
		for (int i = pos; i <= s.len - sub.len + 1; i++)
		{
			String subStr;
			StringInit(&subStr);
			StringSubString(s,i,sub.len,&subStr);
			if (StringCmp(sub,subStr) == 0)
			{
				return i;
			}
		}
	}
	return 0;
}

E_State StringInsert(String * s,int pos,String insert){
	if (pos >= 1)
	{
		s->base = (char*)realloc(s->base,sizeof(char)* (s->len + insert.len));
		if (s->base == NULL)
		{
			return E_State_Error;
		}
		for (int i = s->len - 1; i >= pos -1; i--)//后退
		{
			s->base[i+insert.len] = s->base[i];
		}
		for (int i = 0; i < insert.len; i++)//拷贝
		{
			s->base[pos-1+i] = insert.base[i];
		}
		s->len += insert.len;
	}
	return E_State_Ok;
}
	

E_State StringDelete(String * s,int pos,int len){
	if (pos < 1 || pos > s->len || pos+len-1 > s->len)
	{
		return E_State_Error;
	}
	for (int i = pos+len-1; i < s->len; i++)
	{
		s->base[i-len] = s->base[i];
	}
	s->len -= len;
	return E_State_Ok;
}

E_State StringReplace(String * s,String find,String replace){
	if (find.len > 0)
	{
		for (int i = 1; i <= s->len - find.len + 1;)
		{
			int index = StringIndex(*s,find,i);
			if (index == 0)
			{
				break;
			}
			else
			{
				i = index + find.len;
			}
			StringDelete(s,index,find.len);
			StringInsert(s,index,replace);
		}
	}
	return E_State_Ok;
}

void StringTraverse(String s){
	printf("-------遍历开始-------------\n");
	for (int i = 0; i < s.len; i++)
	{
		printf("%c",s.base[i]);
	}
	printf("\n-------遍历结束-------------\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
	String test1,test2;
	StringInit(&test1);
	StringInit(&test2);
	StringAssign(&test1,"Hello,World!");
	StringTraverse(test1);
	StringCopy(&test2,test1);
	StringConcat(&test2,test1,test1);
	StringInsert(&test2,2,test1);
	StringTraverse(test2);
	StringDelete(&test2,3,test1.len);
	StringTraverse(test2);
	printf("index : %d\n",StringIndex(test2,test1,1));
	String test3;
	StringInit(&test3);
	StringAssign(&test3,"test");
	StringReplace(&test2,test1,test3);
	StringTraverse(test2);
	//最后释放内存
	StringDestory(&test2);
	StringDestory(&test1);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值