目录
一、串的定义
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)结果演示
版权声明:本文为m0_50708613原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。