数据结构——顺序串【c语言版】

串(string)是由零个或多个字符组成的有限序列。

含零个字符的串称为空串。

子串:一个串中任意个连续字符组成的序列称为该串的子串。

子串的个数:n(n+1)/2+1

子串的位置:子串的第一个字符在主串的序号。

注:区分空串与空白串:

        空白串长度不为零,串中有若干空格

与线性表一样,串也有顺序存储结构与链式存储结构,前者简称顺序串,后者简称链式串。

        顺序串的存储方式有两种:

       1. 非紧缩格式(其存储密度小),每个字存储一个字符,比较浪费存储空间,但处理单个字符或一组连续字符方便。

        2.紧缩格式(其存储密度大),每个字存储多个字符,比较节省存储空间,但处理单个字符不太方便,运算效率低。

我们主要讨论前者,非紧缩格式的顺序串,类型声明如下:

#define MAXSIZE 128

typedef struct
{
	char data[MAXSIZE];//存储字符串 
	int length;//存储长度 
}SQString;

完整代码如下:

#include <stdio.h>

#define MAXSIZE 128

typedef struct
{
	char data[MAXSIZE];//存储字符串 
	int length;//存储长度 
}SQString;



/*
1.生成串 
*/ 
void StrAssign(SQString* s,char *t)  // '\0'是字符串的结束标志 
{
	int i;
	//值
	i=0;
	while(t[i]!='\0')
	{
		(*s).data[i]=t[i];
		i=i+1;
	}
	//长度
	(*s).length=i; 
} 

/*
2.串复制 
*/
int StrCopy(SQString *s,SQString *t)
{
	int i;
	for(i=0;i<=(*t).length-1;i++)
	{
		(*t).data[i] = (*s).data[i];	
	}
	(*t).length = (*s).length;
} 

/*
3.判断串是否相等
若相等,返回1;否则,返回0 
*/
int StrEqual(SQString s,SQString t)
{
	int i;
	if(s.length==t.length)
	{
		for(i=0;i<=s.length-1;i++)
		{
			if(s.data[i]!=t.data[i])
			{
				return 0;  //长度相等的串中有对应字符不相同 
			}
		}
		return 1;
	}
	return 0;  //长度不相等 
} 

/*
4.求长度 
*/
int StrLength(SQString s)
{
	return s.length;
}

/*
5.字符串连接 
*/
SQString Concat(SQString s,SQString t)
{
	SQString str;  //定义结果串 
	int i;
	//值
	for(i=0;i<=s.length-1;i++)
	{
		str.data[i]=s.data[i];  //将s.data[0...s.length-1]复制到str 
	}
	
	for(i=0;i<=t.length-1;i++)
	{
		str.data[s.length+i]=t.data[i];  //将t.data[0...t.length-1]复制到str 
	}
	//长度 
	str.length=s.length+t.length; 
	return str;
} 

/*
6.求子串
在字符串s中,把从第i个字符开始连续的j个字符形成的子串存储到*t中 
参数合法:i>=1&&j>=0&&(i+j-2)<=(s.length-1)
若参数合法,进行操作,返回1;
否则,提示,返回0 
*/
int SubStr(SQString s,int i,int j,SQString *t)
{
	int k;
	if(i>=1&&j>=0&&(i+j-2)<=(s.length-1))
	{
		//值
		for(k=0;k<=j-1;k++)
		{
			(*t).data[k]=s.data[k+(i-1)];
		}
		//长度
		(*t).length=j;
		return 1;
	} 
	else
	{
		printf("参数错误!\n");
		return 0;
	}	 
} 

/*
7.添加 
参数合法:i>=1&&i<=s.length+1
若参数合法,进行操作,返回1;
否则,提示,返回0
*/
int InsStr(SQString *s,int i,SQString t)
{
	int j;
	if(i>=1&&i<=(*s).length+1)
	{
		//往后移动t.length位置
		for(j=(*s).length-1;j>=i-1;j--)
		{
			(*s).data[j+t.length]=(*s).data[j];
		}
		//值
		for(j=0;j<=t.length-1;j++)
		{
			(*s).data[j+(i-1)]=t.data[j];
		}
		//长度
		(*s).length=(*s).length+t.length;
		return 1;
	}
	else
	{
		printf("参数错误!\n");
		return 0;
	}	 
}

/*
9.删除
参数合法:i>=1&&j>=0&&(i+j-2)<=(s.length-1)
若参数合法,进行操作,返回1;
否则,提示,返回0 
*/
int DelStr(SQString *s,int i,int j,SQString *t)
{
	int k;
	
	if(i>=1&&j>=0&&(i+j-2)<=((*s).length-1))
	{
		//把要删除的子串存储到*t中
		for(k=0;k<=j-1;k++)
		{
			(*t).data[k]=(*s).data[k+(i-1)];
		}
		(*t).length=j;
		//移动删除
		for(k=i+j-1;k<=(*s).length-1;k++)
		{
			(*s).data[k-j]=(*s).data[k];
		}
		//长度
		(*s).length=(*s).length-j; 
		return 1;
	}
	else
	{
		printf("参数错误!\n");
		return 0;
	}	
}

/*
9.替换
(1). j==t.length  不移动 
(2).j>t.length   前移j-t.length 
(3).j<t.length   后移t.lenthg-j 
*/
int RepStr(SQString *s,int i,int j,SQString t)
{
	int k;
	if (j=t.length)
    {
    	for(k=0;k<t.length;k++)
  	    (*s).data[i-1]=t.data[k];	
  	}
  	else
  	{
	  	if(j>t.length)
	     {
   	  	   for(k=0;k<t.length;k++)
				(*s).data[i-1]=t.data[k];	
   	  	 }
   	  	else
	 	{
	  	   if(j<t.length)
			 {
				for(k=0;k<j;k++)
 				   (*s).data[i-1]=t.data[k];
 			}	
        }
     }  
    (*s).length=(*s).length-j+t.length;	
}

/*
10.输出 
*/
void DispStr(SQString s)
{
	int i;
	printf("字符串为:");
	for(i=0;i<=s.length-1;i++)
	{
		printf("%c",s.data[i]);
	} 
	printf("\n");
}



int main()
{
	SQString s;
	char *t;
	t="Hello ABC";
	
	StrAssign(&s,t); //串赋值 
	DispStr(s);  // 输出串的元素 
	
	
	return 1;
} 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值