严蔚敏-串-串的表示和实现-串的应用举例

数据结构学习笔记【第4章 串】

4.1 串类型的定义

  • :字符串
  • 串的长度:串中字符数目
  • 位置:字符在序列中的序号
  • 子串:串中任意个连续的字符组成的子序列
  • 空串:零个字符的串
  • 空格串:由一个或多个空格组成的串

4.2 串的表示和实现

4.1 定长顺序存储表示

  • 用一组地址连续的存储单元存储串值的字符序列(字符数组)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

typedef int Status;

#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];//0号存放串的长度

Status Concat(SString& T, SString S1, SString S2);
//算法4.2 用T返回由S和S2联结而成的新串。若未截断,则返回TRUE,否则FALSE。
Status SubString(SString& Sub, SString S, int pos, int len);
//算法4.3 用SUb返回串S的第pos个字符起长度为len的子串
void print_SString(SString S);

int main()
{
	SString S1;
	S1[0] = 2;
	S1[1] = 'H';
	S1[2] = 'i';
	S1[3] = '\0';

	SString S2;
	S2[0] = 3;
	S2[1] = ' ';
	S2[2] = 'g';
	S2[3] = 's';
	S2[4] = '\0';

	SString T;
	Concat(T, S1, S2);
	print_SString(T);

	SString Sub;
	SubString(Sub, T, 4, 2);
	print_SString(Sub);
	system("pause");
	return 0;
}
Status Concat(SString& T, SString S1, SString S2)
{
	if (S1[0] + S2[0] <= MAXSTRLEN) {
		int i;
		for (i = 1; i <= S1[0]; i++) {
			T[i] = S1[i];
		}
		for (i = S1[0] + 1; i <= S1[0] + S2[0]; i++) {
			T[i] = S2[i - S1[0]];
		}
		T[0] = S1[0] + S2[0];
		T[T[0]+1] = '\0';
		return TRUE;
	}
	else if (S1[0] < MAXSTRLEN) {
		int i;
		for (i = 1; i <= S1[0]; i++) {
			T[i] = S1[i];
		}
		for (i = S1[0] + 1; i <= MAXSTRLEN; i++) {
			T[i] = S2[i - S1[0]];
		}
		T[0] = MAXSTRLEN;
		return FALSE;
	}
	else {
		int i;
		for (i = 1; i <= MAXSTRLEN; i++) {
			T[i] = S1[i];
		}
		T[0] = MAXSTRLEN;
		return FALSE;
	}
}
Status SubString(SString& Sub, SString S, int pos, int len)
{
	if (pos<1 || pos>S[0] || len<0 || len>S[0] - pos + 1)return ERROR;
	int i;
	for (i = 1; i <= len; i++) {
		Sub[i] = S[i + pos - 1];
	}
	Sub[0] = len;
	return OK;
}
void print_SString(SString S)
{
	int i;
	printf("SString(length:%d):", S[0]);
	for (i = 1; i <= S[0]; i++)
	{
		printf("%c", S[i]);
	}
	printf("\n");
}

4.2 堆分配存储表示

  • 以一组地址连续的存储单元存放串值序列,但它们的存储空间是在程序执行过程中动态分配而得
#include<stdio.h>
#include<stdlib.h>

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

typedef int Status;

#define MAXSIZE 100
typedef struct {
	char* ch;
	int length;
}HString;

Status StrAssign(HString& T, char* chars);
//生成一个其值等于串常量chars的串T
int StrLength(HString S);
//返回S的元素个数,称为串的长度
int StrCompare(HString S, HString T);
//若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
Status ClearString(HString& S);
//将S清为空串,并释放S所占空间
Status Concat(HString& T, HString S1, HString S2);
//用T返回S1和S2联结而成的新串
Status SubString(HString& Sub, HString S,int pos, int len);
//1<<pos<<StrLength(S)且0<<len<<StrLength(S)-pos+1
//返回串S的第pos个字符起长度为len的字串
Status StrInsert(HString& S, int pos, HString T);
//算法4.4 串插入操作
void print_HString(HString T);

