掌握C语言,带头节点让你轻松应对复杂链表操作

发布时间:2025-05-24 21:25:04

引言

链表是C言语中一种常用的数据构造,它经由过程节点之间的指针连接构成线性序列。在链表操纵中,带头节点的计划可能简化很多操纵,使得代码愈加清楚跟易于保护。本文将具体介绍C言语中带头节点单链表的操纵,帮助读者轻松应对复杂链表操纵。

带头节点单链表的定义

起首,我们须要定义链表的节点构造。带头节点的链表在链表的开端处有一个额定的节点,它的数据部分平日不存储现实元素,而是用于便利操纵。

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

接上去,定义链表构造体,包含一个指向头节点的指针。

typedef struct LinkedList {
    Node* head; // 头结点
} LinkedList;

创建链表

创建一个空链表就是初始化一个头结点,其next指针为NULL

LinkedList* createLinkedList() {
    LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList));
    list->head = NULL;
    return list;
}

拔出节点

拔出节点分为在链表头部拔出跟在特定地位拔出。

在头部拔出节点

void insertAtStart(LinkedList* list, int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = list->head;
    list->head = newNode;
}

在特定地位拔出节点

void insertAfter(Node prevNode, int value) {
    if (prevNode == NULL) return;
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = prevNode->next;
    prevNode->next = newNode;
}

删除节点

删除节点分为删除指定节点、删除指定值的节点跟顺次删除第i个节点。

删除指定节点

void deleteNode(Node* node) {
    if (node == NULL) return;
    Node* temp = node->next;
    free(node);
    node = temp;
}

删除指定值的节点

void deleteValue(LinkedList* list, int value) {
    Node* current = list->head;
    Node* prev = NULL;
    while (current != NULL && current->data != value) {
        prev = current;
        current = current->next;
    }
    if (current == NULL) return;
    if (prev == NULL) {
        list->head = current->next;
    } else {
        prev->next = current->next;
    }
    free(current);
}

顺次删除第i个节点

void deleteAt(LinkedList* list, int i) {
    if (i <= 0 || list->head == NULL) return;
    Node* current = list->head;
    Node* prev = NULL;
    int count = 1;
    while (current != NULL && count != i) {
        prev = current;
        current = current->next;
        count++;
    }
    if (current == NULL) return;
    if (prev == NULL) {
        list->head = current->next;
    } else {
        prev->next = current->next;
    }
    free(current);
}

打印链表

void printList(LinkedList* list) {
    Node* current = list->head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

总结

经由过程以上介绍,信赖读者曾经控制了C言语中带头节点单链表的操纵。在现实利用中,公道应用这些操纵可能简化链表操纵,进步代码的可读性跟可保护性。