数据结构——串,数组和广义表详解

目录

1.串的定义 

1.串的几个术语 

2.案例引入 

3.串的类型定义,存储结构及运算 

1.串的顺序存储结构 

代码示例:

2.串的链式存储结构 

代码示例:

3.串的模式匹配算法 

1.BF算法 

1.BF算法设计思想 

2.BF算法描述 

代码示例:

3.BF算法时间复杂度 

2.KMP算法 

1.KMP算法设计思想 

2.KMP算法描述 

 

代码示例:

3.next函数的改进 

4.数组 

1.数组的抽象数据类型定义 

2.基本操作 

3.数组的顺序存储 

4.三维数组 

5.n维数组 

6.特殊矩阵的压缩存储 

1.对称矩阵

2.三角矩阵 

3.对角矩阵 

7.稀疏矩阵存储 

1.稀疏矩阵的压缩存储方法 

2.稀疏矩阵的链式存储结构:十字链表 

5.广义表 

1.广义表的性质 

2.广义表与线性表的区别 

3.广义表的基本运算 

6.案例分析与实现 

7.总的代码


 

fd328a6429a843bb8009f3f92f59e850.png

1.串的定义 

1a69f2062cac473387f1b51ea43c042b.png

9b33c375f373458cb2e6b9b80e6d5eae.png

1.串的几个术语 

350702f14dc44f87bd75b6dc27be1ae0.png

7e61b12bc64c4b9dbab08ff1903cdefe.png

365cf4cc2f9e44bba9df34538c0f3429.png

2.案例引入 

1a17459d941f4a37bd88ae3696ed7870.png

3a6493a645354d80891061fcfba5be76.png

3.串的类型定义,存储结构及运算 

ff179dd46560473d8134dacce12e21fa.png

8b8344b83772420295e78210bb65fcc9.png

85188febe5c64715bed36a30b3676ffc.png

1.串的顺序存储结构 

75c6a9bc9dc947e4a4e91f00a16e4981.png

代码示例:

#define maxlen 255
typedef struct{
	char ch[maxlen + 1];
	int length;
}sstring;

2.串的链式存储结构 

126cff7703724dcc8cdfc0baadd43d5a.png

70277eba9199498e81654e2e65f081aa.png

代码示例:

#define chunksize 80
typedef struct chunk{
	char ch[chunksize];
	struct chunk *next;
}chunk;

typedef struct{
	chunk *head,*tail;
	int curlen;
}lstring;

3.串的模式匹配算法 

18ac8cfce19645cf9d39e9d8bfc28836.png

1.BF算法 

97bea1cc21b346f4969d3ec3e298219c.png

70b1048d9058480089932a9fb11d3bcb.png

9471fa7b56f5447986e5d5edd1db7036.png

7ddbc5f6957d4c53811ad9dc1e7d4c2d.png

1.BF算法设计思想 

9a3effd1be5e49fc94fe12de93cc84ee.png

2.BF算法描述 

8aea0399c54d452eb62088a320bd47ea.png

62b90b899c484e54bf948c03f3f5c09b.png

代码示例:
int index_bf(sstring s,sstring t,int pos)
{
	int i = pos,j = 1;
	while(i <= s.length && j <= s.length)
	{
		if(s.ch[i] == s.ch[j]) {i++,j++;}
		else{i = i - j + 2,j = 1;}
	}
	if(j >= t.length) return i - t.length;
	else return 0;
}
3.BF算法时间复杂度 

27f0bbde5bc64026b7a03659e7915900.png

2.KMP算法 

ec2b54b7ae8e4d95af1fb25b51ef5194.png

1.KMP算法设计思想 

a034a07287bc4faaa6e5c706437f20ff.png

ea5d697f2d3d49129b7c3befbd6924b9.png

a9530b0678944f78a189a783506d45be.png

2.KMP算法描述 

517b31f4d0fc4478a047a72e5f5a2ed7.png

 

7597c3ebd5564e60be3bdf2f678b41bf.png

代码示例:
void get_next(sstring t,int next[])
{
	int i = 1;
	next[1] = 0;
	int j = 0;
	while(i < t.length)
	{
		if(j == 0 || t.ch[i] == t.ch[j])
		{
			i++;j++;
			next[i] = j;
		}
		else j = next[j];
	}
}

int index_kmp(sstring s,sstring t,int pos)
{
	int i,j;
	i = pos,j = 1;
	int next[100];
	get_next(t,next);
	while(i < s.length && j < t.length)
	{
		if(j == 0 || s.ch[i] == t.ch[j]){i++; j++;}
		else
			j = next[j];
	}
	if(j > t.length) return i - t.length;
	else return 0;
}
3.next函数的改进 

65528b47e0434f128ff6d7af833b5ea0.png

