「今天是学习C语言第天」
纸上学来终觉浅,绝知此事要躬行。——陆游「冬夜读书示子聿」#数组
本质上仍是一种线性表,数组是同种类型数据的集合,数据的前后关系由连续的内存地址表示。
C语言中数组是语言内置支持的数据类型,C语言支持多维数组,数组的数据均按照行顺序依次存放在内存空间。数组定义后,数组的大小和维数不能改变,数组存取访问简单方便,插入和删除操作需要移动数据元素。
数组存取任何数据时间相等,通过下标直接访问,因此称为随机存储结构。
#数组表示
方式一:C语言静态分配
#defineMAX_SIZE
inta[MAX_SIZE];
特点:必须预先分配较大的空间,如果数据个数超过数组大小,无法存放。
方式二:动态分配
//根据变量的大小分配数组空间
intsize=;
int*a=(int*)malloc(size*sizeof(int));
特点:可以根据数据量的大小,申请合适大小的数组,动态内存分配需要手工申请和释放。
#矩阵
矩阵是数学上的重要工具,矩阵在C语言实现中可以方便使用二维数组表示。
稀疏矩阵:数值分析中阶数较高、矩阵中大部分元素值是相同的或者为0,这种可以称为稀疏矩阵。
特殊矩阵:另外稀疏矩阵如果这些元素值分布规律,称为特殊矩阵。
对于特殊矩阵或稀疏矩阵,采用普通二维数组表示,浪费存储空间,计算效率低,因此采用压缩存储,只存储矩阵中非零元素。
矩阵的压缩存储有三元组顺序表、行逻辑链接的顺序表、十字链表法三种,其中后两种是在第一种方式的复杂改进,在某些计算中提升效率。这里仅介绍第一种,后面可以参见课本。
三元组顺序表:思想很简单,将非零元的值、所在的行号、列号组成一个三元组保存到数组中。
//矩阵非零元最大个数
#defineMAX_SIZE0
typedefstruct{
//行号、列号
introw,col;
intd;
}triple;
typedefstruct{
//data[0]空留
tripledata[MAX_SIZE+1];
//矩阵行数、列数、非零元素数量
intm,n,t;
}matrix;
#广义表
广义表,相对线性表来说,线性表中每个结点是单个数据元素,是相同类型的数据,而广义表中每个数据元素可以是单个数据元素,也可以是广义表,这是一个递归的定义,其中单个数据元素称为原子,包含的广义表称为子表。
例如:()表示一个表。
(a,b,c,d,e):这是一个线性表,有5个相同类型的数据元素,同时也是个广义表,只含有5个原子数据。
(a,(b,c),(d,e)):这是一个广义表,有3个元素,其中a是原子数据,(b,c)和(d,e)是两个子表。
总结:广义表是表中有表的复合线性结构,其中()表示一个空表。
#存储结构表示
方式1:头尾链表存储表示
-广义表中有两种结点,一种是原子结点,一种是表结点。
-原子结点:只含有值、标志域。
-表结点:含有表头、表尾、标志域。
-表头、表尾可以确定整个表,表一分为二。
//定义标志枚举
typedefenum{
ATOM,
LIST
}type_tag;
//定义广义表结点
typedefstructlist_node{
type_tagtag;
union{
//定义原子结点数据
intdata;
//定义表结点指针
struct{
structlist_node*head,*tail;
}ptr;
};
}list_node;
//定义广义表
list_node*list;
方式2:扩展线性链表存储表示
//定义标志枚举
typedefenum{
ATOM,
LIST
}type_tag;
//定义广义表结点
typedefstructlist_node{
type_tagtag;
union{
//定义原子结点数据
intdata;
//定义表结点头指针
structlist_node*head;
};
//指向下一个元素结点
structlist_node*next;
}list_node;
//定义广义表
list_node*list;
----------End----------
往期精彩推荐:
一万分钟C语言学习计划:开篇
C语言内存管理的两种方式
C89标准库功能简介
C语言链接与存储类型
C语言标准输入输出
C语言入门基本语法
更多