数据结构之‘串’

\quad

一. 串的定义

\quad

在这里插入图片描述
\quad

在这里插入图片描述
\quad

\quad

二. 串的基本操作

\quad

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

\quad

三. 串的存储结构

\quad

\quad

3.1 顺序存储

\quad
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得一个一个遍历

在这里插入图片描述
结合方案一和方案二的优点

\quad

3.2 链式存储

\quad
在这里插入图片描述

\quad

3.3 基于顺序存储的基本操作

\quad

在这里插入图片描述
\quad
\quad

在这里插入图片描述
在这里插入图片描述

 #pragma once
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>
#define MAXLEN 255


typedef char Stdate;

typedef struct SString{
	char ch[MAXLEN];
	int length;
}SString;



void PrintStr(SString* s); //打印串

void Strinit(SString* s);//初始化
void StrAssign(SString* s, char*c); //赋值操作,把串T赋值为chars
void ClearString(SString* s); //将S清为空串
bool SubString(SString* sub, SString* s, int pos, int len);//求子串, 从pos的位置起,len长,放入sub
int StrCompare(SString* a, SString* b);//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a<b,则返回<0
int Index(SString* a, SString* b); //若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;


void Strinit(SString* s)//初始化
{
	s->length = 0;
}



void StrAssign(SString* s, char* c) //赋值操作,把串T赋值为chars
{
	int i = 1;
	while (*c != '\0')
	{
		s->ch[i] = *c;
		i++;
		c++;
		s->length++;
	}

}


void PrintStr(SString* s) //打印串
{
	int i = 1;
	for (i = 1; i <= s->length; i++) {
		printf("%c ",s->ch[i]);
	}
	printf("\n");
}

void ClearString(SString* s) //将S清为空串
{
	s->length = 0;
}


bool SubString(SString* sub, SString* s, int pos, int len)//求子串
{
	int i = 0;
	if (pos + len-1 > s->length)
	{
		return false;
	}
	else {
		for (i = 0; i < len; i++)
		{
			sub->ch[i + 1] = s->ch[pos+i];
			sub->length++;
		}
		return true;
	}
}


int StrCompare(SString* a, SString* b)//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a<b,则返回<0
{
	for (int i = 1; i <= a->length && i <= b->length; i++)
	{
		if (a->ch[i] != b->ch[i])
		{
			return a->ch[i] - b->ch[i];
		}
	}

	int k = a->length - b->length;

	return k;
	
}

int Index(SString* a, SString* b) //若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
{
	SString c;
	Strinit(&c);
	int i = 1;
	int n = a->length;
	int m = b->length;

	while(i<=n-m+1)
	{
		SubString(&c, a, i, m);
		if (StrCompare(&c, b) != 0)
		{
			ClearString(&c);
			i++;
		}
		else {
			return i;
		}
	}

	return 0;

}




int main()
{
	SString s;
	SString sub;
	char chars1[] = "abcdefghiklmn";
	char chars2[] = "def";
	
	Strinit(&s);
	Strinit(&sub);
	

	StrAssign(&s, chars1); //赋值串
	StrAssign(&sub, chars2);
	//PrintStr(&s);
	

	//ClearString(&s); //将S清为空串
	//PrintStr(&s);

	//SubString(&sub, &s, 7, 4);
	//PrintStr(&sub);


	//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a<b,则返回<0
	//printf("%d\n", StrCompare(&s, &sub));

	//若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
	printf("%d\n", Index(&s, &sub));

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值