数据结构考研04-数组、串、广义表

在这里插入图片描述

数组

定义

数组是由n个(n≥1)相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。

存贮表示

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

应用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按列存储:该列之前列所有的元素+该列该元素之前的元素+自己

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

定义

在这里插入图片描述
子串:任意多个连续的字符组成的子序列称为该串的子串
主串:包含子串的串
字符在主串中的位置:字符在串中的序号
字串在主串中的位置:子串的第一个字符在主串中的位置

串的基本操作(运算)

在这里插入图片描述

串的存储结构

串的顺序存储

在这里插入图片描述在这里插入图片描述取方案一和二
在这里插入图片描述

串的链式存储

在这里插入图片描述改进:

char ch[4];//提高有效信息所占比例,存储密度变高

未存满的地方可以用#填满或者用’\0’

基本操作实现

1.求子串
#include<stdio.h>
#include<stdlib.h>

/*
串的存储方式:ch[0]废弃,使用结构体定义串,len记录长度
若不废弃ch[0],则只能记录0到255个字符串
只测试求子串
*/

#define Max 10

typedef struct{
	char ch[Max];
	int len;
}String1;

void Init(String1 *s){
	s->ch[0] = 0;//去掉ch[0]
	s->len = 0;
	printf("初始化完成\n");
}

void SubString(String1 *s1,String1 s,int pos,int len){
	int i;
	if(pos+len-1>s.len)
		printf("长度越界\n");
	else{
		for(i=pos;i<pos+len;i++)
			s1->ch[i-pos+1]=s.ch[i];
		s1->len = len;
		printf("操作成功!\n");
	}
}

void print(String1 s){
	int i;
	for(i=1;i<s.len+1;i++)
		printf("%c",s.ch[i]);
}

void main(){
	String1 s,s1;
	Init(&s);
	//测试功能
	s.ch[1]='c';
	s.ch[2]='h';
	s.ch[3]='a';
	s.len=3;
	SubString(&s1,s,1,2);
	print(s1);
	SubString(&s1,s,9,2);
}

结果:
在这里插入图片描述

2.比较操作

原理:从左向右比较,直到不等为止

//s1>s2,返回值大于0,s1=s2,返回值=0,s1<s2,返回值小于0
int StrCmp(String1 s1,String1 s2){
	int i;
	for(i=1;i<=s1.len&&i<=s2.len;i++){
		if(s1.ch[i]!=s2.ch[i])
			return s1.ch[i]-s2.ch[i];
	}
	return 0;
}

结果:
在这里插入图片描述

3.定位操作

实现原理:取子串,与T比较,重复
在这里插入图片描述在这里插入图片描述在这里插入图片描述

串运算算法

1.简单的模式匹配算法

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

2.KMP算法

在这里插入图片描述
代码:

在这里插入图片描述手算求next数组:
在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值