串的堆分配存储表示以及相关操作 C语言版

 
/***********************************************/
/*	该算法虽然是使用动态内存分配的方法实现
	但因其存储单元的地址是连续的
	所以本质上还是属于顺序存储
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/***********************************************/
#define MaxSize		256
typedef struct {
	char		*ch;
	int		length;
}HString, *pHString;
/***********************************************/
//函数声明
void InitString(pHString ch);			//创建用户所输入的串
void DispString(pHString ch);			//输出字符串
int GetLenString(pHString ch);			//获得字符串的长度
int EmptyString(pHString ch);			//字符串判空
int StrCompare(pHString T, pHString S);	//字符串的比较
int ClearStr(pHString S);				//将S清空, 并释放S所占的内存
int Concat(pHString T, pHString S1, pHString S2);		//字符串连接
int SubString(pHString Sub, pHString S, int pos, int len);	//在Sub中返回S中第pos位开始的len个字符组成的子串
int Index(pHString T, pHString S, int pos);				//串的模式匹配(简单算法的实现)
/***********************************************/
int main(void)
{	
	HString	T;
	InitString(&T);
	HString S;
	InitString(&S);
	int k = Index(&T, &S, 2);
	printf("\n\n%d", k);
	return 0;
}
/***********************************************/
//创建用户所输入的串
void InitString(pHString ch)
{
	char str[MaxSize];
	gets(str);
	int i;
	for (i=0; str[i]!='\0'; ++i) ;

	ch->ch = (char *)malloc(sizeof(char) * i);
	if (NULL == ch->ch)
	{
		printf("内存分配失败!程序终止....");
		exit(-1);
	}

	int j;
	for (j=0; j<i; ++j)
		ch->ch[j] = str[j];
	ch->length = j;
}
/***********************************************/
//输出字符串
void DispString(pHString ch)
{
	int i;
	for (i=0; i<ch->length; ++i)
		putchar(ch->ch[i]);
	putchar('\n');
}
/***********************************************/
//获得字符串的长度
//前提是ch串存在  并且已被初始化
int	GetLenString(pHString ch)
{
	return ch->length;
}
/***********************************************/
//字符串判空
//前提是ch串存在  并且已被初始化
int EmptyString(pHString ch)
{
	if (0 == ch->length)
		return 1;
	else
		return 0;
}
/***********************************************/
//若S大于T 返回值>0		若S等于T 返回值=0	若S小于T 返回值<0
int StrCompare(pHString T, pHString S)
{
	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;
}
/***********************************************/
//将S清空, 并释放S所占的内存
int ClearStr(pHString S)
{
	S->length = 0;
	free(S->ch);
	S->ch = NULL;
	return 1;
}
/***********************************************/
//字符串连接
int Concat(pHString T, pHString S1, pHString S2)
{
	int Tlen = S1->length + S2->length;
	T->ch = (char *)malloc(sizeof(char)*Tlen);
	if (NULL == T->ch)
	{
		printf("内存分配失败!程序终止....");
		exit(-1);
	}

	int i;
	for (i=0; i<S1->length; ++i)
		T->ch[i] = S1->ch[i];
	int j;
	for (j=0; j+i<Tlen; ++j)
		T->ch[i+j] = S2->ch[j];

	T->length = Tlen;
	return 1;
}
/***********************************************/
//在Sub中返回S中第pos位开始的len个字符组成的子串
int SubString(pHString Sub, pHString S, int pos, int len)
{
	if (pos<=0 || pos >S->length || len<0 || len>S->length-pos+1)
		return 0;
	
	Sub->ch = (char *)malloc(sizeof(char) * len);
	int i;
	for (i=0; i<len; ++i)
		Sub->ch[i] = S->ch[pos+i-1];
	Sub->length = len;
	return 1;
}
/***********************************************/
//串的模式匹配  简单算法的实现
int Index(pHString T, pHString S, int pos)
{
	if (pos<1 || pos >T->length)
		return 0;
	int Tlen = T->length;
	int Slen = S->length;
	int i = pos-1, j = 0;

	while (i<Tlen && j<Slen)
	{
		if (T->ch[i] == S->ch[j])
		{
			++i;
			++j;
		}
		else
		{
			i = i-j+1;
			j = 0;
		}
	}
	if (j>=Slen)
		return i-Slen;
	else
		return -1;
}
/***********************************************/

这是以前写的代码,因为当时在VC6.0上新建文件的时候没有加.c 所以实际上建的是C++文件,所以在变量的定义上位置比较随便,当要用的时候再定义而在VC6.0中,C语言的变量必须定义在函数开始处。
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值