C语言单链表

news2024/9/27 9:26:03

本节目标:

①定义单链表结构体

②初始化单链表

③单链表增加结点(头插法尾插法

④删除指定结点

⑤打印输出

目录

导入头文件

定义单链表结构体

初始化单链表

头插法

尾插法插入

删除指定结点

打印单链表

全部代码展示


导入头文件

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

        <stdlib.h>中有我们需要动态分配内存的malloc()函数。

定义单链表结构体

typedef struct Node {
    int data;
    struct Node* next;
} Node;

这里我们使用typedef将struct Node命名为Node。

当然很多书以及代码中会使用到如下的

typedef struct Node {
    int data;
    struct Node* next;
} Node, *LinkList;

 这里它还定义了一个指向这个结点的指针,当然对于初学者(笔者也是初学者)来说。

使用*LinkList后,不太好理解,这里笔者就使用上述Node的版本。

初始化单链表

Node* initList() {
    //定义头结点
    Node* L = (Node*)malloc(sizeof(Node));
    L->data = 0;
    L->next = NULL;
    return L;

这里我们使用Node* initList()作为初始化的函数,返回的是Node类型。

首先使用malloc函数分配结点内存,sizeof表示将Node转化为对应的大小。

这样就 定义了L,当然你可以加个判断,看内存分配是否成功

接着将L的data域设置为0(这里没有明确规定需要,因为头结点的数据域可存可不存内容),L的指针域设置为NULL,最后返回L,最终初始化好了单链表。

头插法

void headInsert(Node* L, int data) {
    //1创建空间
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = L->next;
    L->next = node;
    //表示插入一个结点
    L->data++;
}

 对于初学者,可以记住传入的参数是Node* L,这里指的是传入头结点。

首先创建一个结点node;然后如下图操作

        首先将data赋值到结点中,将结点指向L的下一个结点,当然这下一个结点可以为NULL,因此不用分类讨论。最后将L指向新生成的结点,最后这步L->data++可以表示插入了一个结点。

尾插法插入

void tailInsert(Node* L, int data) {
    //定义头结点
    Node* head = L;
    //创建空间
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    //指针先移到第一个结点上,因为第一个是头结点
    L = L->next;
    //如果next指向存在,就说明不是最后一个结点
    while (L->next) {
        L = L->next;
    }
    L->next = node;
    head->data++;
}

上图下面的是尾插法:  

①由于尾插法,本文没有设置尾指针,是通过遍历的方法找到最后一个结点(L=L->next),且由于这里head->data++,因此需要在搞一个变量存头结点;

②先创建node结点,将data赋值进去,next指向NULL;

③由于第一个是头结点,我们需要L=L->next,然后在进行遍历找最后一个结点,找到后将L的next指向新生成的node结点,最后head++。

删除指定结点

void delete(Node* L, int data) {
    //头结点
    Node* pre = L;
    //第一个结点
    Node* current = L->next;
    while (current) {
        if (current->data == data) {
            pre->next = current->next;
            free(current);
            break;
        }
        pre = current;
        current = current -> next;
    }
    //头结点的数据域用来计数
    L->data--;
}

①首先删除结点需要找到被删除结点的前一个结点,因此我们定义一个pre;

②然后我们定义一个current,指向L的next;

③判断current是否为空,如果不为空的话,pre和current往后指向一个;

④判断结点的data是否和函数的data相同,如果相同的话,将pre的next指针指向current的下一个结点,然后将current结点释放。

⑤最后头结点的data减一。

打印单链表

void printflist(Node* L) {
    L = L->next;
    while (L) {
        printf("%d ", L->data);
        L = L->next;
    }
    printf("\n");
}

全部代码展示

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* initList() {
    //定义头结点
    Node* L = (Node*)malloc(sizeof(Node));
    L->data = 0;
    L->next = NULL;
    return L;
}
void headInsert(Node* L, int data) {
    //1创建空间
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = L->next;
    L->next = node;
    //表示插入一个元素
    L->data++;
}
void tailInsert(Node* L, int data) {
    //定义头结点
    Node* head = L;
    //创建空间
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    //指针先移到第一个结点上,因为第一个是头结点
    L = L->next;
    //如果next指向存在,就说明不是最后一个结点
    while (L->next) {
        L = L->next;
    }
    L->next = node;
    head->data++;
}
void delete(Node* L, int data) {
    //头结点
    Node* pre = L;
    //第一个结点
    Node* current = L->next;
    while (current) {
        if (current->data == data) {
            pre->next = current->next;
            free(current);
            break;
        }
        pre = current;
        current = current -> next;
    }
    //头结点的数据域用来计数
    L->data--;
}
void printflist(Node* L) {
    L = L->next;
    while (L) {
        printf("%d ", L->data);
        L = L->next;
    }
    printf("\n");
}
int main(){
    Node* L = initList();
    headInsert(L, 1);
    headInsert(L, 2);
    headInsert(L, 3);
    headInsert(L, 4);
    headInsert(L, 5);
    headInsert(L, 6);
    headInsert(L, 7);
    tailInsert(L, 8);
    tailInsert(L, 9);
    tailInsert(L, 10);
    printflist(L);
    delete(L, 5);
    delete(L, 1);
    delete(L, 10);
    printflist(L);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/497049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NP完全性PART1:多项式时间与形式化语言体系

算法导论第三版&#xff0c;CH34笔记 NP完全性 Chapter Introduction 一般来说&#xff0c;我们认为可以在多项式时间内求解的问题是易处理的问题&#xff0c;在超多项式时间内解决的问题是不易处理的问题。 下面列出的几对问题&#xff0c;前者可以用多项式时间算法求解&…

MATLAB 点云法向量计算与可视化 (9)

MATLAB 点云法向量计算与可视化 (9) 一、实现效果二、算法介绍三、函数说明四、具体代码(注释详细)一、实现效果 红色线即代表该点位处的法向量计算结果 二、算法介绍 用于拟合局部平面的法线,以 M 乘3或 M 乘 N 乘3矩阵的形式返回。法向量由 k 值定义的邻域数局部计算。…

Packet Tracer - 配置 IP ACL 来缓解攻击

Packet Tracer - 配置 IP ACL 来缓解攻击 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 交换机端口 R1 G0/1 192.168.1.1 255.255.255.0 不适用 S1 F0/5 S0/0/0 (DCE) 10.1.1.1 255.255.255.252 不适用 不适用 R2 S0/0/0 10.1.1.2 255.255.255…

10款UML建模工具更新(2023.4)Software Ideas Modeler 、Rhapsody、Papyrus

最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;Software Ideas Modeler 13.99 更新时间&#xff1a;2023年4月17日 工具简介 轻量级建模工具&#xff0c;支持UML、BPMN、SysML。 平台&#xff1a;Windows 获得地址 https://www.softwareideas.net/en/do…

java学习之异常二

目录 一、异常处理机制 一、try-catch-finally 二、throws 二、try-catch 异常处理使用细节 三、try-catch-finally练习 第一题 第二题 第三题 第四题 一、异常处理机制 共有两种异常处理机制 一、try-catch-finally 处理机制图示 二、throws 关于第二点&#xff0c;如E…

Linux性能分析工具perf和火焰图使用方法

简介 perf是linux上的性能分析工具&#xff0c;perf可以对event进行统计得到event的发生次数&#xff0c;或者对event进行采样&#xff0c;得到每次event发生时的相关数据(cpu、进程id、运行栈等)&#xff0c;利用这些数据来对程序性能进行分析。 perf可以统计或采样的event有…

JVM学习随笔02——虚拟机内存区组成与内存溢出异常

一、Java虚拟机内存区组成图 1、程序计数器&#xff1a; 每个线程独占一个计数器&#xff0c;用来指示该线程下一条要执行的指令的地址。这一部分不会导致内存异常。PS&#xff1a;如果一个线程进入的是一般的Java方法&#xff0c;计数器指示的是下一条指令地址&#xff1b;如果…

taro小程序中如何引入css_moudle?配置后不生效的解决方法

1.根据文档Taro配置 编译配置存放于项目根目录下的 config 目录中&#xff0c;包含三个文件&#xff1a; index.js 是通用配置dev.js 是项目预览时的配置prod.js 是项目打包时的配置 参考Taro官网&#xff0c;我们要做的是&#xff1a;找到项目根文件夹下的 config 文件&…

【Android车载系列】第12章 车载渲染-SurfaceFlinger单独绘制到界面

1 SurfaceFlinger渲染方案 车载的倒车影像同学们知道是怎么实现的吗&#xff1f;等待Android设备开机再打开倒车影像App&#xff1f;车子挂到R档倒车如果等待这个流程实在太久&#xff0c;是否还有其它办法可以让车子挂R档直接展示倒车影像呢&#xff1f;大家思考一下。 我们从…

opencv_c++学习(四)

图像在opencv中的存储方式 在上图中可以看出&#xff0c;在opencv中采用的是像素值来代表每一个像素三通道颜色的深浅。 Mat对象 Mat对象是在OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题&#xff0c;是面向对象的数据结构。分了两个部分&#xff0…

Graph—随机游走

Random Walk Approaches for Node Embeddings 一、随机游走基本概念 想象一个醉汉在图中随机的行走&#xff0c;其中走过的节点路径就是一个随机游走序列。 随机行走可以采取不同的策略&#xff0c;如行走的方向、每次行走的长度等。 二、图机器学习与NLP的关系 从图与NLP的…

《计算机网络—自顶向下方法》 第二章Wireshark实验:HTTP协议分析

HTTP 协议工作于客户端-服务端架构上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求。 WEB 服务器有&#xff1a;Apache服务器&#xff0c;IIS服务器&#xff08;Internet Information Services&#xff09;等。URL&#xff1a;即统一资源定位符(…

手写自己的Springboot-1-整合tomcat

文章目录 创建自己的Springboot创建项目注册、启动Spring容器启动tomcat 引用测试 创建自己的Springboot 首先明确本文章想要达到的目的,就是引入我们自己写的Springboot项目的依赖,无需配置,就可以达到处理普通请求的效果. 这里有一个非常简单的Springboot项目,项目里面就只…

将 Segment Anything 扩展到医学图像领域

文章目录 前言技术交流SAM 拆解分析从医学角度理解 SAM 的效用MedSAM实验总结 前言 SAM 是一种在自然图像分割方面取得成功的模型&#xff0c;但在医学图像分割方面表现不佳。MedSAM 首次尝试将 SAM 的成功扩展到医学图像&#xff0c;并成为用于分割各种医学图像的通用工具。为…

22.网络爬虫—APP数据抓取详讲

网络爬虫—APP数据抓取详讲 Fiddler工作原理安装完成Fiddler后的配置前提条件工具配置 手机数据抓取Fiddler手机端配置手机端操作 实战演示后记 前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域新…

springboot+mybatis搭建maven多模块工程

最近看了一篇博客&#xff0c;选定springbootmybatis作为框架&#xff0c;在idea中搭建maven的多模块工程&#xff0c;下面也再温习一下&#xff0c;并将搭建过程分享出来&#xff0c;供小伙伴们参考。 1、开发工具及系统环境 Idea 2020.3系统环境为win10mysql5.7springboot2.…

GNN学习/GCN学习/GNN环境配置cuda安装/GCN代码展示

参考: A Gentle Introduction to Graph Neural Networks https://distill.pub/2021/gnn-intro/Understanding Convolutions on Graphs https://distill.pub/2021/understanding-gnns/Graph neural networks: A review of methods and applications https://arxiv.org/pdf/1812…

【Java】认识异常

目录 1.异常概念和分类 2.异常的抛出 3.异常的捕获 3.1异常声明throws 3.2异常捕获try-catch 3.3finally 3.4.异常的处理流程 4.自定义异常类 1.异常概念和分类 public class Test {public static void test() {test();}public static void main(String[] args) {Sy…

详解数据集safety-pilot-model-deployment-data

safety-pilot-model-deployment-data这个数据集是由美国交通部的联邦航空管理局&#xff08;FAA&#xff09;和交通运输部&#xff08;DOT&#xff09;主导的“安全试点”&#xff08;Safety Pilot Model Deployment&#xff09;项目所提供的。该项目旨在研究汽车与飞机之间的通…

Vue电商项目--开发Search模块与mockjs模拟数据

Search模块中商品分类与过度动画 现在完成了在/home路由下实现三级导航组件的显示隐藏 通过this.$route.path!/home在搜索页面显示&#xff0c;通过方法鼠标移入移出从而又控制在search路由下的显示隐藏 过渡动画&#xff1a;前提组件|元素必要又v-if| v-show指令才可以进行…