线性表、顺序表与链表详解(C 语言实现)
学习目标
- 理解线性表的逻辑结构和物理实现方式。
- 掌握顺序表和链表的实现原理及核心操作。
- 能够通过代码实现顺序表和链表的基本功能。
- 分析顺序表与链表的性能差异及适用场景。
线性表概述
定义与特性
线性表是由 n 个具有相同特性的元素组成的有限序列,元素之间有明确的前后关系。每个元素有唯一的前驱和后继元素。
- 逻辑结构:元素在逻辑上依次排列。
- 物理结构:元素在内存中的存储方式,可以是连续的(顺序表)或不连续的(链表)。
基本特性:
- 顺序性:元素按顺序访问。
- 唯一性:除首尾外,每个元素都有唯一前驱和后继。
- 有限性:包含有限个元素集合。
常见实现方式
线性表主要有两种物理存储方式:顺序存储和链式存储。
顺序存储(顺序表)
使用一段连续的内存空间存储数据,通常使用数组实现。数据元素地址连续,可通过索引直接访问。
- 优点:随机访问效率高(O(1)),空间利用率高。
- 缺点:插入删除效率低(需移动元素,O(N)),固定容量可能浪费或不足。
链式存储(链表)
使用非连续的内存空间,每个元素包含数据域和指针域。
- 优点:插入删除效率高(O(1)),动态分配内存。
- 缺点:随机访问效率低(O(N)),存在指针开销。
顺序表详解
静态与动态顺序表
- 静态顺序表:使用固定大小数组,编译时确定大小,适合数据量已知且不变的场景。
- 动态顺序表:支持动态扩容,容量不足时自动分配更大内存并复制数据,适合数据量不确定的场景。
代码示例(动态顺序表)
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int* array;
int size;
int capacity;
} DynamicArray;
void init(DynamicArray* arr) {
arr->capacity = ;
arr->size = ;
arr-> = (*)(arr->capacity * ());
}
{
arr-> = (*)(arr->, new_capacity * ());
arr->capacity = new_capacity;
}
{
(arr->size == arr->capacity) {
resize(arr, * arr->capacity);
}
arr->[arr->size] = value;
arr->size++;
}
{
( i = ; i < arr->size; i++) {
(, arr->[i]);
}
();
}
{
(arr->);
}
{
DynamicArray arr;
init(&arr);
append(&arr, );
append(&arr, );
append(&arr, );
append(&arr, );
print_array(&arr);
free_array(&arr);
;
}


