串的定长顺序存储

借鉴了一下博客园的一篇文章,然后自己想放在自己的blog中

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

#define MAXSTRLEN 255
typedef int Status;
typedef char SString[MAXSTRLEN + 1];  //加一是为了使0号位存放串的长度
typedef struct {
	char ch[MAXSTRLEN];
	int len;
}SString1;

Status StrAssign(SString& T, const char* chars);
Status StrContact(SString& T, SString S1, SString S2);
Status Index(SString T, SString S);
Status Concat(SString T, SString S1, SString S2);
Status Insert(SString T, SString S, int pos);
Status StrPrint(SString T);

int main() {
	SString P1, P2, S1, S2, T;
	int pos = 3;
	char str[MAXSTRLEN];
	printf("Please enter P1\n");
	gets_s(str);
	StrAssign(P1, str);
	//printf("%s", str);  //使用printf或puts打印P1总会打印出些莫名其妙的东西,但打印str就很正常
	//puts(P1);
	printf("Please enter P2\n");
	gets_s(str);
	StrAssign(P2, str);
	//StrContact(T, P1, P2);
	//StrPrint(T);
	//Insert(P1, P2, pos);
	//StrPrint(P1);
	Index(P1, P2);
}
//给新字符串赋值,生成一个值等于chars的串T
Status StrAssign(SString& T, const char* chars) {
	if (strlen(chars) > MAXSTRLEN) {       //当chars的长度大于最大值时便再最大值处截断
		for (int i = 1; i <= MAXSTRLEN; i++)
			T[i] = *(chars + i - 1);
		T[0] = MAXSTRLEN;
	}
	else {
		T[0] = strlen(chars);  //此时chars长度小于max,则在T[0]存入chars的长度值
		for (int j = 1; j <= MAXSTRLEN; j++)
			T[j] = *(chars + j - 1);
		return OK;
	}
}

//字符串复制
Status Strcopy(SString & T, SString S) {  //假设S已经存在
	for (int i = 1; i <= S[0]; i++)
		T[i] = S[i];
	T[0] = S[0];
	return OK;
}

//返回子串长度
Status Strlenth(SString S) {
	return S[0];
}

//串连结函数
Status StrContact(SString & T, SString S1, SString S2) {
	int i;
	if (S1[0] + S2[0] <= MAXSTRLEN) {
		for (i = 1; i <= S1[0]; i++) {
			T[i] = S1[i];
		}
		for (i = 1; i <= S2[0]; i++) {
			T[i + S1[0]] = S2[i];
		}
		T[0] = S1[0] + S2[0];
		return TRUE;
	}
	else if (S1[0] < MAXSTRLEN) {
		for (i = 1; i <= S1[0]; i++) {
			T[i] = S1[i];
		}
		for (i = 1; i <= MAXSTRLEN - S1[0]; i++) {
			T[i + S1[0]] = S2[i];
		}
		T[0] = MAXSTRLEN;
		return TRUE;
	}
	else {
		for (i = 1; i <= MAXSTRLEN; i++)
			T[i] = S1[i];
		T[0] = MAXSTRLEN;
		return TRUE;
	}
}

//索引子串 在主串T中找到子串S的位置
Status Index(SString T, SString S) {
	int i = 1, j = 1;
	while (i <= T[0] && j <= S[0]) {  //即用最基础的模式匹配寻找相符的子串
		if (T[i] == S[j]) {
			i++;
			j++;
		}
		else {
			i = i - j + 2;
			j = 1;
		}
	}
	if (j > S[0]) {       //即不满足j<=S[0]
		printf("Postion:%d \n", i - j + 1);
		return OK;
	}
	else {                //即不满足i<=T[0]
		printf("Substring does not exist");
		return ERROR;
	}
}


Status Concat(SString T, SString S1, SString S2) {
	int i;
	if (S1[0] + S2[0] <= MAXSTRLEN)
	{
		for (i = 1; i <= S1[0]; ++i)
			T[i] = S1[i];
		for (i = 1; i <= S2[0]; ++i)
			T[i + S1[0]] = S2[i];
		T[0] = S1[0] + S2[0];
		return TRUE;
	}
	else //先存完S1中的,再存S2中的内容,条件是不能越界
	{
		for (i = 1; i <= S1[0] && i <= MAXSTRLEN - 1; ++i)
			T[i] = S1[i];
		for (i = 1; i <= MAXSTRLEN - S1[0]; ++i)
			T[i + S1[0]] = S2[i];
		T[0] = MAXSTRLEN;
		return FALSE;
	}
}

//在位置pos处插入子串T
Status Insert(SString S, SString T, int pos) {
	int i;
	if (pos > S[0])
		pos = S[0] + 1;
	if (S[0] + T[0] <= MAXSTRLEN) {
		for (i = S[0] + T[0]; i >= pos + T[0]; --i) {
			S[i] = S[i - T[0]];   //先把要插入的位置给空出来
		}
		for (i = 1; i <= T[0]; ++i) {
			S[pos + i - 1] = T[i];
		}
		S[0] = S[0] + T[0];
		return OK;
	}
	else {
		for (i = MAXSTRLEN; i >= pos + T[0]; i--) {
			S[i] = S[i - T[0]];   //先把要插入的位置给空出来
		}
		for (i = 1; i <= T[0]; ++i) {
			S[pos + i - 1] = T[i];
		}
		S[0] = MAXSTRLEN;
		return ERROR;
	}
}

//打印字符串
Status StrPrint(SString T) {
	int i;
	for (i = 1; i <= T[0]; ++i) {
		printf("%c", T[i]);
	}
	return OK;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值