在C语言中向链接列表添加节点

下面是在C语言中向链接列表添加节点的完整使用攻略。

什么是链接列表

链接列表(Linked List)是由多个节点组成的数据结构,每个节点包含一个数据元素和指向下一个节点的指针。

链接列表的优点是可以高效地插入和删除节点,而且不需要预先知道列表的大小。但缺点是访问任意一个节点的时间复杂度为O(n),不如数组高效。

如何向链接列表添加节点

首先,我们需要定义节点的结构体类型,结构体包含数据和指针两个成员变量:

struct node {
    int data;
    struct node *next;
};

其中,data表示节点存储的数据,next表示指向下一个节点的指针。

添加一个空的链接列表

要向链接列表中添加节点,需要首先创建一个空的链表,即链表中没有任何节点。

struct node *head = NULL;

其中,head表示链表的头部节点,初始值为NULL。

向链表中添加节点

在链表头部添加节点

要在链表头部添加一个新节点,在新节点中存储数据,将原有的头部节点变为新节点的下一个节点,最后将新节点作为链表的新头部节点。

struct node *new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = 10; // 存储数据
new_node->next = head; // 新节点的下一个节点是原有的头部节点
head = new_node; // 新节点成为新的头部节点

在链表尾部添加节点

要在链表尾部添加一个新节点,先遍历到链表的末尾,将新节点作为最后一个节点的下一个节点。

struct node *new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = 20; // 存储数据
new_node->next = NULL; // 新节点为最后一个节点,所以指向NULL

if (head == NULL) { // 链表为空,新节点成为头部节点
    head = new_node;
} else { // 链表不为空,遍历到末尾
    struct node *last = head;
    while (last->next != NULL) {
        last = last->next;
    }
    last->next = new_node; // 将新节点作为最后一个节点的下一个节点
}

示例说明

示例一:向链表头部添加节点

#include <stdio.h>
#include <stdlib.h>
struct node {
    int data;
    struct node *next;
};

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

    // 在头部添加节点
    struct node *new_node1 = (struct node*)malloc(sizeof(struct node));
    new_node1->data = 10;
    new_node1->next = head;
    head = new_node1;

    struct node *new_node2 = (struct node*)malloc(sizeof(struct node));
    new_node2->data = 20;
    new_node2->next = head;
    head = new_node2;

    // 遍历所有节点
    struct node *current = head;
    while (current != NULL) {
        printf("%d\n", current->data);
        current = current->next;
    }

    return 0;
}

输出结果为:

20
10

示例二:向链表尾部添加节点

#include <stdio.h>
#include <stdlib.h>
struct node {
    int data;
    struct node *next;
};

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

    // 在尾部添加节点
    struct node *new_node1 = (struct node*)malloc(sizeof(struct node));
    new_node1->data = 10;
    new_node1->next = NULL;
    head = new_node1;

    struct node *new_node2 = (struct node*)malloc(sizeof(struct node));
    new_node2->data = 20;
    new_node2->next = NULL;

    if (head == NULL) {
        head = new_node2;
    } else {
        struct node *current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = new_node2;
    }

    // 遍历所有节点
    struct node *current = head;
    while (current != NULL) {
        printf("%d\n", current->data);
        current = current->next;
    }

    return 0;
}

输出结果为:

10
20

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在C语言中向链接列表添加节点 - Python技术站

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

相关文章

  • 明日之后怎么安装C型窗 C型窗安装版方法介绍

    下面是明日之后怎么安装C型窗的完整攻略。 安装C型窗攻略 安装C型窗的方法分为以下几步: 找到C型窗安装版 下载C型窗安装版并解压 将解压后的文件放入游戏目录中 在游戏中使用命令行安装 接下来将详细介绍每一步。 1. 找到C型窗安装版 首先需要找到C型窗安装版文件,可以在明日之后的论坛或社群中寻找,也可以在百度云、360云盘等网盘中进行下载。建议下载前先阅读…

    C 2023年5月23日
    00
  • Android利用Gson解析嵌套多层的Json的简单方法

    下面是“Android利用Gson解析嵌套多层的Json的简单方法”的完整攻略。 导入Gson库 首先需要在项目的build.gradle文件中添加Gson库的依赖: dependencies { implementation ‘com.google.code.gson:gson:2.8.6’ } 创建Java类 假设我们有以下json数据: { &quot…

    C 2023年5月23日
    00
  • C++成员函数如何当作回调函数同时传递this指针

    要将一个C++对象的成员函数作为回调函数并传递对象的this指针,需要使用函数对象和函数指针的技巧。下面分步骤介绍: 1. 定义函数对象 首先定义一个函数对象类,这个类中定义了一个成员函数指针和一个指向对象的指针。这个类将被用于封装成员函数以便传递给其他函数。 class Foo { public: typedef void (Foo::*Callback)…

    C 2023年5月23日
    00
  • 浅谈c++ 预处理器

    当我们在编写C++程序时,我们会使用一些预处理指令来告诉编译器预先处理一些代码,以便让程序更加高效和可维护。C++的预处理器是在编译代码之前执行的,它主要负责处理以 # 开始的预处理指令。在本文中,我将详细介绍C++预处理器及其使用。 什么是C++预处理器 C++预处理器是一种特殊的程序,它可以在编译C++源代码之前进行一些处理。它是由程序员使用 # 开头的…

    C 2023年5月23日
    00
  • C++实现哈夫曼树算法

    C++实现哈夫曼树算法攻略 哈夫曼树,又称最优二叉树,是一种带权路径长度最短的二叉树。它常用于数据压缩和编码的算法中。 1. 哈夫曼树的定义 哈夫曼树是一种满足以下属性的二叉树: 树中每个叶子节点都对应一个权值; 树中每个非叶子节点的权值是其左右子树中权值之和; 树的带权路径长度最小。 2. 哈夫曼编码的实现 哈夫曼编码是一种前缀编码,它把每个不同符号对应到…

    C 2023年5月22日
    00
  • 详解php与ethereum客户端交互

    详解php与ethereum客户端交互 概述 Ethereum是一种基于区块链的分布式应用程序平台,它提供了以太币(Ether)作为加密数字货币的基础,并允许在以太坊上构建智能合约。 PHP是一种流行的Web编程语言,通常用于构建Web应用程序。 本文将介绍如何使用PHP与Ethereum客户端进行交互,以便于实现以太坊智能合约的部署和调用。 安装 在PHP…

    C 2023年5月23日
    00
  • Linux下如何用GCC编译动态库

    Linux下如何用GCC编译动态库 1. 准备工作 在开始编译动态库之前,需要先安装GCC。如果还没有安装,可以使用以下命令进行安装: sudo apt-get install build-essential 此外,编译动态库还需要用到以下两个选项: -shared:将目标文件编译为共享库 -fPIC:编译时生成位置无关代码 2. 编译动态库 下面是编译动态…

    C 2023年5月23日
    00
  • Java使用线程池实现socket编程的方法详解

    Java使用线程池实现socket编程的方法详解 简介 Java中的线程池是用来管理和复用线程的工具。线程池可以减少线程的创建和销毁,节省了系统资源。在socket编程中,线程池可以避免创建大量的线程,优化程序性能。 线程池的实现 线程池的创建可以使用Java中的Executor或ExecutorService接口。这两个类都是Executor框架的一部分,…

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