C语言单链表实现方法详解

C语言单链表实现方法详解

简介

单链表是常用的一种数据结构,它由节点组成,每个节点包含两个信息:数据和下一个节点的指针。单链表的优点在于插入和删除元素的效率高,但是随机访问的效率低。

在C语言中,单链表的实现方法非常简单,只需要定义一个节点结构体,再定义相应的节点操作函数,即可实现单链表的操作。

节点结构体

首先,我们需要定义一个节点结构体。每个节点包含两个信息:数据和指向下一个节点的指针。结构体可以定义为以下形式:

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

节点操作函数

创建节点

我们可以定义一个函数,用于创建一个新节点。函数接受一个整数作为参数,创建一个包含该整数的节点,并将节点的指针返回。

struct Node* createNode(int data) {
    struct Node* node = malloc(sizeof(struct Node));
    node->data = data;
    node->next = NULL;
    return node;
}

插入节点

我们可以定义一个函数,用于在链表中插入一个新节点。函数接受一个指向链表头结点的指针,以及一个整数作为参数,创建一个包含该整数的节点,并将其插入到链表中。插入操作有两种情况:

  1. 在链表的头部插入节点。
  2. 在链表的中间或尾部插入节点。

下面是添加节点的代码实现:

void insertNode(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    // 如果链表为空,将新节点作为头结点
    if (*head == NULL) {
        *head = newNode;
    } else {
        struct Node* currentNode = *head;
        while (currentNode->next != NULL) {
            currentNode = currentNode->next;
        }
        currentNode->next = newNode;
    }
}

删除节点

我们可以定义一个函数,用于在链表中删除一个节点。函数接受一个指向链表头结点的指针,以及一个整数作为参数,查找链表中是否包含该整数,并删除该整数所在的节点。删除操作有两种情况:

  1. 删除链表的头结点。
  2. 删除链表中的中间节点或尾节点。

下面是删除节点的代码实现:

void deleteNode(struct Node** head, int data) {
    // 如果链表为空,无法删除节点
    if (*head == NULL) {
        return;
    }
    struct Node* currentNode = *head;
    struct Node* previousNode = NULL;
    // 遍历链表,查找需要删除的节点
    while (currentNode != NULL && currentNode->data != data) {
        previousNode = currentNode;
        currentNode = currentNode->next;
    }
    // 如果要删除的节点是头结点
    if (previousNode == NULL) {
        *head = currentNode->next;
    } else {
        previousNode->next = currentNode->next;
    }
    free(currentNode);
}

示例

下面是一个使用单链表的示例,用于将一组整数插入到链表中,并输出链表中所有节点的数据:

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

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

struct Node* createNode(int data) {
    struct Node* node = malloc(sizeof(struct Node));
    node->data = data;
    node->next = NULL;
    return node;
}

void insertNode(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    // 如果链表为空,将新节点作为头结点
    if (*head == NULL) {
        *head = newNode;
    } else {
        struct Node* currentNode = *head;
        while (currentNode->next != NULL) {
            currentNode = currentNode->next;
        }
        currentNode->next = newNode;
    }
}

void deleteNode(struct Node** head, int data) {
    // 如果链表为空,无法删除节点
    if (*head == NULL) {
        return;
    }
    struct Node* currentNode = *head;
    struct Node* previousNode = NULL;
    // 遍历链表,查找需要删除的节点
    while (currentNode != NULL && currentNode->data != data) {
        previousNode = currentNode;
        currentNode = currentNode->next;
    }
    // 如果要删除的节点是头结点
    if (previousNode == NULL) {
        *head = currentNode->next;
    } else {
        previousNode->next = currentNode->next;
    }
    free(currentNode);
}

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

int main() {
    struct Node* head = NULL;
    for (int i = 1; i <= 5; i++) {
        insertNode(&head, i);
    }
    printf("链表中所有节点的数据:\n");
    printList(head);
    deleteNode(&head, 4);
    printf("删除节点4后,链表中所有节点的数据:\n");
    printList(head);
    return 0;
}

输出结果为:

