《数据结构》严蔚敏串的ADT实现 算法4.1

这个没有借助C语言的库函数,而是自己写了一下字符串操作函数.
测试用例有点水,将就着看吧。。。
在这里插入图片描述

附上c语言字符串操作函数

// strcpy(p, p1) 复制字符串
// strncpy(p, p1, n) 复制指定长度字符串
// strcat(p, p1) 附加字符串
// strncat(p, p1, n) 附加指定长度字符串
// strlen§ 取字符串长度
// strcmp(p, p1) 比较字符串
// strcasecmp忽略大小写比较字符串
// strncmp(p, p1, n) 比较指定长度字符串
// strchr(p, c) 在字符串中查找指定字符
// strrchr(p, c) 在字符串中反向查找
// strstr(p, p1) 查找字符串
// strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素
// strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移
// strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移
// strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char
类型存储。
// strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置为 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释为十六进制格式整型,0 前缀以解释为八进制格式整型
// atoi§ 字符串转换到 int 整型
// atof§ 字符串转换到 double 符点数
// atol§ 字符串转换到 long 整型
*

函数声明

//string base operator
//才意识到这是要自己动手造轮子,当函数名想不起来的时候还是很有帮助滴

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

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 40
#define MAXSTRLEN 10

typedef int Status;
typedef char SString[MAXSIZE+1];


//本代码中的字符串操作函数
/*******************************声明部分****************************************/
Status StrAssign(SString T,char *chars);
//生成一个其值等于chars的串T  第一个元素为字符串长度

int StrLength(SString S);
//操作结果:返回S的元素个数,成为串的长度

Status StrCopy(SString S,SString T);
//由串S复制得串T

Status StrEmpty(SString S);
//若S为空串返回TURE

int StrCompare(SString S,SString T);
//操作结果:若S>T,则返回值>0;若S = T,则返回值 =0;若S<T,则返回值<0

int StrLength(SString S);
//返回S的元素个数,称为串的长度

Status ClearString(SString S);
//将S清为0串

Status StrConcat(SString T,SString S1,SString S2);
//用T返回由S1,S2连结而成的新串

Status SubString(SString Sub, SString T,int pos,int len);
//用Sub返回串T的第pos个字符起长度为len的子串

int Index(SString S,SString T,int pos);
//若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置;否则函数值为0

Status Replace(SString S,SString T,SString V);
//用V替换主串S中出现的所有与T相等的不重叠的子串

Status StrDelete(SString S,int pos,int len);
//从主串S中删除第pos个字符起长度为len的子串

Status StrInsert(SString S,int pos,SString T);
//从主串S第pos个字符之前插入子串T

Status DestroyString(SString S);
//串S被摧毁

Status StrTraverse(SString S);
//遍历串S

函数定义

/*******************************函数部分****************************************/

Status
StrAssign(SString T,char *chars)
{
	int i,ct;
	for(i = 0;i <= MAXSIZE;i++)
		T[i] = '\0';
	T[0] = strlen(chars);
	for(ct = 1;*chars != '\0';ct++,chars++)
	{
		T[ct] = *chars;
	}

	return OK;
}

//由串S复制得串T
//这里用了双重指针
Status
StrCopy(SString S,SString T)
{
	int i;
	for(i = 0;i<=S[0];i++)
		T[i] = S[i];

	return OK;

}

Status
StrEmpty(SString S)
 {
// 	if(S[0] == 0)
// 		return OK;
// 	else
// 		return ERROR;
//简单写法
 	return S[0] == 0;
}

int 
StrCompare(SString S,SString T)
{
	int cnt = 1;
	while(cnt <= S[0] && cnt <= T[0])
	{
		if(S[cnt] == T[cnt])
			cnt ++;
		else
			return S[cnt] - T[cnt];
	}
	//若都一直相等,那么字符串长的那个就大
	return S[0] - T[0];
}


int
StrLength(SString S)
{
	return S[0];
}

//将S清为0串,这个好简单的方法。。后面直接覆盖值就行

Status
ClearString(SString S)
{
	S[0] = 0;
	return OK;
}

Status
StrConcat(SString T,SString S1,SString S2)
{
	int count,i;
	int uncut;
	//不用截断
	if(S1[0]+S2[0] <= MAXSTRLEN)
	{
		T[0] = S1[0] + S2[0];
		for(count = 1;count <= S1[0];count++)
			T[count] = S1[count];
		for(count = S1[0]+1,i = 1;count <= T[0];count++,i++)
			T[count] = S2[i];

		uncut = TRUE;
	}

	//超出长度,需要截断S2
	else if(S1[0] < MAXSTRLEN)
	{
		T[0] = MAXSTRLEN;
		for(count = 1;count <= S1[0];count++)
			T[count] = S1[count];
		for(count = S1[0]+1,i = 1;count <= T[0];count ++,i++)
			T[count] = S2[i];

		uncut = FALSE;
	}

	//S1就需要截断

	else
	{
		T[0] = MAXSTRLEN;
		for(count = 1;count <= S1[0];count ++)
			T[count] = S1[count];
	}

	return OK;

}

