📜  C 中的头链表(1)

📅  最后修改于: 2023-12-03 14:59:39.115000             🧑  作者: Mango

C 中的头链表

在C语言中,链表是一种常用的数据结构,头链表(Head Linked List)是链表的一种变体,它是在链表的头部添加了一个指向链表头部的指针,使得添加和删除元素时更加方便。

声明

在声明头链表时,我们需要定义一个结构体,其中包含两个成员:头指针和大小。头指针指向链表中的第一个节点,大小表示链表中节点的数量。示例代码如下:

typedef struct node {
    void *data;
    struct node *next;
} Node;

typedef struct list {
    Node *head;
    int size;
} List;
初始化

当我们定义了一个头链表结构体时,需要先对其进行初始化,为头指针和大小赋初值。示例代码如下:

List* init() {
    List *list = (List*)malloc(sizeof(List));
    list->head = NULL;
    list->size = 0;
    return list;
}
添加元素

头链表中的添加元素有两种方式:在链表头部添加和在链表尾部添加。

在链表头部添加元素

在链表头部添加元素需要先创建一个新的节点,并将其插入到头指针的位置。插入操作示例代码如下:

void push_front(List *list, void *data) {
    Node *node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = list->head;
    list->head = node;
    list->size++;
}
在链表尾部添加元素

在链表尾部添加元素需要先找到链表中的最后一个节点,并将新的节点插入到其后面。插入操作示例代码如下:

void push_back(List *list, void *data) {
    Node *node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;

    if (list->size == 0) {
        list->head = node;
    } else {
        Node *temp = list->head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = node;
    }

    list->size++;
}
删除元素

头链表中的删除元素也有两种方式:删除链表头部元素和删除链表尾部元素。

删除链表头部元素

删除链表头部元素需要将头指针指向下一个节点即可。删除操作示例代码如下:

void pop_front(List *list) {
    if (list->size != 0) {
        Node *temp = list->head;
        list->head = temp->next;
        list->size--;
        free(temp);
    }
}
删除链表尾部元素

删除链表尾部元素需要先找到链表中倒数第二个节点,并将其next指针置为NULL。删除操作示例代码如下:

void pop_back(List *list) {
    if (list->size == 1) {
        free(list->head);
        list->head = NULL;
        list->size--;
    } else if (list->size > 1) {
        Node *temp = list->head;
        while (temp->next->next != NULL) {
            temp = temp->next;
        }
        free(temp->next);
        temp->next = NULL;
        list->size--;
    }
}
遍历链表

对于一个头链表,我们可以通过遍历链表来访问其中的每个节点。遍历示例代码如下:

void traverse(List *list, void (*callback)(void *)) {
    Node *temp = list->head;
    while (temp != NULL) {
        callback(temp->data);
        temp = temp->next;
    }
}
总结

头链表是链表的一种变体,它在链表的头部添加了一个指向链表头部的指针。通过使用头链表,可以更加方便地添加和删除元素。在定义和使用头链表时,需要注意初始化和遍历等细节问题。