08串 数组 广义表[图文详解]

串 数组 广义表

1.串

相关概念:

  1. 串:数据只能为字符的线性表
  2. 子串:与子集相同,不带空集的为真子串
  3. 主串:包含子串的串
  4. 字符位置:字符在序列中的序号
  5. 空格串:与空串不同,由一个或多个空格组成
  6. 串相等:当且仅当两个串的长度相等,且对应位置的字符相等(所有空串都相等)

顺序串的具体操作

1. 顺序串的定义
// 顺序串的定义
#define MAXLEN 255
typedef struct {
    char ch[MAXLEN+1]; //存储顺序串的一维数组,为了方便操作字符从1开始,又因为最后面要开辟空间给\0所以为MAXLEN+1.
    int length;     // 串的长度
}SqString;
2. 串的模式匹配算法
BF(暴力枚举)法思路:
  1. 将主串的第p个字符与子串的第一个字符比较
  2. 若相等,继续逐个比较
  3. 若不等将主串第p+1个字符与子串第一个字符比较
    若成功返回主串的p的序号;
    若失败返回0;
int index_BF(SqString S,SqString T){
   int i,j;
   i=1;     // 用于表示主串的下标
   j=1;     // 用于表示子串的下标
   while(i<=S.length&&j<=T.length){
       if(S.ch[i]==T.ch[j]) {   //若相等比较下一个
           i++;
           j++;
       }
       else{
           i=i-j+2; //  若不相等让i回到主串开始比较位置的下一个位置
           j=1;     // j回到子串第一个字符的位置
       }
   }
   if(j>T.length)
       return i-T.length;   //  若匹配成功返回主串开始比较的位置
   else return 0;  // 若匹配不成功返回0.
}

2.数组

相关概念:

  1. 数组:按一定格式排列的相同类型的数据元素的集合
  2. 特点:结构固定,定义后,维数和维界不再改变,所以一般不进行插入和删除的操作。
  3. 结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。

顺序存储方式

1. 一维数组不进行赘述
2. 二维数组
1) 以行序为主序

在这里插入图片描述

2) 以列序为主序

在这里插入图片描述

3. 三维数组

在这里插入图片描述

矩阵

相关概念
  1. 矩阵:由mx2个元素排成的m行n列的表
  2. 常规存储方式:二维数组存储
  3. 常规存储特点:可以对其元素随机存取;运算简单,存储密度为1。
  4. 压缩存储方式:为相同的非零元素只分配一个空间,零元素不分配空间
  5. 稀疏矩阵:矩阵中非零元素的个数较少(一般小于5%)。
  6. 对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等可以进行压缩存储。
1. 对称矩阵

在这里插入图片描述

存储方式:(一维数组)为了方便使用和减少内存

int sa[n*(n+1)/2-1];

求aij的位置为:

int k=(1+i-1)*(i-1)/2+j;
2. 三角矩阵

存储方式:(一维数组)共占用n*(n+1)/2+1个元素空间,相同元素占用一个空间

上三角矩阵:对角线以下的数据全为常数C。
int sa[n*(n+1)/2]; //定义三角矩阵
int k;  //aij的下标为k;
if(i>j){    // 若i>j则为下三角区域
    k=n*(n+1)/2;
}
else k=(n+(n-(i-1-1)))*(i-1)/2+j-i;
下三角矩阵:对角线以上的数据全为常数C。
int sa[n*(n+1)/2]; //定义三角矩阵
int k;  //aij的下标为k;
if(i<j){    // 若i>j则为下三角区域
    k=n*(n+1)/2;
}
else k=(1+(i-1))*(i-1)/2+j;
3. 对角矩阵(带状矩阵)

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

4. 稀疏矩阵
存储方式:
三元组法

三元组法(i,j,aij)和矩阵维数(x,y,n)
i:非零元素的行
j:非零元素的列
aij:非零元素的值
x:行
y:列
n:非零元素的个数
在这里插入图片描述

注意:三元组的不同表示方法,决定稀疏矩阵不同的压缩存储方法

####### 三元组法优缺点
优点:非零数据按行序有序存储,便于依照行序处理矩阵的运算

缺点:不能随机存取,若按行号存取某一行中的非零元素,则需要从头查找。

十字链表法:

矩阵中的每个非零元素用结点表示:

在这里插入图片描述

·right:指向同一行中的下一个非零元素
down:指向同一列中的下一个非零元素
·row:非零元素的行
·col:非零元素的列
·value:非零元素的值

矩阵M:如图所示
在这里插入图片描述

M.rhead:存储指向行第一个非零元素指针的数组
M.chead:存储指向列第一个非零元素指针的数组

矩阵的十字链表表示(如图所示)

在这里插入图片描述

再举一个梨子

在这里插入图片描述

3.广义表

相关概念:

  1. 广义表:与python中的列表含义相似,元素可以为原子也可以为广义表。
  2. 记作: LS=(a1,a2,a3,…,an);LS为表名,n为表长,a1~an表示原子
  3. 表头: 非空表的第一个元素,记作: head(LS)=a1
  4. 表尾: 除表头以外的其他元素组成的表,记作: tail(LS)=(a2,a3,…,an)
    注意: 表尾不是最后一个元素,而是一个子表。(与表头区分)

举例如下:

在这里插入图片描述

广义表的性质:

  1. 元素之间有相对次序: 一个直接前驱,一个直接后驱
  2. 多层次结构
  3. 长度: 元素的个数
  4. 深度: 展开后括号的组数(重数)
    注意: 原子的深度为0,空表的速度为1
  5. 共享性: 可以作为其他广义表的元素
  6. 递归表:如上图(6)
    注意: 递归表的深度是无穷值,长度是有限值
    总结: 广义表是线性表的推广,线性表是广义表的特例
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿明同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值