02 链表的插入实现:头插、尾插、指定位置插入(Linked List 链表)

2023-10-26

实现代码

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

/*
 * 定义一个链表节点
 */
typedef struct LinkedNode {
    int data;
    struct LinkedNode *next;
} LinkedNode;

/*头插法和尾插法,均是传入头指针,然后进行操作的,所以在入参的时候,用到的是双指针*/
/*
 * 头插法
 * Following are the 4 steps to add node at the front.
 * Given a reference (pointer to pointer) to the head of a list
 * and an int,  inserts a new node on the front of the list.
 * 注意这里传的参数是指针的指针
 * Time complexity of push() is O(1) as it does constant amount of work.
 */
void push(LinkedNode **head_ref, int new_data
);

/*
 * 尾插法
 * Add a node at the end: (6 steps process)
 * Since a Linked List is typically represented by the head of it, we have to traverse the list till end and then change the next of last node to new node.
 * Given a reference (pointer to pointer) to the head
 * of a list and an int, appends a new node at the end
 */
void append(LinkedNode **head_ref, int new_data);

/**
 * 给定一个节点,在这个节点后面插入数据
 * @param prev_node 是一个指针,这个指针目前指在哪个节点,就将新节点插入到其后面
 * @param new_data
 */
void insertAfter(LinkedNode *prev_node, int new_data);

/*输出各节点的值*/
void printList(LinkedNode *node);

int main() {
    //1.测试一下头插法
    LinkedNode *head = NULL;
    //2.测试一下尾插法
    LinkedNode *tail = NULL;
    //因为push的入参是指针的指针,所以这里一定要用&取指针的地址
    printf("%p\n", &head);
    printf("头插法\n");
    push(&head, 5);
    push(&head, 6);
    push(&head, 7);
    printList(head);
    printf("尾插法\n");
    append(&tail, 4);
    append(&tail, 3);
    append(&tail, 2);
    printList(tail);
    //这里要传节点
    //将值插到指定的节点后面
    //tail本来是指向4的位置,tail->next就是3的位置。将7插入到3后面
    printf("对指定的节点后插入数据\n");
    insertAfter(tail->next, 7);
    printList(tail);
    return 0;
}

/*1.头插法*/
void push(LinkedNode **head_ref, int new_data) {
    //1.声明一个LinkedNode类型的指针,并且给它申请内存空间,使它变成一个节点
    LinkedNode *new_node = (LinkedNode *) malloc(sizeof(LinkedNode));
    //2.将new_data值赋值给新申请的节点
    new_node->data = new_data;
    //3.使新申请的节点的next指向原头指针head_ref指向的节点
    new_node->next = (*head_ref);
    //4.将头指针前移,使头指针head_ref指向新申请的节点
    (*head_ref) = new_node;
}

/*2.尾插法*/
void append(LinkedNode **head_ref, int new_data) {
    //1.声明一个LinkedNode类型的指针,并且给它申请内存空间,使它变成一个节点
    LinkedNode *new_node = (LinkedNode *) malloc(sizeof(LinkedNode));
    //2.将new_data值赋值给新申请的节点
    new_node->data = new_data;
    //3.因为是尾插法,所以new_node的next指针势必为NULL
    new_node->next = NULL;
    //4.定义一个新的LinkedNode类型的指针*temp,使它初始时等于头指针*head_ref
    //然后向后移动一直到指向最后一个节点
    //注意这里一定要是*temp = *head_ref,不能少掉*
    LinkedNode *temp = *head_ref;

    //5.如果这个头指针*head_ref为NULL,证明这是一个空链表,空链表的话,就直接将头指针指向新节点
    if (*head_ref == NULL) {
        *head_ref = new_node;
        //返回
        return;
    }
    //6.如果这个头指针*head_ref不为为NULL,非空链表,就要通过临时指针temp找到最后一个节点
    while (temp->next != NULL) {
        temp = temp->next;
    }

    //7.将新节点链接在指针后面
    temp->next = new_node;
    return;
}

// This function prints contents of linked list starting from head
void printList(LinkedNode *node) {
    while (node != NULL) {
        printf(" %d ", node->data);
        node = node->next;
    }
}

void insertAfter(LinkedNode *prev_node, int new_data) {
    //1.首先要判空,这个节点不能够为空
    if (NULL == prev_node) {
        printf("the given previous node cannot be NULL");
        return;
    }

    //2.创建一个指针,并且给这个指针申请内存空间,使之成为一个节点
    LinkedNode *new_node = (LinkedNode *) malloc(sizeof(LinkedNode));
    //3.给新节点赋值
    new_node->data = new_data;

    //4.把prev_node->next的节点赋值给new_node->next
    new_node->next = prev_node->next;

    //把新申请的节点
    prev_node->next = new_node;
}

输出

0x7ffeead397b0
头插法
 7  6  5 尾插法
 4  3  2 对指定的节点后插入数据
 4  3  7  2 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

02 链表的插入实现:头插、尾插、指定位置插入(Linked List 链表) 的相关文章

