线性结构:串

定义:(String)是由零个或多个字符组成的有限序列,又称字符串。

特点:

  1. 长度:串中字符的个数,称为串的长度。
  2. 空串:长度为零的字符串称为空串。
  3. 空格串:由一个或多个连续空格组成的串称为空格串。
  4. 串相等:两个串相等,是指两个串的长度相等且对应的字符都相等。
  5. 子串:串中任意连续的字符组成的子序列称为该串的子串。
  6. 主串:包含子串的串为该子串的主串。

基本操作:

  • 串的基本操作
    int StringAssign(string *S, char chs[]) //生成一个其值等于字符串常量chs的串S

  • void StringCopy(string *S1, string *S2) //将串S2复制到串S1

  • int LengthString(string *S) //求串S的长度

  • int ShowString(string *S) //打印串S

  • int StringCompare(string *S1, string *S2) //比较串S1和串S2 ,若S1=S2返回0;若S1>S2,返回1;若S1 < S2,返回-1

  • int ConcatString(string *S, string *S1, string *S2) //用S返回由S1和S2连接而成的新串

  • int SubString(string *Sub, string *S, int pos, int len) //用Sub返回串S的第pos个字符起长度为len的子串

  • int Index(string *S, string *T,int pos) //朴素的模式匹配算法 bf算法

  • //返回子串T在主串S中第pos个字符之后的位置,若不存在,返回0

串的顺序存储结构:

#define _CRT_SECURE_NO_WARNINGS 1
/*加油!*/
/*
* 串:顺序存储结构
*/
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#define Maxsize 255
typedef struct string //顺序串的结构体
{
char ch[Maxsize + 1];//从0开始 存储串的一维数组
int len;
}str;
int i = 0, j = 0;
//初始化 进行赋值
int StrAssign(str *s,char chs[]) //生成一个其值等于字符串常量chs的串s
{
int i = 0;
while (chs[i]!= '\0') //循环 将chs的值赋值给s
{
s->ch[i] = chs[i];
++i;
}
s->len = i;//
return 0;
}
//串的复制
void Strcopy(str *s1,str *s2)
{
for (i = 0;i<s1->len;i++)
{
s2->ch[i] = s1->ch[i];
}
s2->len = s1->len;
}
//求串的长度
int StrLength(str *s)
{
return s->len;
}
//判断串是否为空
bool StrEmpty(str *s)
{
if (s->len == 0)
{
return true;
}
return false;
}
//打印串
int ShowString(str *s)
{
if (StrEmpty(s))
{
printf("当前串为空!");
return 0;
}
for (i = 0;i<s->len;i++)
{
printf("%c", s->ch[i]);
}
printf("\n");
return 0;
}
//用s返回由s1和s2连接的新串
int ConcatString(str *s,str *s1,str *s2)
{
for (i=0;i<s1->len;i++)//赋值s1串
{
s->ch[i] = s1->ch[i];
}
s->len = s1->len;
for (j=0;j<s2->len;j++)//赋值s2串
{
s->ch[i] = s2->ch[i];
s->len++;
}
return 0;
}
///用sub返回串S的第pos个字符起长度为len的子串
int SubString(str *sub,str *s,int pos,int len)
{
//判断一下结束条件
if ((pos<1)||(pos>s->len)||(len<0)||(len > s->len - pos + 1))
{
printf("输入有误!\n");
return 0;
}
j = 0;
while(j<len)
{
sub->ch[j] = s->ch[pos - 1];
++j;
++pos;
}
sub->len = len;
return 0;
}
//BF算法
int Index_BF(str *s,str *t,int pos)
{
int i = pos;
int j = 0;
if (pos<1||pos>s->len)
{
printf("输入有误!");
return 0;
}
while (i<=s->len && j<=t->len)
{
if (s->ch[i - 1] == t->ch[j])
{
++i;
++j;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j == t->len)
return i - t->len;
else
return 0;
}
int main()
{
str S;
str N;
str M;
str T;
char ch[] = { "hello world" };
char ch1[] = { "hello" };
char ch2[] = { "hello world red" };
char ch3[] = { "red" };
StrAssign(&S, ch);
StrAssign(&N, ch1);
StrAssign(&M, ch2);
printf("S串:");
ShowString(&S);
printf("当前S串的长度为%d\n", StrLength(&S));
printf("N串:");
ShowString(&N);
printf("当前N串的长度为%d\n", StrLength(&N));
printf("M串:");
ShowString(&M);
printf("当前N串的长度为%d\n", StrLength(&M));
StrAssign(&T, ch3);
printf("T串:");
ShowString(&T);
printf("当前T串的长度为%d\n", StrLength(&T));
printf("BF算法求解模式子串的位置:\n");
printf("(BF暴力模式匹配算法)子串T在主串M中的位置:%d\n", Index_BF(&M, &T, 1));
printf("用sub返回串S的第pos个字符起长度为len的子串:\n");
SubString(&L,&S,7,5);
printf("显示S串中第7个字符起长度为5的子串L:");
ShowString(&L);
printf("用P返回由s1和s2连接的新串:\n");
ConcatString(&P, &N, &M);
printf("显示P返回由S和T连接的新串:");
ShowString(&P);
system("pause");
return 0;
}
posted @   咕噜咕噜咚c  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示