数据结构-串

 

目录

一、串的定义

1、串的定义

2、串的一些概念

二、串的存储结构

三、顺序串

1、顺序串定义

2、顺序串的基本运算

(1)代码部分

(2)结果演示


一、串的定义

1、串的定义

串是有零个或或多个字符组成的有限序列,又称为字符串。

一般记为: (n为正整数),str中串名,(1<=i<=n),由字母、数字和其他字符组成,n为串的长度。

2、串的一些概念

(1)空串:长度为零的串,称为空串,不含任意字符。

(2)子串:串中任意个连续的字符组成的子序列称为该串的子串,其中空串是任意串的子串。

注:串、子串和空串等概念与集合的概念有着很多相似之处。

二、串的存储结构

串的存储结构主要分为顺序存储结构和链式存储结构两大类。

三、顺序串

1、顺序串定义

用一组地址连续的存储单元存储串值的字符序列。

2、顺序串的基本运算

(1)代码部分

#include <stdio.h>
#include<string.h>
#include <malloc.h>

#define MaxSize 200
//串声明
typedef struct
{
	char data[MaxSize];
	int length;
}SqString;

//串赋值
void Assign(SqString &s,char str[])
{
	int i=0;
	while(str[i]!='\0')          //遍历str的所有字符,数组以空字符'\0'标识串结束
	{
		s.data[i]=str[i];
		i++;
	}
	s.length=i;
}

//销毁串
void DestroyStr(SqString s)
{
}
//串复制
void StrCopy(SqString &s,SqString t)
{
	int i;
	for(i=0;i<t.length;i++)
		s.data[i]=t.data[i];
	s.length=t.length;
}

//串长度

int StrLength(SqString s)
{
	return (s.length);
}
//判断串相等运算算法

int StrEqual(SqString s,SqString t)
{
	int i=0;
	if(s.length !=t.length)          //串长不同时返回0
		return (0);
	else
	{
		for(i=0;i<s.length;i++)
			if(s.data[i]!=t.data[i])
				return 0;
			return 1;
	}
}

//串连接运算算法

SqString Concat(SqString s,SqString t)
{
	SqString r;
	int i,j;
	for(i=0;i<s.length;i++)
		r.data[i]=s.data[i];             //将s复制到r
	for(j=0;j<t.length;j++)
		r.data[s.length+j]=t.data[j];   //将t复制到r
	r.length=i+j;
	return r;                           //返回r
}

//子串运算

SqString SubStr(SqString s,int i,int j)
{
	SqString t;
	int k;
	if(i<1 || i>s.length || j<1 || i+j>s.length+1)
		t.length=0;
	else
	{
		for(k=i-1;k<i+j;k++)
			t.data[k-i+1]=s.data[k];
		t.length=j;
	}
	return t;
}

//查找子串位置运算算法

int Index(SqString s,SqString t)
{
	int i=0,j=0;                             //i和j分别扫描主串s和子串t
	while(i<s.length && j<t.length)          //两个串都没有扫描完
	{
		if(s.data[i]==t.data[j])             //对应字符相同时,继续比较下一对字符
		{
			i++;                             //继续后面两个字符的比较
			j++;
		}
		else                                 //否则,主串指针回溯重新开始下一次匹配
		{
			i=i-j+1;                         //i回退到原i的下一个位置
			j=0;                             //j从t的第一个字符开始
		}
	}
	if(j>=t.length)
		return i-t.length+1;
	else
		return 0;
}

//子串插入

int InsStr (SqString &s,int i,SqString t)
{
	int j;
	if(i<1 || i>s.length+1)                     //位置参数错误返回0
		return 0;
	else
	{
		for(j=s.length-1;j=i-1;j--)            //将s.data[i-1..s.length-1]
			s.data[j+t.length]=s.data[j];      //后移t.length个位置
		for(j=0;j<t.length;j++)                //插入子串t
			s.data[i+j-1]=t.data[j];
		s.length=s.length+t.length;            //修改s串长度
		return 1;                              //成功插入返回1
	}
}

//子串删除

int DelStr(SqString &s,int i,int j)
{
	int k;
	if(i<1 || i>s.length || j<1 || i+j>s.length+1)
		return 0;
	else
	{
		for(k=i+j-1;k<s.length;k++)
			s.data[k-j]=s.data[k];
		s.length=s.length-j;
		return 1;
	}
}

//子串替换
SqString RepStrAll(SqString s,SqString s1,SqString s2)
{
	int i;
	i=Index(s,s1);
	while(i>0)
	{
		DelStr(s,i,s1.length);                   //从s中删除子串s1
		InsStr(s,i,s2);                           //在s中插入子串s2         
		i=Index(s,s1);
	}
	return s;
}
//输出串

void DispStr(SqString s)
{
	int i;
	for(i=0;i<s.length;i++)
		printf("%c",s.data[i]);
	printf("\n");
}

void main()
{
	SqString s1,s2,s3,s4,s5,s6,s7;
	Assign(s1,"abcd");
	printf("s1:");
	DispStr(s1);
	printf("s1 的长度: %d\n",StrLength(s1));
	printf("s1=>s2\n");
	StrCopy(s2,s1);
	printf("s2 :");
	DispStr(s2);
	printf("s1和s2 %s\n",(StrEqual(s1,s2)==1 ? "相同" : "不相同"));
	Assign(s3,"12345678");
	printf("s3 :");
	DispStr(s3);
	printf("s1和s3连接=>s4\n");
	s4=Concat(s1,s3);
	printf("s4:");
	DispStr(s4);
	printf("s3[2..5]=>s5\n");
	s5=SubStr(s3,2,4);
	printf("s5:");
	DispStr(s5);
	Assign(s6,"567");
	printf("s6:");
	DispStr(s6);
	printf("s6在s3中位置:%d\n",Index(s3,s6));
	printf("从s3中删除s3[3..6]字符\n");
	DelStr(s3,3,4);
	printf("s3:");
	DispStr(s3);
	printf("从s4中将s6替换成s1=>s7\n");
	s7=RepStrAll(s4,s6,s1);
	printf("s7:");
	DispStr(s7);
	DestroyStr(s1);
	DestroyStr(s2);
	DestroyStr(s3);
	DestroyStr(s4);
	DestroyStr(s5);
	DestroyStr(s6);
	DestroyStr(s7);
}

(2)结果演示

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯择微韵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值