随机推荐

  • Mybatis和Mybatis-Plus的配置

    目录 一 springMVC中Mybatis的配置 1 添加 MyBatis 和 MyBatis Spring 的依赖 2 配置数据源 3 配置 MyBatis 4 编写 Mapper 接口和对应的 XML 文件 二 springnboot
  • 大学二年级各科的学习成绩

    快要考试了 过多三个星期就是复习周了 又得狂抓一阵子 今天打开教务处 情不自禁打开成绩列表 希望继续保持吧 分数 学分 绩点 2008 2009学年上学期 01010022 毛邓三 上 必修 94 0 3 00 13 20 01020003
  • fortran使用MKL函数库计算方阵的逆矩阵

    本篇博文简要介绍使用MKL函数库计算方阵的逆矩阵 代码如下 program MKL getrfANDgetri use lapack95 implicit none integer parameter n 3 integer i j ipi
  • Python+turtle实现一个乌龟逃跑小游戏(可以和孩子一起完成)

    直接上演示视频 这个代码也是之前当老师的时候 给孩子们写的一个小游戏 那么我们一起看一下这个小游戏是如何让完成的 1 首先完成代码的前期准备 1 这里我们t turtle Pen 海龟 表示我们操作的小海龟 2 enemy turtle P
  • Windows 下安装 Memcached

    官网上并未提供 Memcached 的 Windows 平台安装包 我们可以使用以下链接来下载 你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可 32位系统 1 2 5版本 http static runoob com down
  • 【FFMPEG】AVFilter使用流程

    流程图 核心类 AVFilterGraph 于统合这整个滤波过程的结构体 AVFilter 滤波器 滤波器的实现是通过AVFilter以及位于其下的结构体 函数来维护的 AVFilterContext 个滤波器实例 即使是同 个滤波器 但是
  • Postman循环调用Post接口(Body多字段传参详细设置)

    背景 由于线上数据库 普通开发用户是无法进行增删改操作 所以如果需要调用线上的某个接口 但是又不通过界面进行操作的话 就可以通过Postman进行操作了 具体操作 新建项目 创建接口 编辑接口 单击新建的接口 输入相应的url及登录toke
  • chatgpt平替,清华chatglm本地化部署

    ChatGLM 6B 是一个开源的 支持中英双语的对话语言模型 基于 General Language Model GLM 架构 具有 62 亿参数 因为我的cpu跑不了 在linux服务器端进行部署 前提是conda已经安装并配置好 因为
  • Shell-脚本介绍

    目录 一 Shell介绍 二 Shell脚本的规则 三 比较运算符 四 Case循环语 五 If语句 分支结构 六 For循环 七 While循环 一 Shell介绍 Shell与Python都是弱语言 定义变量规则 变量名 值 Shell
  • 【华为OD机试真题】等和子数组最小和(C++&java&python)满分 详细代码注释 代码解读

    等和子数组最小和 给定一个数组nums 将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 组内元素和的最小值 输入描述 第一行输入m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums i lt
  • c 语言实现的简单屏幕烟花程序

    include stdlib h include graphics h include stdio h include math h include conio h define PI 3 1425926 main int gdriver
  • conda install 最常见错误的解决方案

    Conda 安装库错误 conda install pytorch 1 7 0 安装时相关错误 Collecting package metadata current repodata json failed gt gt gt gt gt
  • mac系统空间占用大解决方案

    本人mac2017 pro 120G 系统空间占用90G 一直提示空间不足 删除各种无用文件后才释放10G空间 网上搜索解决方案 弹出mackeeper mac 清理软件 广告 搜索mackeeper 发现网上骂声一片 基本上断定流氓软件
  • go语言的defer语句

    go语言defer语句的用法 参考 https www jianshu com p 5b0b36f398a2 defer的语法 defer后面必须是函数调用语句 不能是其他语句 否则编译器会出错 package main import lo
  • 华为OD题目:任务混部

    华为OD题目 任务混部 知识点差分Q 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 公司创新实验室正在研究如何最小化资源成本 最大化资源利用率 请你设计算法帮他们解决一个任务混部问题 有taskNum项任务 每个任务有开始
  • JS 元素遍历

    1 循环遍历从getElementsByClassName返回的所有元素 var elements document getElementsByClassName classname Array prototype forEach call
  • python

    coding utf 8 Created on Wed Nov 6 16 23 18 2019 author weiping from sklearn ensemble import RandomForestClassifier as rf
  • matlab 图像二值化 后0、1像素的个数统计

    目标 批量处理RGB图像 对其进行二值化处理 需要考虑二值化的阈值设置 此处不展开 统计二值化之后 各个黑白图像中0 1 的像素点数目 使用折线图的方式 展示出统计的结果 首先进行输入文件夹 与输出目标文件夹的路径定义 input path
  • 【Visual Studio】生成.i文件

    环境 VS版本 VS2013 问题 如何生成 i预编译文件 步骤 1 打开VS项目属性 打开C C 预处理器页面 预处理到文件 选择是 开启 2 生成文件如下 3 正常编译需要关闭此选项
  • 02 链表的插入实现:头插、尾插、指定位置插入(Linked List 链表)

    实现代码 include