数据结构论坛

首页 » 分类 » 定义 » C语言实现常用数据结构数组和广义表基本概
TUhjnbcbe - 2021/1/8 9:16:00

「今天是学习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语言入门基本语法

更多

1
查看完整版本: C语言实现常用数据结构数组和广义表基本概