知用堂
第二套高阶模板 · 更大气的阅读体验

C语言链表实现:从厨房清单说起

发布时间:2025-12-13 11:10:39 阅读:478 次

早上准备去买菜,随手在纸条上列了几样要买的菜:西红柿、鸡蛋、洋葱。刚走到超市门口,突然想起家里酱油快没了,得加上。这时候要是用的是固定长度的数组,就像那张写满的纸条,想加点东西就得重新抄一遍。但要是用链表,就像拿一串可拆卸的钥匙环,新项目挂上去就行,不用动前面的东西。

链表是啥?

你可以把它想象成一列火车,每节车厢是一个节点,装着数据和指向下一节车厢的“连接”。C语言里,这个结构通常用结构体定义:

struct Node {
    int data;
    struct Node* next;
};

这里的 data 可以是你想存的任何东西,比如买菜的名字,而 next 是个指针,指着下一个节点在哪。最后一节车厢的 next 指向 NULL,表示到站了。

怎么建一个节点?

每次要添点新东西,就得申请一块内存。比如你要把“酱油”加入购物清单:

struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = 4;  // 假设酱油编号是4
newNode->next = NULL;

malloc 就像去仓库领了个空箱子,然后你把数据放进去,再决定它连不连下一个。

插到链表前面最省事

如果每次都把新东西放在最前面,操作最简单。比如你现在又想起要买葱,可以直接让它当“车头”:

newNode->next = head;  // 新节点指向原来的第一个
head = newNode;       // 更新车头为新节点

这样不管原来有多少东西,加新项的时间都差不多,不会因为清单变长就更慢。

遍历就像顺着链条走

你想看看都要买啥,就得从头开始一个个看:

struct Node* current = head;
while (current != NULL) {
    printf("%d ", current->data);
    current = current->next;
}

这就像手电筒照隧道,一节一节往前,直到尽头。

用完记得释放

程序跑完,别忘了把申请的内存还回去,不然就像用完的快递盒堆在家里。每个节点都要 free

while (head != NULL) {
    struct Node* temp = head;
    head = head->next;
    free(temp);
}

这样系统才不会“内存泄漏”,程序也更健康,跟人吃完饭要收拾桌子一样。