20b525c95a4543419dc2472e39c2b7a6.png

835a629e24494412b3740d1666b1ed3a.png

4.数组 

2cc70998bcb74413bd8dd6da7e880685.png

c441e1c91e684c43b4b7b71afa6a656f.png

ca57789e945c45a38cad4a65c34d1158.png

4290d6621b1142919bbad24e8d1a014e.png

1.数组的抽象数据类型定义 

c9fbdb9838d440de899e027d648a8ed9.png

5ae16bae0d2c44c398471e9523032896.png

2.基本操作 

e53ae8db69e2421e91eb12814e73c1e9.png

3.数组的顺序存储 

182c17bc76924b1aaeab76ab5b2e1005.png

cec32db32bf44f5a948f197b35791291.png

d1d811ed6ebc4ea8b39764681a94e244.png

5f4a52a067a645359cea243bbf7d501a.png

0672491aa97649d5b93476a5c3d8a9f9.png

cc0d1348da6c4927a527f91e80fab46b.png

175f7edbc9014ebb946aacc03e1a51e4.png

4.三维数组 

6ff9a37b6a024e918247223ad8718811.png

cb90b8cc90754995a05829bbfbde5b91.png

5.n维数组 

a1baf912dc73425382eeb9bdf2192889.png

70ff6098e450440a9f8291a541350ea8.png

e6cef8dfae874f62a9bad774b0f5dd80.png

6.特殊矩阵的压缩存储 

f21c25aaf55a425f96080d8fc1e06020.png

58efa79b4ca9443e90c3b6bbacb54606.png

1.对称矩阵

5d659de773ad43bba2e258783ad1cf37.png

5ef293ac01bc4234a5977f0aaf2a56be.png

2.三角矩阵 

fdeb03cb1bc6447183d757f967258e9b.png

3.对角矩阵 

b9583528617948559089b1970ba4610a.png

354fb8ea3be34d64af7e576fc20dccf4.png

7.稀疏矩阵存储 

ef9a71c5d0144195a37e300aad474f4c.png

9bdf7e067db14d91b4d5e276257d6788.png

1.稀疏矩阵的压缩存储方法 

394873d994b443e9a9ce5202844c9e02.png

198246bf2f244f8c9ecf9231815af05b.png

698376077b4d4353b7e18d0860fe4b47.png

132d7b18323942b9800ad29fe3ae176d.png

2.稀疏矩阵的链式存储结构:十字链表 

9fdf3cbbd93d4fc1b4736f8aeff17c7e.png

eb24941e0c78421ebd5493839a97a031.png

37477da9ceb44b3b8369d776f70dce26.png

5.广义表 

464ea144603148939841d9bb767f60be.png

5f9280072921419aa7986eeee0332c74.png

ac0726ef1f32481d9f05182766a44e82.png

1.广义表的性质 

2c7a6202b6d64ef39cbeed561e172f41.png

80b1ab00039745658c866bf955460c6d.png

2.广义表与线性表的区别 

ed97c489ddaa4973ae1d0691f4476110.png

3.广义表的基本运算 

e997aa354e5b4de1b9576f423fb55f48.png

6.案例分析与实现 

fe5312328f2943979c4060d6d3dd82e2.png

3d24a4b2968d49e0bd50bd388adf7548.png

7.总的代码

#include<bits/stdc++.h>
using namespace std;

#define maxlen 255
typedef struct{
	char ch[maxlen + 1];
	int length;
}sstring;

#define chunksize 80
typedef struct chunk{
	char ch[chunksize];
	struct chunk *next;
}chunk;

typedef struct{
	chunk *head,*tail;
	int curlen;
}lstring;

int index_bf(sstring s,sstring t,int pos)
{
	int i = pos,j = 1;
	while(i <= s.length && j <= s.length)
	{
		if(s.ch[i] == s.ch[j]) {i++,j++;}
		else{i = i - j + 2,j = 1;}
	}
	if(j >= t.length) return i - t.length;
	else return 0;
}

void get_next(sstring t,int next[])
{
	int i = 1;
	next[1] = 0;
	int j = 0;
	while(i < t.length)
	{
		if(j == 0 || t.ch[i] == t.ch[j])
		{
			i++;j++;
			next[i] = j;
		}
		else j = next[j];
	}
}

int index_kmp(sstring s,sstring t,int pos)
{
	int i,j;
	i = pos,j = 1;
	int next[100];
	get_next(t,next);
	while(i < s.length && j < t.length)
	{
		if(j == 0 || s.ch[i] == t.ch[j]){i++; j++;}
		else
			j = next[j];
	}
	if(j > t.length) return i - t.length;
	else return 0;
}

int main(){
	return 0;
}
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值