【价值比较】应选择数组or链表实现线性表数据结构_C语言编程实现

        数据结构中的线性表用于表示及处理相同类型的数据,比如整数、小数、金钱、体重...,方便对同类型数据进行处理。其代码实现可以通过数组实现,也可以通过链表实现。现分别从数组、链表实现视角分析优势,便于在实际编程时选择合适的方式实现线性表。

目录

  • 视角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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值