数据结构:串和数组

串–零个或多个字符组成的有限序列
串的模式匹配
1,BF算法

#include <stdio.h> 
#include <stdlib.h>
int Strlength(char n1[256])
{
	int i;
	for(i = 1;n1[i] != '\0';i ++);
	return i - 1;
}
int Cha(char n1[],char n2[])
{
	int i = 1,j = 1;
	while(i <= n1[0] && j <= n2[0])
	{
		if(n1[i] == n2[j])
		{
			i ++;
			j ++;
		}
		else
		{
			i = i - j + 2;//回溯
			j = 1;
		}
	}
	if(j > n2[0])
	{
		return i - n2[0];
	}
	else
	{
		return 0;
	}
}
int main()
{
	char n1[256];
	char n2[256];
	printf("请输入主串:");
	scanf("%s",&n1[1]);
	n1[0] = Strlength(n1);
    printf("请输入字串:");
    scanf("%s",&n2[1]);
    n2[0] = Strlength(n2);
    int j = Cha(n1,n2);
    if(j == 0)
    {
    	printf("查找失败");
	}
	else
	{
		printf("位置:%d\n",j);
	}
    
}

KMP算法
求next[]数组的值
在这里插入图片描述
KMP算法的实现

#include <stdio.h>
#include <stdlib.h>
typedef unsigned char String[256];
int GetLength(String s)
{
	int i;
	for(i = 0;s[i] != '\0';i ++);
	return i - 1;
 } 
void GetNext(String b,int next[])
{
	int j = 1,k = 0;
	next[j] = k;
	while(j < b[0])
	{
		if(k == 0 || b[j] == b[k])
		{
			j ++;
			k ++;
			
			next[j] = k;
		}
		else
		{
			k = next[k];
		}
	}
}
int Index(String a,String b,int next[])
{
	int i = 1,j = 1;
	while(i <= a[0] && j <= b[0])
	{
		if(j == 0 || a[i] == b[j])
		{
			j ++;
			i ++;
		}
		else
		{
			j = next[j];
		}
	}
	if(j > b[0])
	{
		return i - b[0];
	}
	else
	{
		return 0;
	}
}
int main()
{
	String a,b;
	int next[100];
	printf("请输入主串:");
	scanf("%s",&a[1]);
	a[0] = GetLength(a);
	printf("请输入字串:");
	scanf("%s",&b[1]); 
	b[0] = GetLength(b);
	GetNext(b,next);
	if(Index(a,b,next))
	{
		printf("找到:%d\n",Index(a,b,next));
	}
	else
	{
		printf("没有找到\n");
	}
}

数组

一维数组:连续存储的同类型元素的集合
特点;
1,随机存取
2,长度不能改变

二维数组:每个元素受两个关系的约束,及行和列
内存中的存储(顺序开辟一块连续的空间存储)
1,行优先存储
2,列优先存储
行优先存储元素的位置(二维数组最后一个元素amn)
已知a11,aij = LOC(a11) + ((i - 1) * n + j - 1) * L
同理
列优先存储元素的位置
aij = LOC(a11) + ((j - 1) * m + i - 1)*L
例题
在这里插入图片描述
方法一LOC(2)(2) = LOC(0)(0) + (2 - 0) * n(一行有几个) + 2 - 0 = 676
n = 15,同理A33 = 692

方法二:0.0,1.1,2.2,3.3用二维数组表示的时候都在一条对角线上
a22 -a00 = 32,而33,到22是一个所以 676 + 32 / 2 = 692

矩阵的压缩存储

凝魂三问
为啥要压缩?
因为矩阵会出现0,而把矩阵存储在内存中,还要为0开辟空间,这样就有点浪费空间了,所以要压缩存储
啥叫压缩存储??
为多个相同的非o元素只分配一个存储空间,对0元素不分配空间
啥样的矩阵能够压缩???
对称矩阵,对角矩阵,稀疏矩阵等
矩阵的压缩代码

#include <stdio.h>
#define M 2
#define N 2 
#define MAX 100
typedef int ElemType;
typedef struct YuSan{
	int i;
	int j;
	ElemType v;
}YuSan;
typedef struct Arrays{
	int H;
	int l;
	int count;
	YuSan data[MAX + 1];
}Arrays;
void Insi(Arrays &t,ElemType arr[M][N])
{
	t.H = M;
	t.l = N;
	t.count = 0;
	int m,n;
	for(m = 0;m < t.H;m ++)
	{
		for(n = 0;n < t.l;n ++)
		{
			if(arr[m][n] != 0)
			{
				t.count ++;
				t.data[t.count].i = m + 1;
				t.data[t.count].j = n + 1;
				t.data[t.count].v = arr[m][n];
			}
		}
	}
	
}
void DisPlay(Arrays t)
{
	printf("总行数:%d\t总列数:%d\t总个数:%d\n",M,N,t.count);
	int k;
	printf("行数\t列数\t数值\n");
	for(k  =1;k <= t.count;k ++)
	{
		printf("%d\t%d\t%d\n",t.data[k].i,t.data[k].j,t.data[k].v);
	}
}
void ZhuanZhi(Arrays a,Arrays &b)
{
	b.H = a.l;
	b.l = a.H;
	b.count = a.count;
	int m,n,k = 0;
	for(n = 1;n <= a.l;n ++)
	{
		for(m = 1;m <= a.count;m ++)
		{
			if(a.data[m].j == n)//用数组的列数和输出的列数比较,第1列,会变成第1行 
			{
				k ++;
				b.data[k].i = a.data[m].j;
				b.data[k].j = a.data[m].i;
				b.data[k].v = a.data[m].v;
			}
		}
	}
}
int main()
{
	ElemType arr[M][N];
	Arrays t;
	Arrays b;
	printf("请输入:\n");
	int m,n;
	for(m = 0;m < M;m ++)
	{
		for(n = 0;n < N;n ++)
		{
			scanf("%d",&arr[m][n]);
		}
	}
	Insi(t,arr);
	DisPlay(t);
	printf("转置后:\n");
	ZhuanZhi(t,b);
	DisPlay(b);
}

广义表
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值