c语言版数据结构(奇迹冬瓜)-串(定长顺序存储各项操作)

//-----头文件------
#include<stdio.h>
#include<stdlib.h>

//------宏定义------
#define MAXSTRLEN 255
#define OVERFLOW -2
#define TURE 1
#define ERROR 0

//-------类型名替换--------
typedef unsigned char SString[MAXSTRLEN+1];
typedef int Bool;

//-----函数列表-----
Bool StrAssign(SString *T,char *s);
Bool StrCopy(SString *T,SString S);
Bool StrEmpty(SString S);
int StrCompare(SString S,SString T);
int StrLength(SString S);
Bool ClearString(SString *S);
Bool Concat(SString *T,SString S1,SString S2);
Bool SubString(SString *Sub,SString S,int pos,int len);
Bool StrInsert(SString *S,int pos,SString T);
Bool StrDelete(SString *S,int pos,int len);
Bool Replace(SString *S,SString T,SString V);
Bool DestroyString(SString *S);
int Index(SString S,SString T,int pos);
void StrOutput(SString S);

//-----主函数做替换测试------
void main()
{
	SString t,*T=&t,s,*S=&s,s0,*S0=&s0;
	int n;
	StrAssign(T,"de");
	StrAssign(S0,"ed");
	StrAssign(S,"adegddefdef");
	Replace(S,t,s0);
	//printf("%d",Index(s,t,1));
	//ClearString(S);
	//StrCopy(S,t);
	//for(n=1;n<=(*S)[0];n++)
	StrOutput(s);
	getchar();
	getchar();
}

//------生成一个其值等于字符串常量的串T------
Bool StrAssign(SString *T,char *s)
{
	int i;
	for(i=0;'\0'!=*s;s++,i++)
	{
		(*T)[i+1]=*s;
	}
	(*T)[0]=i;
	return TURE;
}

//------生成一个其值等于串S的串T------
Bool StrCopy(SString *T,SString S)
{
	int i;
	for(i=1;i<=S[0];i++)
	{
		(*T)[i]=S[i];
	}
	(*T)[0]=S[0];
	return TURE;
}

//-----判断是否为空串------
Bool StrEmpty(SString S)
{
	return S[0]==0?TURE:ERROR;
}

//-----比较两个串的大小------
int StrCompare(SString S,SString T)
{
	int i;
	if(0==S[0]||0==T[0])
	{
		return ERROR;
	}
	for(i=1;i<=S[0]&&i<=T[0];i++)
	{
		if(S[i]>T[i])
		{
			return 1;
		}
		else if(S[i]<T[i])
		{
			return -1;
		}
		else
		{
			continue;
		}
	}
	if(S[0]==T[0])
	{
		return 0;
	}
	else if(S[0]>T[0])
	{
		return 1;
	}
	else
	{
		return -1;
	}
}

//-----返回串的长度-----
int StrLength(SString S)
{
	return S[0];
}

//-----清空串-----
Bool ClearString(SString *S)
{
	if(0!=(*S)[0])
	{
		(*S)[1]='\0';
		(*S)[0]=0;
	}
	return TURE;
}

//-----用T返回由S1和S2连接而成的串-----
Bool Concat(SString *T,SString S1,SString S2)
{
	int i,j;
	if(S1[0]+S2[0]<=MAXSTRLEN)
	{
		for(i=1;i<=S1[0];i++)
		{
			(*T)[i]=S1[i];
		}
		for(j=1;i<=S1[0]+S2[0];i++)
		{
			(*T)[i]=S2[j++];
		}
		(*T)[0]=S1[0]+S2[0];
		return TURE;
	}
	else if(S1[0]<MAXSTRLEN&&(S1[0]+S2[0])>MAXSTRLEN)
	{
		for(i=1;i<=S1[0];i++)
		{
			(*T)[i]=S1[i];
		}
		for(j=1;i<=MAXSTRLEN;i++)
		{
			(*T)[i]=S2[j++];
		}
		(*T)[0]=MAXSTRLEN;
		return ERROR;
	}
	else
	{
		for(i=1;i<=MAXSTRLEN;i++)
		{
			(*T)[i]=S1[i];
		}
		(*T)[0]=MAXSTRLEN;
		return ERROR;
	}
}

//-----输出串-----
void StrOutput(SString S)
{
	int i;
	for(i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
}

//-----用Sub返回串S中在pos位置开始长度为len的字串-----
Bool SubString(SString *Sub,SString S,int pos,int len)
{
	int i,j;
	if((pos>=1&&pos<=S[0])&&(len>=0&&len<=S[0]-pos+1))
	{
		for(i=1,j=pos;i<=len;i++)
		{
			(*Sub)[i]=S[j++];
		}
		(*Sub)[0]=len;
		return TURE;
	}
	return ERROR;
}

//-----查找在相同子串的固定位置-----
int Index(SString S,SString T,int pos)
{
	int m,n,i;
	SString sub;
	if(pos>0)
	{
		n=StrLength(S);
		m=StrLength(T);
		i=pos;
		while(i<=n-m+1)
		{
			SubString(&sub,S,i,m);
			if(0!=StrCompare(sub,T))
			{
				++i;
			}
			else
			{
				return i;
			}
		}
	}
	return 0;
}

//-----用V替换在S中存在的所有与T相同的子串-----
Bool Replace(SString *S,SString T,SString V)
{
	int i=1,j=1,m=StrLength(T),n=StrLength(V);
	while(i<=(*S)[0])
	{
		j=Index(*S,T,i);
		StrDelete(S,j,m);
		StrInsert(S,j,V);
		i+=n+1;
	}
	return TURE;
}


//-----在串S的第pos位置前插入串T-----
Bool StrInsert(SString *S,int pos,SString T)
{
	int m,n=StrLength(T),i=1,j=pos;
	if(pos>=1&&pos<=StrLength(*S)+1)
	{
		while(i<=n)
		{
			for(m=StrLength(*S)+1;j<m;m--)
			{
				(*S)[m]=(*S)[m-1];
			}
			(*S)[j]=T[i++];
			(*S)[0]+=1;
			j+=1;
		}
		return TURE;
	}
	return ERROR;
}

//------删除串S中从pos位置起长度为len的子串------
Bool StrDelete(SString *S,int pos,int len)
{
	int i=1,j,m,n;
	if(pos>=1&&pos<=StrLength(*S)-len+1)
	{
		while(i<=len)
		{
			for(m=StrLength(*S),j=pos;j<=m;j++)
			{
				(*S)[j]=(*S)[j+1];
			}
			(*S)[0]-=1;
			i++;
		}
		return TURE;
	}
	return ERROR;
}

//-----销毁串-----
Bool DestroyString(SString *S)
{
	free(S);
	return TURE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值