串的顺序实现
串的顺序实现
串的顺序结构实现有弊端:
1.串的最大长度固定
2.当串的长度超过MAXSTRLEN时,采用截尾法处理,这种方法不仅在求串的连接时可能发生,还在串的插入,置换也有可能发生.
#include <iostream>using namespace std;#define MAXSTRLEN 255 //用户可以在255以内定义最大串长#define TURE 1#define FALSE 0#define ERROR 0#define OK 1typedef 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]>=MAXSTRELNint 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;}