您现在的位置是:首页 >技术教程 >【C/C++】用指针处理链表网站首页技术教程

【C/C++】用指针处理链表

programming expert 2025-02-10 12:01:02
简介【C/C++】用指针处理链表

在C或C++等编程语言中,链表是一种常见的数据结构,它通过一系列节点相互连接来存储数据。每个节点通常包含两部分:数据本身和指向下一个节点的指针。使用指针来操作链表可以实现插入、删除、遍历等操作。

以下是一个基本的单向链表的示例,包括节点的定义和一些基本的操作函数:

节点定义

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
struct Node {
    int data;
    struct Node* next;
};

创建新节点

// 创建一个新节点并初始化数据
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    if (!newNode) {
        printf("内存分配失败
");
        exit(1);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

在链表的头部插入一个新节点:

// 在链表头部插入新节点
void insertAtHead(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}

在链表的尾部插入一个新节点:

// 在链表尾部插入新节点
void insertAtTail(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    struct Node* temp = *head;
    while (temp->next != NULL) {
        temp = temp->next;
    }
    temp->next = newNode;
}

删除节点

根据值删除节点:

// 根据值删除节点
void deleteNode(struct Node** head, int key) {
    struct Node* temp = *head;
    struct Node* prev = NULL;

    // 检查头节点是否就是要删除的节点
    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }

    // 搜索要删除的节点
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }

    // 如果没有找到节点
    if (temp == NULL) return;

    // 从链表中删除节点
    prev->next = temp->next;
    free(temp);
}

遍历链表

// 遍历链表并打印每个节点的数据
void printList(struct Node* head) {
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL
");
}

主函数示例

int main() {
    struct Node* head = NULL;

    insertAtHead(&head, 1);
    insertAtHead(&head, 2);
    insertAtTail(&head, 3);
    insertAtTail(&head, 4);

    printf("链表内容: ");
    printList(head);

    deleteNode(&head, 3);
    printf("删除值为3的节点后: ");
    printList(head);

    return 0;
}

注意事项

  1. 内存管理‌:在创建和删除节点时,务必注意内存的管理,避免内存泄漏。
  2. 空指针检查‌:在操作链表时,要经常检查指针是否为空,以避免访问非法内存。
  3. 边界条件‌:在处理链表操作时,要考虑各种边界条件,如头节点、尾节点和只有一个节点的链表等。

通过掌握这些基本操作,你可以有效地处理链表,并在需要时扩展这些操作以满足更复杂的需求。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。