链表c语言代码

admin 14 0

### 链表在C语言中的实现与示例代码

在C语言中,链表是一种常见且重要的数据结构,用于存储一系列的元素,这些元素不必在内存中连续存储,链表通过节点(Node)来组织数据,每个节点包含数据部分和指向列表中下一个节点的指针(或链接),这种结构使得链表在插入和删除元素时比数组更加灵活和高效,尤其是在不知道元素总数或元素数量经常变化的情况下。

#### 链表的基本结构

链表的基本结构通常包括两种类型:单向链表和双向链表,这里我们主要讨论单向链表的实现。

- **单向链表**:每个节点包含数据部分和一个指向下一个节点的指针,最后一个节点的指针通常设置为`NULL`,表示链表的结束。

#### 定义链表节点

我们需要定义链表节点的结构体,在C语言中,这可以通过`struct`关键字来完成。

```c

#include

#include

// 定义链表节点结构体

typedef struct Node {

int data; // 节点存储的数据

struct Node* next; // 指向下一个节点的指针

} Node;

#### 创建链表节点

创建链表节点通常涉及动态内存分配,因为链表的大小在运行时可能会变化。

```c
// 创建一个新节点,并设置其数据部分
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node)); // 动态分配内存
    if (newNode == NULL) {
        printf("Memory allocation failed!\n");
        exit(1); // 如果内存分配失败,则退出程序
    }
    newNode->data = data; // 设置节点数据
    newNode->next = NULL; // 新节点的下一个节点初始化为NULL
    return newNode;
}

#### 向链表添加元素

向链表添加元素通常有两种方式:在链表头部添加(头插法)和在链表尾部添加(尾插法)。

- **头插法**:

// 在链表头部添加新节点

void insertAtHead(Node** head, int data) {

Node* newNode = createNode(data);

newNode->next = *head; // 新节点的下一个节点指向原头节点

*head = newNode; // 更新头节点为新节点

}

- **尾插法**:

```c
// 在链表尾部添加新节点
void insertAtTail(Node** head, int data) {
    Node* newNode = createNode(data);
    if (*head == NULL) {
        // 如果链表为空,则新节点即为头节点
        *head = newNode;
    } else {
        // 否则,遍历到链表末尾,将新节点添加到末尾
        Node* temp = *head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

#### 打印链表

为了验证链表的操作是否正确,我们需要一个函数来遍历并打印链表中的所有元素。

// 打印链表

void printList(Node* head) {

Node* temp = head;

while (temp != NULL) {

printf("%d -> ", temp->data);

temp = temp->next;

}

printf("NULL\n");

#### 完整示例

将上述所有部分组合起来,我们可以创建一个简单的程序来演示链表的创建、插入和打印操作。

```c
int main() {
    Node* head = NULL; // 初始化链表为空

    // 向链表添加元素
    insertAtHead(&head, 3);
    insertAtTail(&head, 1);
    insertAtTail(&head, 4);
    insertAtHead(&head, 2);

    // 打印链表
    printList(head); // 应输出:2 -> 3 -> 1 -> 4 -> NULL

    // 释放链表内存(此处省略,实际使用中需要编写释放内存的代码)

    return 0;
}

在实际应用中,当链表不再需要时,应该遍历链表并释放每个节点所占用的内存,以避免内存泄漏,上述示例中省略了内存释放的部分,以保持示例的简洁性。