int main()
{
	char* ch;
	ch = (char*)malloc(MAXSIZE * sizeof(char));
	if (!ch) exit(OVERFLOW);
	ch[0] = 'H';
	ch[1] = 'i';
	ch[2] = '\0';
	HString T;
	T.ch = (char*)malloc(MAXSIZE * sizeof(char));
	StrAssign(T, ch);
	print_HString(T);

	char* ch1;
	ch1 = (char*)malloc(MAXSIZE * sizeof(char));
	if (!ch1) exit(OVERFLOW);
	ch1[0] = ' ';
	ch1[1] = 'g';
	ch1[2] = 's';
	ch1[3] = '\0';
	HString S;
	S.ch = (char*)malloc(MAXSIZE * sizeof(char));
	StrAssign(S, ch1);
	print_HString(S);

	HString R;
	R.ch = (char*)malloc(MAXSIZE * sizeof(char));
	Concat(R, T, S);
	print_HString(R);

	HString Sub;
	Sub.ch = (char*)malloc(MAXSIZE * sizeof(char));
	SubString(Sub, R, 4, 2);
	print_HString(Sub);

	StrInsert(T, 2, S);
	print_HString(T);
	system("pause");
	return 0;
}
Status StrAssign(HString& T, char* chars)
{
	if (T.ch) {
		free(T.ch); T.ch = NULL;
	}
	int i;
	char* c;
	for (i = 0, c = chars; *c; i++, c++);
	if (!i) {
		T.ch = NULL;
		T.length = 0;
	}
	else {
		if (!(T.ch = (char*)malloc(i * sizeof(char)))) exit(OVERFLOW);
		int j;
		for (j = 0; j < i; j++) {
			T.ch[j] = chars[j];
		}
		T.ch[j] = '\0';
		T.length = i;
	}
	return OK;
}
int StrLength(HString S)
{
	return S.length;
}
int StrCompare(HString S, HString T)
{
	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;
	}
}
Status ClearString(HString& S)
{
	if (S.ch) {
		free(S.ch);
		S.ch = NULL;
	}
	S.length = 0;
	return OK;
}
Status Concat(HString& T, HString S1, HString S2)
{
	if (T.ch) free(T.ch);
	if (!(T.ch = (char*)malloc((S1.length + S2.length) * sizeof(char)))) exit(OVERFLOW);
	int i;
	for (i = 0; i < S1.length;i++) T.ch[i] = S1.ch[i];
	T.length = S1.length + S2.length;
	for (i = S1.length; i <T.length; i++) T.ch[i] = S2.ch[i-S1.length];
	T.ch[i] = '\0';
	return OK;
}
Status SubString(HString& Sub, HString S, int pos, int len)
{
	if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)return ERROR;
	if (Sub.ch) free(Sub.ch);
	if (!len) { Sub.ch = NULL; Sub.length = 0; }
	else {
		Sub.ch = (char*)malloc(len * sizeof(char));
		int i;
		for (i = 0; i < len; i++)
		{
			Sub.ch[i] = S.ch[i + pos - 1];
		}
		Sub.length = len;
		Sub.ch[Sub.length] = '\0';
	}
	return OK;
}
Status StrInsert(HString& S, int pos, HString T)
{
	if (pos<1 || pos>S.length + 1)return ERROR;
	if (T.length) {
		if (!(S.ch = (char*)realloc(S.ch, (S.length + T.length) * sizeof(char))))exit(OVERFLOW);
		int i;
		for (i = S.length - 1; i >= pos - 1; i--)S.ch[i + T.length] = S.ch[i];
		for (i = pos - 1; i < pos - 1 + T.length; i++)S.ch[i] = T.ch[i - pos + 1];
		S.length += T.length;
		S.ch[S.length] = '\0';
	}
	return OK;
}
void print_HString(HString T)
{
	printf("HString(length:%d):", T.length);
	for (int i = 0; i < T.length; i++)printf("%c", T.ch[i]);
	printf("\n");
}

4.3 串的模式匹配算法

  • 未完待续…

4.4 串操作应用举例

4.4.1 文本编辑

  • 将文本看成一个字符串,页则是文本串的字串,行又是页的字串
  • 未完待续…

4.4.2 建立词索引表

  • 未完待续…
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值