数据结构中的线性表用于表示及处理相同类型的数据,比如整数、小数、金钱、体重...,方便对同类型数据进行处理。其代码实现可以通过数组实现,也可以通过链表实现。现分别从数组、链表实现视角分析优势,便于在实际编程时选择合适的方式实现线性表。
目录
- 视角1:应选择数组存储线性表类型数据
- 视角2:应选择链表存储线性表类型数据
- 本文代码下载链接
- 参考资料
视角1:应选择数组存储线性表类型数据
- 使用数组更安全
- 使用数组的存储密度更高
- 使用数组访问数据元素更快
分析过程如下
1.使用数组更安全
数组定义后可能存放于程序的BSS段(未分配内存)、静态数据区(全局变量程序整体结束后系统释放)、或栈空间(作用域结束后编译器释放)中,均不需要编程人员考虑内存的分配和释放,不会出现申请忘记释放导致内存泄漏问题。
数组实现:不用考虑内存申请/释放
//数组方式实现线性表
typedef struct
{
int stuNum;
int stuWeight;
} Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];//数据区域(数组)
int last;// 最后一个元素的位置
}LNODE;
链表实现:需使用malloc/free申请释放内存
//链表方式实现线性表
typedef struct
{
int stuNum;
int stuWeight;
} ElemType;
/*链表的结点的数据结构 */
typedef struct Lnode
{
ElemType student; //为求简便数据域仅置一项
struct Lnode *next;
}LNode,*LinkList; // *LinkList L 定义链表头指针
/*链表的初始构建函数*/
void InitList()
{
L = (LN)malloc(LEN);
if (L == NULL)
{
printf("[InitList]malloc error!\n");
exit(0);
}
L->student.stuNum = 0;
L->student.stuWeight = 0;
L->next=NULL;
}
/*链表的清空涵数*/
void ClearList()
{
LinkList p;
while (L->next)
{
p = L->next;
L->next = p->next;
free(p);
}
}
所以使用数组实现线性表不存在编程时忘记释放内存,导致内存泄漏的风险。
2.使用数组的存储密度更高
使用数组的存储密度更高。数组通过数组下标即可访问数据内容,而链表需要额外的指针索引指向下一个元素所在的位置,拉低了数据结构的存储密度。
截图1:数组实现的线性表大小
图2:链表实现的线性表大小
存储密度=(存放数据所占空间/总空间)
数组实现的线性表存储密度:8000/8004=99.9%;
链表实现的线性表存储密度:8000/12000=66.6%。
(Tips:本次实现的线性表数据长度为1000)
所以数组用于存储数据的部分占比更大,没有额外的存储空间消耗,内存实际数据的利用率更高。
3.使用数组访问数据元素更快
截图3:程序效果_遍历访问
1000个元素,遍历访问10000次,结果发现数组线性表耗时137ms,链表线性表耗时15209ms。
所以在需要大量读取数据元素的场景,数组实现的线性表更快,效率更高。
综上所述:想要更安全、存储密度更高、读取更快地使用线性表类型的数据,请使用数组。
视角2:应选择链表存储线性表类型数据
- 使用链表更省空间
- 使用链表更容易扩展
- 使用链表增加/删除数据元素更快
分析过程如下
1.使用链表更省空间
链表不需要预先指定申请空间的大小,可以根据需要申请,不存在浪费的情况。
截图4:数组实现的线性表大小
举例来说,数组初始化1000个数据的空间,占用8004字节,但实际可能只用到了前500个数据,也就是4000字节,那么后面的4000字节就闲置浪费了;链表是需要n个元素就申请n*单个数据所需空间,不存在这种情况。
所以链表不会出现内存浪费的情况。
2.使用链表更容易扩展
链表长度不固定,可以随时增大或减小,而数据定义之后长度即固定下来无法变化。
截图5:可扩展性数组
截图6:可拓展性链表
如果数组长度为1000,那么当需要存放第1001个数据时,没有办法存放,链表没有这个问题。
所以链表更具可扩展性。
3.使用链表增加/删除数据元素更快
截图7:程序效果_遍历访问
1000个元素,在第2、3两个数据中间添加/删除数据10000次,结果发现数组线性表耗时57ms,链表线性表耗时5ms。
所以在需要大量插入/删除数据元素的场景,链表实现的线性表更快,效率更高。
综上所述:想要更节约、更灵活可扩展、增删更快地使用线性表类型的数据,请使用链表。
代码链接
1.下载链接:https://download.csdn.net/download/u013025955/11213983
参考资料
1.数据结构--线性表的顺序存储结构(c语言实现)
https://download.csdn.net/download/qq38960479/10483209
2.数据结构---线性表之单链表(C语言)
https://download.csdn.net/download/lulllr/10313658