《大话数据结构》读书笔记之串和源码

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "declear.h"

#define MAXSIZE 40

typedef char String[MAXSIZE + 1];

/* 生成一个其值等于chars的串T */
Status StrAssign(String T,char *chars)
{
	unsigned int index;

	if (strlen(chars) > MAXSIZE)
	{
		return ERROR;
	}
	
	T[0] = strlen(chars);	//T[0]存放长度
	for (index=1; index <= strlen(chars); index++)
	{
		T[index] = chars[index - 1];
	}
	T[index] = '\0';	//方便调试
	return OK;
}

/* 由串S复制得串T */
Status StrCopy(String T,String S)
{
	unsigned int index;

	for(index = 0; index <= S[0]; index++)
	{
		T[index] = S[index];
	}
	T[index] = '\0';	//方便调试

	return OK;
}

/* 若S为空串,则返回TRUE,否则返回FALSE */
Status StrEmpty(String S)
{
	if(!S[0])
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
/*  初始条件: 串S和T存在 */
/*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */
int StrCompare(String S,String T)
{
	/*  算法一(不简明)
	unsigned minLen;
	unsigned index;

	minLen = S[0] < T[0] ? S[0]:T[0];

	for (index = 1; index <= minLen; index++)
	{
		if (S[index] != T[index])	//一旦遇上不相等则推出循环
		{
			break;
		}
	}

	if (index > minLen && S[0] == T[0])				//长度相同,并且完全匹配,则相等
	{
		return 0;
	}
	else if ((index <= minLen && S[index] > T[index]) || (index > minLen && S[0] > T[0]))
	{
		return 1;					//若没有完全匹配,在适配的位置大的则大;如果完全匹配,长度大的则大
	}
	else 
	{
		return -1;
	}
*/

	/***方法简明,想法很好***/
	for (unsigned int index = 1; index <= S[0], index <= T[0]; index++)
	{
		if (S[index] != T[index])		//遇上不相等,比较失配位置的值
		{
			return S[index] - T[index];	
		}
	}

	return S[0] - T[0];		//若果完全匹配,比较长度

}

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

/* 初始条件:串S存在。操作结果:将S清为空串 */
Status ClearString(String S)
{
	S[0] = 0;
	return OK;
}

/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T,String S1,String S2)
{
	unsigned index;

	if(S1[0] + S2[0] <= MAXSIZE)
	{
		//StrAssign(T, S1); //不能这样把S1的值赋给T,这样吧S[0]赋给了T[1]
		
		for (index = 1; index <= S1[0]; index++)
		{
			T[index] = S1[index];
		}
//		printf("T[0] = %d\n",T[0]);
//		printf("S1[0] = %d\n",S1[0]);
		for (index = 1; index <= S2[0]; index++)
		{
			T[S1[0] + index] = S2[index];
			//++T[0];
		}
		T[0] = S1[0] + S2[0];
		T[S1[0] + S2[0] + 1] = '\0';
		return TRUE;
	}
	else 
	{
		//StrAssign(T, S1);

		for (index = 1; index <= S1[0]; index++)
		{
			T[index] = S1[index];
		}

		for (index = S1[0] + 1; index <= MAXSIZE; index++)
		{
			T[index] = S2[index - S1[0]];
		}
		T[MAXSIZE] = '\0';
		return FALSE;
	}
}

/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub,String S,int pos,int len)
{
	if (pos < 1 || pos > S[0] || pos > S[0] - len +1 || len <0)		//注意条件
	{
		return ERROR;
	}

	for (unsigned index = 1; index <= len; index++)
	{
		Sub[index] = S[index + pos - 1];
	}

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

/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* 其中,T非空,1≤pos≤StrLength(S)。 */
int Index(String S, String T, int pos) 
{
	int sIndex = pos;
	int tIndex = 1;

	while (sIndex <= S[0] && tIndex <= T[0])
	{
		if (T[tIndex] == S[sIndex])
		{
			++tIndex;
			++sIndex;
		}
		else
		{
			tIndex = 1;
			sIndex = sIndex - tIndex + 2;
		}
	}

	if (tIndex > T[0])
	{
		return sIndex - T[0];
	}
	else 
	{
		return FALSE;
	}
}

Status StrPrint(String T)
{
	for(unsigned index = 1; index <= T[0]; index++)
	{
		printf("%c", T[index]);
	}
	printf("\n");

	return OK;
}

/*  初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */
/*  操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */
Status StrInsert(String S,int pos,String T)
{ 
	unsigned index;
	if (S[0] + T[0] <= MAXSIZE)	//完全插入
	{

		for (index = S[0]; index >= pos; index--)
		{
			S[index + T[0]] = S[index];
		}

		for (index = 1; index <= T[0]; index++)
		{
			S[index + pos - 1] = T[index];
		}

		S[0] = S[0] + T[0];
		return OK;
	}
	else				//不完全插入
	{
		for (index = S[0]; index >= pos; index--)	//从pos开始到串尾移动到剩余空间的尾部
		{
			S[MAXSIZE - (S[0] - index)] = S[index];
			//printf("0k\n");
		}
		
		//printf("%c\n", S[MAXSIZE]);
		
		for (index = 1; index <= MAXSIZE - S[0]; index++)	//从T[1]开始到剩余空间,插满为止
		{
			S[pos + index - 1] = T[index];
		}
		S[0] = MAXSIZE; 
		return FALSE;
	}

}

/*  初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */
/*  操作结果: 从串S中删除第pos个字符起长度为len的子串 */
Status StrDelete(String S,int pos,int len)
{
	int index;

	if (pos < 1 || pos + len > S[0] - 1 || len < 0)
	{
		return ERROR;
	}

	for (index = pos + len; index <= S[0]; index++)
	{
		S[index - len] = S[index];
	}
	S[0] = S[0] - len;

	return OK;

}

int main()
{
	String S, T, C;
	Status flag = StrAssign(S,"hello,world!");
	
	if (!flag)
	{		
		printf("out of length!\n");
		exit(OVERFLOW);
	}

	printf("S = ");
	StrPrint(S);

	StrCopy(T, S);

	printf("T = ");
	StrPrint(T);

	printf("is string S an empty string?yes(1),no(0)\n");
	printf("%d\n",StrEmpty(S));

	StrAssign(S,"hello,world!!!!");

	printf("S = ");
	StrPrint(S);
	
	printf("T = ");
	StrPrint(T);
	
	printf("StrLength(S) = %d\n",StrLength(S));
	printf("StrLength(T) = %d\n",StrLength(T));

    SubString(C, S, 3, 3);
	printf("C = ");
	StrPrint(C);

	printf("position of C in S is = %d.Not Find (0)\n",Index(S, C, 1));

	printf("compare S and T? S is bigger(1), equal(0), S is smaller(-1).\n");
	printf("%d\n",StrCompare(S, T));

	printf("%d\n",Concat(C, S, T));
	printf("StrLength(C) = %d\n",StrLength(C));

	printf("C = ");
	StrPrint(C);

	StrAssign(S,"Testmmmmmmmmmmmmmm");
	StrInsert(S, 1, C);

	printf("S = ");
	StrPrint(S);

	StrDelete(S,3,3);

	printf("S = ");
	StrPrint(S);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值