链表中所有节点的数据:
1 2 3 4 5 
删除节点4后,链表中所有节点的数据:
1 2 3 5 

这个示例演示了如何使用单链表实现插入和删除操作,并输出链表中所有节点的数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言单链表实现方法详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言圣诞树的实现示例

    C语言圣诞树的实现示例 在这个示例中,我们将会使用C语言来实现一个圣诞树的输出效果。代码中将会用到循环、条件语句、字符输出、延时等知识点,让我们一起来看看该如何实现吧。 实现思路 实现圣诞树的思路很简单,我们可以分成两个部分来实现: 打印出圣诞树的形状,包括树干和树叶部分。 在圣诞树上挂上圣诞灯,增添节日气氛。 代码实现 基本思路讲解完了,我们来看看代码: …

    C 2023年5月23日
    00
  • C++ vector的基本使用示例详解

    C++ vector的基本使用示例详解 什么是C++ vector? C++ vector 是STL(Standard Template Library)中的一个动态数组容器类型,能够灵活地存储和访问不同类型的数据。 如何使用C++ vector? 头文件引入 使用C++ vector,首先需要在代码中引入vector头文件: #include <ve…

    C 2023年5月22日
    00
  • C语言中的编码小技巧

    当我们使用C语言编写代码时,有一些小技巧可以帮助我们写出更优美、更高效、更易于维护的代码。 1. 使用位运算来进行数值操作 在C语言中,位运算符(&、|、^、~、<<、>>)用于在二进制位级别上进行操作。这些运算符可以非常快速地执行某些数值计算,比如: 判断一个数是否是奇数或偶数:使用&运算符,如果一个数的最后一位是0…

    C 2023年5月23日
    00
  • golang中json和struct的使用说明

    当我们进行Web开发时,经常需要将数据发送和接收作为JSON格式,此时就需要掌握golang中json和struct的使用。 1. struct和json的概述 在golang中,我们可以使用struct表示一个自定义的数据类型。当我们需要发送和接收网络请求的时候,我们需要将一个struct对象序列化为JSON字符串,并且在收到响应后将JSON字符串反序列化…

    C 2023年5月23日
    00
  • C语言实现输入ascii码,输出对应的字符方式

    下面是一份详细的攻略,教你如何在C语言中实现输入ASCII码,输出对应的字符的功能。 1. 了解ASCII码 ASCII码是一种将字符编码成二进制数的标准,在C语言中也是普遍使用的字符编码方式。它包括了数字、字母、符号等可打印字符,为每个字符分配了一个唯一的7位或8位二进制编码。 在C语言中,我们可以使用整数类型的变量存储ASCII码,并且通过printf(…

    C 2023年5月24日
    00
  • Win7旗舰版升级Win10提示错误代码C1900107的解决方法

    下面是详细讲解“Win7旗舰版升级Win10提示错误代码C1900107的解决方法”的完整攻略。 问题描述 在升级Win7旗舰版到Win10时,可能会出现错误代码C1900107的提示,导致升级失败。这个错误通常是由于系统内存不足或硬盘空间不足所导致的。 解决方法 针对这个问题,可以采取以下几个步骤来解决: 步骤1:清理硬盘空间 由于Win10系统占用的空间…

    C 2023年5月23日
    00
  • 浅析C语言中sscanf 的用法

    浅析C语言中sscanf的用法 简介 sscanf是C语言标准库中的函数,其作用是根据指定格式从一个字符串中读取数据并赋值给指定的变量。sscanf函数常用于解析文本中的数据,可以接受类似于printf函数的格式字符串,并将字符串中的数据进行解析。 语法 int sscanf(const char *str, const char *format, …)…

    C 2023年5月23日
    00
  • SQL2000个人版 应用程序正常初始化失败0乘以C0000135失败

    首先,需要明确的是,这个错误通常是由于系统缺失或损坏了必要的 Microsoft Visual C++ Redistributable 库文件所导致的。为解决这个问题,通常需要重新安装或修复这些库文件。 以下是一个可能的攻略,步骤如下: 下载并安装最新版的 Microsoft Visual C++ Redistributable 库文件。可以从 Micros…

    C 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部