Status
SubString(SString Sub,SString T,int pos,int len)
{
	if( pos<1 || pos>T[0] || len < 0 || len > T[0]-pos+1 )
		return ERROR;

	int ct,cnt;
	for(ct = 1,cnt = pos;cnt <= len+pos;ct++,cnt++)
		Sub[ct] = T[cnt];

	Sub[0] = len+1;
	return OK;
}

int
Index(SString S,SString T,int pos)
{
	SString Sub;

	int i = pos;
	if(pos > 0)
	{
		int n = StrLength(S);
		int m = StrLength(T);

		while( i <= n-m+1)
		{
			SubString(Sub,S,i,m-1);
			if(StrCompare(Sub,T) == 0)
				return i;
			else
				i++;

		}//while

	}//if

	printf("no existence~\n");
	return 0;

}

//串S,T,V存在,T是非空串
//用V替换主串S中所有出现的与T相等的不重叠的子串
Status
Replace(SString S,SString T,SString V)
{
	int i;
	i = Index(S,T,1);

	while(S[0]-T[0]+V[0] <= MAXSTRLEN && i)
	{
		StrDelete(S,i,T[0]);
		StrInsert(S,i,V);

		i += V[0];

		i = Index(S,T,i);
	}

	if(i==0)
		return OK;
	else
		return ERROR;

}

Status
StrInsert(SString S,int pos,SString T)
{
	int i;
	if(pos<1 || pos>S[0]+1 || S[0]+T[0]>MAXSTRLEN)
		return ERROR;
	for(i = S[0];i>=pos;i--)
		S[i+T[0]] = S[i];

	for(i = pos;i<pos+T[0]-1;i++)
		S[i] = T[i-pos+1];

	S[0] += T[0];

	return OK;

}

Status
StrDelete(SString S,int pos,int len)
{
	int i;
	if(pos<1 || pos+len-1>S[0] || len < 0)
		return ERROR;

	for(i = pos+len;i<=S[0];i++)
		S[i-len] = S[i];

	S[0] -= len;

	return OK;
}

Status
DestroyString(SString S)
{
	free(S);

	return OK;
}

Status
StrTraverse(SString S)
{
	int i = 1;
	while(i <= S[0]) //字符串下标是如何开始的啊,数组当然从0开始啦,不过第一个位置存的是字符串的长度
	{
		printf("%c",S[i]);
		i++;
	}

	printf("\n");

	return OK;

}
//测试用例
int main(int argc, char const *argv[])
{
	//测试用例
	char *chars1 = "abcdefghijk";
	char *chars2 = "defgh";
	char *chars3 = "/**/";

	SString S,T,V,W;
	SString Q;
	StrAssign(Q,chars3);

	printf("\t**After StrAssign**\n");
	StrAssign(S,chars1);
	StrAssign(T,chars2);
	printf("S: ");
	StrTraverse(S);
	printf("T: ");
	StrTraverse(T);

	printf("\t**After StrCopy**\n");
	printf("copy T to V\n");
	printf("V: ");
	StrCopy(T,V);
	StrTraverse(V);

	printf("\t**After StrEmpty**\n");
	int j = StrEmpty(W);
	if(j == 1)
		printf("W is empty!\n");
	else
		printf("W isn't empty!\n");

	printf("\t**After StrCompare**\n");
	int k = StrCompare(S,T);
	if(k == 0)
		printf("they have same length!\n");
	if(k > 0)
		printf("S is longer!\n");
	if(k < 0)
		printf("T is longer!\n");

	printf("\t**After StrConcat**\n");
    StrConcat(W,S,T);
    printf("W: ");
	StrTraverse(W);

	printf("\t**After SubString**\n");
	printf("from W situation 4,lengh is 5's SubString is: ");
	SubString(V,W,4,5);
	printf("V: ");
	StrTraverse(V);

	printf("\t**After Index**\n");
	int ANSWER = Index(S,T,1);
	printf("find substring in main String's situation = %d\n", ANSWER);

	printf("\t**After Replace**\n");
	Replace(S,T,Q);
	printf("S: ");
	StrTraverse(S);

	printf("\t**After StrInsert**\n");
	StrInsert(T,1,Q);
	printf("T: ");
	StrTraverse(T);

	printf("\t**After StrDelete**\n");
	StrDelete(T,1,3);
	printf("T: ");
	StrTraverse(T);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值