数组
定义
数组是由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数组: