返回

【带你玩转数据结构】C语言实现单链表, 读完这篇文章你就会了

前端

单链表:链式数据结构的基础

在数据结构的世界中,单链表作为一种基本且重要的数据结构,因其简单性和灵活性而备受推崇。它是一种线性数据结构,由一系列相互连接的结点组成,每个结点包含一个数据域和一个指针域。

单链表的运作机制

单链表的结点由两个部分组成:

  • 数据域: 存储实际数据。
  • 指针域: 指向下一个结点。

头结点是链表的第一个结点,其指针指向第一个实际结点。如果链表为空,则头结点的指针指向 NULL。

C 语言中的单链表实现

为了在 C 语言中实现单链表,我们需要定义一个结点结构体:

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

接下来,我们需要定义一个头结点:

Node *head = NULL;

单链表操作的函数

现在,我们定义一些关键函数来操作单链表:

初始化单链表:

void InitList() {
    head = NULL;
}

指定位置插入结点:

void InsertNode(int pos, int data) {
    if (pos == 0) {
        Node *new_node = (Node *)malloc(sizeof(Node));
        new_node->data = data;
        new_node->next = head;
        head = new_node;
    } else {
        Node *p = head;
        for (int i = 0; i < pos - 1; i++) {
            p = p->next;
        }
        Node *new_node = (Node *)malloc(sizeof(Node));
        new_node->data = data;
        new_node->next = p->next;
        p->next = new_node;
    }
}

尾部插入结点:

void AppendNode(int data) {
    if (head == NULL) {
        head = (Node *)malloc(sizeof(Node));
        head->data = data;
        head->next = NULL;
    } else {
        Node *p = head;
        while (p->next != NULL) {
            p = p->next;
        }
        Node *new_node = (Node *)malloc(sizeof(Node));
        new_node->data = data;
        new_node->next = NULL;
        p->next = new_node;
    }
}

删除指定位置结点:

void DeleteNode(int pos) {
    if (pos == 0) {
        Node *p = head;
        head = head->next;
        free(p);
    } else {
        Node *p = head;
        for (int i = 0; i < pos - 1; i++) {
            p = p->next;
        }
        Node *q = p->next;
        p->next = q->next;
        free(q);
    }
}

查找指定值结点:

Node *FindNode(int data) {
    Node *p = head;
    while (p != NULL) {
        if (p->data == data) {
            return p;
        }
        p = p->next;
    }
    return NULL;
}

单链表的优势

  • 插入和删除便捷: 单链表可以在常数时间内在任意位置插入或删除结点。
  • 动态内存分配: 结点在运行时分配,这使得单链表可以适应不同大小的数据集。
  • 节省空间: 单链表只存储指针,节省了大量空间。

常见问题解答

1. 单链表和双链表有什么区别?
双链表中的每个结点不仅包含指向下一个结点的指针,还包含指向前一个结点的指针。这使双链表在某些操作中比单链表更有效率。

2. 单链表可以存储哪些类型的数据?
单链表可以存储任何类型的数据,包括数字、字符串和对象。

3. 单链表如何与数组比较?
数组是另一种线性数据结构,但它的大小是固定的。单链表更灵活,因为它可以动态地增加或减少大小。

4. 什么是循环链表?
循环链表是一种单链表,其尾结点指向头结点,形成一个环。

5. 单链表在实际应用中的例子有哪些?
单链表被广泛用于堆栈、队列、散列表和其他数据结构中。它们还用于表示图和链表等数据结构。