各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
在学习数据结构的过程中,链表是绕不过去的一座“大山”。它不仅是后续学习树、图等复杂结构的基础,更是深刻理解C语言指针与内存管理的试金石。今天,我们就来探讨链表的两种基本形式:静态链表和动态链表,重点关注它们的创建过程、异同点以及内存管理的奥秘。
一、 基础:链表节点的统一定义
无论我们讨论的是静态链表还是动态链表,它们的基本组成单位——节点(Node)的结构是完全相同的。一个节点包含两部分:
- 数据域(data):存储实际数据。
- 指针域(next):存储指向下一个节点的内存地址。
让我们先用C语言定义好这个结构体:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct link_node {
int data;
struct link_node* next;
};
这个结构体将是我们后续所有操作的基础。
二、 静态链表:内存分配在栈(Stack)上
所谓“静态”,指的是节点的内存在编译时或函数调用时,在**栈(Stack)**上自动分配。它的生命周期与所在的函数或作用域绑定,一旦函数执行完毕,其占用的内存就会被系统自动回收。
1. 创建过程
创建静态链表更像是在“组装”已经存在的零件。
- 声明节点变量:直接在函数中声明具体的节点变量,例如
struct link_node node1, node2, node3;
。此时,操作系统已经在栈上为这三个节点分配好了内存空间。 - 赋值:为每个节点的
data
域赋予具体的值。 - 建立关系:手动将前一个节点的
next
指针指向下一个节点的地址。例如,node1.next = &node2;
。 - 收尾:将最后一个节点的
next
指针设置为 NULL
,表示链表的结束。 - 创建头指针:定义一个头指针
header
,让它指向第一个节点,作为访问整个链表的入口。
2. 代码案例
void create_static_list() {
printf("--- 创建静态链