数据结构C语言版清华大学严蔚敏(学习笔记总结2,代码在下面)——串和数组、矩阵存储、压缩矩阵、转置矩阵、对称矩阵、广义表、稀疏矩阵(前面是笔记方便理解,最下面有详细代码)

这篇博客介绍了C语言中数据结构的基础,包括顺序表、链表、循环链表和双向链表的概念,以及如何进行结点的插入和删除操作。同时,详细探讨了字符串作为特殊线性表的特性,如子串定义、连接运算和子串提取。此外,还讨论了数组的顺序存储,特别是矩阵的压缩存储,包括对角矩阵、三角矩阵和对称矩阵的存储优化。最后,提到了稀疏矩阵的三元组表压缩存储及其运算实现。
摘要由CSDN通过智能技术生成

数据结构C语言版清华大学严蔚敏(学习笔记总结1,代码在下面)——顺序表、链表、循环链表、双向链表、结点的插入删除(前面是笔记方便理解,最下面有详细代码)_玛卡巴卡的博客-CSDN博客

串(即字符串)是一种特殊的线性表,它的数据元素仅由字符组成。

串是由零个或多个字符组成的有限序列。串中任意连续个字符组成的子序列称为子串。子串的第一个字符在主串中的序号,定义为子串在主串中的位置,该位置索引从0开始。

特别的,空串是任意串的子串,任意串是自身的子串。

串的逻辑结构与线性表极为相似,区别仅在于串的数据对象约束为字符集,但操作有很大差别。

求子串,从第i位置的字符开始抽出j个字符构成一个新的串。j<=strlen(s)+1-i;
 

1.顺序存储

typedef struct{
char ch[maxsize];
int len;
}string;
2.链式存储

typedef struct linknode{
char data;
struct linknode *next;
}linkstring;
linkstring *s;
3.带长度的索引表

typedef struct{
char name[maxsize];  //串长
int length;
char *stadr;   //串值存入的起始地址
}lennode;
带末指针的索引表

  
typedef struct{
char name[maxsize];
char *stadr,*enadr;
}enode;//用一个指向串值存放的末地址的指针enadr来代替长度。
//串运算的实现

typedef struct{
char ch[maxsize];
int len;
}string;
//串的连接运算(strcat)
for(i=0;i<s->len;i++)
     r->ch[i]=s->ch[i];
for(i=0;i<t->len;i++)
     r->ch[s->len+i]=t->ch[i];
r->ch[s->len+i]='\0';
r->len=s->len+t->len;
//求子串运算
if(i+j-1>s->len)
     printf("超界");
else
{
    for(k=0;k<j;k++)
          t->ch[k]=s->ch[i+k-1];
    t->len=j;
    t->ch[t->len]='\0'; 

①数组的定义和运算

三维数组可以看做其元素用二维数组定义的特殊线性表。以此类推,n维数组是由n-1维数组定义的,每个元素受到n个下标约束。

数组是由值与下标构成的有序对,结构中的数据元素都与其下标有关。

数组性质:数据元素数目确定;数据元素有相同类型;下标有上下界的约束,并且下标有序;

②数组的顺序存储结构

一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。

二维数组的顺序存储:以行为主序的优先存储和以列为主序的优先存储。以下标顺序为主序的优先存储和以逆下标顺序为主序的优先存储。

多维数组中,以下标顺序为主序表示先排最右的下标,从右向左直到排到最左的下标;而以逆下标顺序为主序,则表示从最左开始向右排列。

③矩阵的压缩存储

用二维数组来描述矩阵。

压缩存储,是指对多个相同的元素只分配一个空间,对零元素不分配空间。

1,特殊矩阵

(1)对角矩阵

所有非零元都集中在以主对角线为中心的带状区域中,即除了主对角线上和主对角线相邻近的上下方以外,其余元素均为0.

最简单的情况为只在主对角线上含有非零元。

A[0]=A[0][0],A[1]=A[1][1],即A[k]与aii对应关系是k=i.

(2)三角矩阵

上三角矩阵是指矩阵的下三角(不包含对角线)中的元素均为0,上三角矩阵与之相反。

在三角矩阵中,值相同的元素可共享一个存储空间,若重复元素为0则可不分配存储空间;其余的元素共有n*(n+1)/2个。

在下三角矩阵中,对于aij元素,前面已经存放了i行,元素的总数为i*(i+1)/2,aii处在第i+1行的第j+1个元素,则其前面已存放的元素数目为i*(i+1)/2+j,也就是说,aij应是数组A的第k+1个元素,k=i*(i+1)/2+j.

A[k]与aij的对应关系为   k=i*(i+1)/2+j,i>=j;     k=n*(n+1)/2,i<j

(3)对称矩阵

在n阶方阵中,若A中元素满足aij=aji,则A是对阵矩阵。

元素关于对角线对称,因此在存储时只需存储上三角或下三角中的元素,使得对称的元素共享一个存储空间。

假设存储下三角中的元素,k=i*(i+1)/2+j,i>=j;

当i>j时,在上三角矩阵,k=j*(j+1)/2+i,i<j;

统一起来就是:k=i*(i+1)/2+j,   i=max(i,j),     j=min(i,j).

2,稀疏矩阵

含有非零元素及较多的零元素,但非零元素的分布没有任何规律。

下面仅讨论用三元组表来表示两种稀疏矩阵的压缩存储方法。

若将表示稀疏矩阵的非零元素的三元组按行优先(或列优先)的顺序排列(跳过零元素),则得到一个其结点都是三元组的线性表。我们将该线性表的顺序存储结构称为三元组表。因此,三元组表是稀疏矩阵的一种顺序存储结构。

要唯一的存储一个稀疏矩阵,还必须存储该矩阵的行数和列数。还要将非零元素的个数与三元组表存储在一起。
通过行号,列号以及元素值来存储矩阵。

压缩存储中实现矩阵的运算:

将矩阵转置,将A转置成B,就是将A的三元组表中的a->data置换成b->data,再重新排列三元组 的顺序使之成为按行优先排列。

由于A的列是B的行,因此,按a->data的列序转置,所得到的转置矩阵B的三元组表必定是按行优先存放的。为了找到A的每一列中所有的非零元素,需要对三元组表从第一行起整个扫描一遍。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玛卡巴卡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值