当前位置:首页 > C > 正文

掌握C语言链表(从零开始的链表基础教程)

在学习C语言链表之前,你可能已经熟悉了数组。但数组有固定大小、插入删除效率低等缺点。而链表是一种动态数据结构,可以灵活地管理内存,是学习更复杂C语言数据结构的重要基础。

什么是链表?

链表是由一系列“节点”(Node)组成的线性结构。每个节点包含两部分:

  • 数据域:存储实际的数据(如整数、字符等)
  • 指针域:存储下一个节点的地址(即指向下一个节点的指针)
掌握C语言链表(从零开始的链表基础教程) C语言链表 链表基础教程 单向链表实现 C语言数据结构 第1张

单向链表的基本结构

我们以最简单的单向链表为例。首先定义一个结构体来表示节点:

struct Node {    int data;               // 数据域    struct Node* next;      // 指针域,指向下一个节点};  

这个结构体就是我们构建链表基础教程的核心。通过 next 指针,我们可以把多个节点“串”起来。

创建一个新节点

要向链表中添加数据,首先需要创建一个新节点。通常我们会写一个函数来完成这个任务:

#include <stdio.h>#include <stdlib.h>struct Node {    int data;    struct Node* next;};// 创建新节点的函数struct Node* createNode(int value) {    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));    if (newNode == NULL) {        printf("内存分配失败!\n");        return NULL;    }    newNode->data = value;    newNode->next = NULL;  // 新节点的 next 指向 NULL    return newNode;}  

将节点插入链表头部

最常见的操作之一是将新节点插入到链表的开头(头插法):

// 头插法:在链表头部插入新节点void insertAtHead(struct Node** head, int value) {    struct Node* newNode = createNode(value);    if (newNode == NULL) return;    newNode->next = *head;  // 新节点指向原来的头节点    *head = newNode;        // 更新头指针}  

注意这里使用了二级指针 struct Node** head,因为我们需要修改主函数中的 head 指针本身。

遍历并打印链表

要查看链表中的所有数据,我们需要从头节点开始,依次访问每个节点:

// 打印整个链表void printList(struct Node* head) {    struct Node* current = head;    while (current != NULL) {        printf("%d -> ", current->data);        current = current->next;    }    printf("NULL\n");}  

完整示例:构建并打印链表

int main() {    struct Node* head = NULL;  // 初始化空链表    insertAtHead(&head, 10);    insertAtHead(&head, 20);    insertAtHead(&head, 30);    printList(head);  // 输出:30 -> 20 -> 10 -> NULL    return 0;}  

为什么学习链表很重要?

掌握C语言链表不仅是面试常考内容,更是理解栈、队列、图等高级数据结构的基础。相比数组,链表具有以下优势:

  • 动态大小:运行时可扩展
  • 高效插入/删除:无需移动大量元素
  • 内存利用率高:按需分配

小结

本文带你从零开始了解了单向链表实现的基本概念和代码编写方法。通过定义节点结构、创建节点、插入节点和遍历链表,你已经掌握了链表的核心操作。接下来可以尝试实现尾部插入、按值查找、删除节点等功能,进一步巩固你的C语言数据结构知识。

提示:记得在程序结束前释放链表占用的内存,避免内存泄漏!