数据结构-C语言实现串

#include "stdlib.h"
#include "stdio.h"
#define true 1
#define false 0
#define MAXLEN 255
typedef int Status;
typedef struct{
	char ch[MAXLEN];
	int length;
}String;
//串的赋值
void StrAssign(String *S,char *string)
{
	//生成一个值为string的串S,string是一个字符串常量
	char *str;
	int len,i;
	str=string;
	for(len=0;str!='\0';str++);
	len++;
	if(len==0)
	{
		S->ch[0]='\0';
		S->length=0;
	}
	else
	{
		for(i=0;i<len;i++)
			S->ch[i]=string[i];
		S->length=len;
	}
}
//判断串是否为空
Status StrEmpty(String S)
{
	//判断串是否为空串,若为空,返回true,否则返回false
	if(S.length==0)
		return true;
	else
		return false;
}
//串比较
Status StrCompare(String S,String T)
{
	//已知字符串S和T,若S>T,返回1,若S=T,返回0,若S<T,返回-1
	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]);
		if(S.ch[i]!=T.ch[i])
		{
			if(S.ch[i]>T.ch[i])
				return 1;
			else
				return -1;
		}
	}
	return 0;
}
//串复制
void StrCopy(String *T,String S)
{
	//将串S的内容复制给T
	int i;
	for(i=0;i<S.length;i++)
	{
		T->ch[i]=S.ch[i];
	}
	T->length=S.length;
}
//求串长
int StrLength(String S)
{
	//返回串S的长度
	return S.length;
}
//清空串
void StrClear(String *S)
{
	//将串S清为空
	S->length=0;
}
//串连接
/*
1.当S1.length+S2.length<=MAXLEN时,则将S2直接加在S1的后面
2.当S1.length+S2.length>MAXLEN时,而S1.length<MAXLEN时,则与S1连接后
S2中超出MAXLEN的部分被截断
3.当S1.length==MAXLEN时,则S2全部被舍弃,不需要连接
*/
Status Concat(String *T,String S1,String S2)
{
	int i;
	if(S1.length+S2.length<=MAXLEN)
	{
		for(i=0;i<S1.length;i++)
			T->ch[i]=S1.ch[i];
		for(i=0;i<S2.length;i++)
			T->ch[S1.length+i]=S2.ch[i];
		T->length=S1.length+S2.length;
		return true;
	}
	else if(S1.length<MAXLEN)
	{
		for(i=0;i<S1.length;i++)
			T->ch[i]=S1.ch[i];
		for(i=S1.length;i<MAXLEN;i++)
			T->ch[i]=S2.ch[i-S1.length];
		T->length=MAXLEN;
		return false;
	}
	else
	{
		for(i=0;i<MAXLEN;i++)
		{
			T->ch[i]=S1.ch[i];
		}
		return false;
	}
}
//求子串
Status SubString(String *Sub,String S,int pos,int len)
{
	//用Sub返回串S的地pos个字符起长度为len的子串
	int i;
	if(pos<0||pos>=S.length||len<1||len>S.length)
	{
		Sub->length=0;
		return false;
	}
	for(i=0;i<len;i++)
		Sub->ch[i]=S.ch[pos+i];
	Sub->length=len;
	return true;
}
//串定位
Status StrIndex(String S,String T,int pos)
{
	//返回T在主串S中第pos个字符之后第一次出现的位置
	int i,j;
	if(S.length==0||T.length==0||pos<0)
		return false;
	i=pos;
	j=0;
	while(i<S.length&&j<T.length)
	{
		if(S.ch[i]==T.ch[j])
		{
			i++;
			j++;
		}
		else
		{
			i=i-j+1;//等价于i=i+1;
			j=0;
		}
	}
	if (j>=T.length)
	{
		return i-j+1;
	} 
	else
	{
		return 0;
	}
}
//串插入
/*
1.当S.length+T.length<=MAXLEN时,则将S2后移T.length个位置,再将T插入
2.当S.length+T.length>MAXLEN,而S1.length+T.length<MAXLEN时,
则将T.length个位置时超出MAXLEN的部分被截断,再将T插入
3.当S1.length+T.length>MAXLEN时,则将S2全部舍弃(不需要后移),
且在T插入时超出MAXLEN的部位被截断
*/
Status StrInsert(String *S,int pos,String T)
{
	//在串S的第pos个位置之前插入串T
	int i;
	if(pos<0||pos>S->length||S->length==0)
		return false;
	if(S->length+T.length<=MAXLEN)
	{
		for(i=S->length-1+T.length;i>=pos+T.length;i--)
			S->ch[i]=S->ch[i-T.length];//串S的后半部分后移
		for(i=0;i<T.length;i++)//在串S中插入串T
			S->ch[pos+i]=T.ch[i];
		S->length=S->length+T.length;
	}
	else if (pos+T.length<=MAXLEN)
	{//插入后串S长大于MAXLEN,但串T可以全部插入
	//去掉串S的后半部分的溢出部分并后移
		for(i=MAXLEN-1;i>pos-1+T.length;i--)
			S->ch[i]=S->ch[i-T.length];
		for(i=0;i<T.length;i++)
			S->ch[pos+i]=T.ch[i];
		S->length=MAXLEN;
	}
	else//串T需部分截断
	{
		for(i=0;i<MAXLEN-pos;i++)
			S->ch[pos+i]=T.ch[i];
		S->length=MAXLEN;
	}
	return true;
}
//串删除
Status StrDelete(String *S,int pos,int len)
{
	//在串S中删除第pos个位置起长度为len的子串
	int i;
	if(pos<0||pos>S->length-len)
		return false;
	for(i=pos+len;i<S->length;i++)
		S->ch[i-len]=S->ch[i];
	S->length=S->length-len;
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值