数据结构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的每一列中所有的非零元素,需要对三元组表从第一行起整个扫描一遍。