`
Dev|il
  • 浏览: 122143 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

串的顺序实现

 
阅读更多
串的顺序实现

串的顺序结构实现有弊端:
1.串的最大长度固定
2.当串的长度超过MAXSTRLEN时,采用截尾法处理,这种方法不仅在求串的连接时可能发生,还在串的插入,置换也有可能发生.
#include <iostream>
using namespace std;

#define MAXSTRLEN 255 //用户可以在255以内定义最大串长
#define TURE 1
#define FALSE 0
#define ERROR 0
#define OK 1
typedef unsigned char SString[MAXSTRLEN + 1]; //0号单位存字符串的长度
typedef int Status;
//串

/**
**函数功能: 连接串s1和s2如果串s1+s2的长度大于MAXSTRLEN 则返回状态FALSE 否则返回TRUE
**/
Status Concat(SString &T, SString s1, SString s2)
{
	//用T返回s1和s2连接的新串,若未截断则返回true,否则返回false
	//截断分二种情况:
	//s1的长度s1[0] < MAXSTRLEN 而s1[0] + s2[0] > MAXSTRLEN 则表示截断
	//s1[0]>=MAXSTRELN
	int i, j, flag;
	i = j = 1;
	if(s1[0] + s2[0] - 2 * '0' <= MAXSTRLEN) //未截断
	{
		T[0] = s1[0] + s2[0] - '0';
		//对串进行复制
		//T[1...s1[0]] = s1[1...s1[0]]; T[s1[0] + 1....s2[0] + s1[0]] = s2[1...s2[0]];
		while(i <= T[0] - '0' && j <= s1[0] - '0')
				T[i++] = s1[j++];
		j = 1;
		while(i <= T[0] - '0' && j <= s2[0] - '0')
				T[i++] = s2[j++];
		flag = TURE;
	}else if(s1[0] - '0' < MAXSTRLEN)
	{
		while(j <= s1[0] - '0')
			T[i++] = s1[j++];
		j = 1;
		while(i <= MAXSTRLEN)
			T[i++] = s2[j++];
		T[0] = MAXSTRLEN;
		flag = FALSE;
	}else
	{
		while(i <= MAXSTRLEN)
			T[i++] = s1[j++];
		T[0] = MAXSTRLEN;
		flag = FALSE;
	}

	return flag;
}

/**
**函数功能:求子串,用sub返回串s的第pos个字符起长度为len的子串
**参数: sub:返回的子串
** s: 获取的串 
** pos: 起始位置  1<= pos <= s[0]
** len:长度  0<= len <= s[0] - pos + 1
**/
Status subString(SString &sub, SString s, int pos, int len)
{
	int i;
	if(pos < 1 || pos > s[0] - '0' || len < 0 || len > s[0]- '0' - pos + 1)
		return ERROR;
	sub[0] = len + '0';
	for(i = pos; i < pos + len; i++)
		sub[i - pos + 1] = s[i]; 
	return OK;
}
int main()
{
	SString s1 = "4abcd";
	SString s2 = "5efghi";
	SString T;
	//Concat(T, s1, s2);
	subString(T, s2, 1, 4);
	cout<<&T[1]<<endl;
	return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics