线性结构:串

定义:(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 @ 2022-10-02 14:32  咕噜咕噜咚c  阅读(111)  评论(0)    收藏  举报