List (单链表17个函数讲解)

2023-10-31

链表时一种常用的数据结构,是通过“链”来建立起数据元素之间的逻辑关系,这种用链接方式储存的线性表简称链表(Link List)。

一,链表与顺序表的对比
在接触链表之前大家想必已经了解过了顺序表的储存结构方式,顺序表与链表的不同之处如下:
1.顺序表是物理位置上相邻来表示数据元素之间的逻辑关系;但链表不是,物理地址不相连,通过指针来链接。
2.顺序表储存密度高,且能够随机的存取数据(通过下标);但链表不能随机访问,只能通过头指针遍历到指定节点遍历,这点没有顺序表方便。
3.顺序表插入删除操作,一般需要大量数据的移动,效率低下;链表无需移动数据,只改变指针的指向即可。
4.顺序表需要预先分配储存的空间,若表长过大,则存储规模难以预先确定,估计会过大的造成储存空间的浪费;链表由于是链式结构,无需过大的连续空间,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

二,单链表的定义
链表是通过一组任意的存储单元来存储线性表中的数据元素,各元素之间可以是不连续,为了建立起数据元素之间的线性关系,对于每个数据元素ai来说,除了存放数据元素自身的信息外,还必须有包含指示该元素后继元素的位置的信息—指针,数据域和指针两部分和起来我们称作—“结点”。以单链表为例,节点结构如下:

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

构造完节点,多个节点相连就是我们的链式储存结构了,如图所示:
这里写图片描述
n个元素的线性表通过结点的指针域连接成一条“链子”,我们形象的称之为链表。因为每个结点中只有指向其后继的指针,所以称之为单链表。

为了操作方便,我们在链表之外构造一个“结点”,储存链表的头结点(链表的第一个结点),尾结点(链表的最后一个结点)和链表的结点个数。

typedef struct List{
    struct List_Node *head;
    struct List_Node *tail;
    int              count;
}List;

这样就能清楚的反映链表信息,便于操作。

三,建立单链表
搭建一个链表,并实现以下基本函数:

enum Bool{
    FALSE,
    TRUE
};
typedef unsigned char Boolean;

typedef struct List{
    struct List_Node *head;
    struct List_Node *tail;
    int              count;
}List;
typedef struct List_Node{
    struct List_Node *next;
    int               data;
}List_Node;

List *init_list(void);                      //初始化
void destroy_list(List **list);             //销毁
Boolean push_back(List *list, int value);   //尾插
Boolean pusn_front(List *list, int value);  //头插
Boolean pop_back(List *list);               //尾删
Boolean pop_front(List *list);              //头删
void print_list(List *list);                //显示

搭建一个链表从链表初始化开始,链表的结点定义需要先申请空间,我们简单的封装下malloc,如下:

static void *Malloc(size_t size)
{
    void *result = malloc(size);
    if(result == NULL){
    fprintf(stderr,"memory is full!\n");
        exit(1);
    }
    return result;
}
  1. 初始化链表时,我们有必要对Malloc的空间进行清除操作,bzero函数是将所指空间大小内的数据全部清零。
List *init_list(void)  //初始化
{
    List *list = NULL;
    list = (List *)Malloc(sizeof(List));
    bzero(list, sizeof(List));

    return list;
}

static List_Node *create_node(void)
{
    List_Node *node= (List_Node*)Malloc(sizeof(List_Node));
    bzero(node, sizeof(List_Node));

    return node;
}

有初始化必然有销毁操作

void destroy_list(List **list)  //销毁
{
    if(list == NULL || *list){
    return ;
    }
    while((*list)->count){
    pop_back(*list);
    }
    free(*list);
    *list = NULL;
}
  1. 要构造链表,插入删除操作是必不可少的,而插入删除又分别分为头插,尾插,头删,尾删四种操作。
    头插这里写图片描述
    如图所示:情况1 当List中没有结点时,那么设置新结点既是头结点又是尾结点,count++;情况2 当List中有节点时,头插法首先要将新节点的next设为头结点(node->next = list->head),然后将新结点变为头结点(list->head = node),count++,完成。
Boolean push_front(List *list, int value)  //头插
{
    List_Node *node = NULL;  
    if(list == NULL){
    return FALSE;
    }
    node = create_node();
    node->data = value;

    if(list->count){
    node->next = list->head;
    list->head 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

List (单链表17个函数讲解) 的相关文章

  • 4.1-支持向量机

    文章目录 一 铰链损失 Hinge loss 二 核方法 Kernel Method 2 1 径向基函数核 Radial Basis Function Kernel 2 2 Sigmoid Kernel 三 支持向量机相关方法 SVM re
  • PyTorch学习日志_20201030_ Autograd 包

    日期 2020 10 30 主题 PyTorch入门 内容 根据PyTorch官方教程文档 学习PyTorch中所有神经网络的核心 Autograd 包的基础操作 主要与张量相关 根据自己的理解和试验 为代码添加少量注解 具体代码如下 fr

随机推荐

  • TCP往返传输时间(RTT)的估计

    TCP往返传输时间 RTT 的估计1 TCP传输往返时间是指发送端从发送TCP包开始到接收到它的立即响应所耗费的传输时间 当接收端和发送端同时支持TCP时戳选项时 发送端记录在TCP包头选项内的时戳可以被接收端随响应反射回来 发送端就可以利
  • Windows下OMNET++的安装和各种架构调试心得

    以下所述的为windows平台下OMNET 集成在MSVC6 0环境下的使用方法 一 OMNET的安装 1 到OMNET官方网站下载windows平台下的安装程序 当前版本为omnetpp 3 2p1 win32 下载Ghostscript
  • smart检测指标详解

    一 SMART概述 要说Linux用户最不愿意看到的事情 莫过于在毫无警告的情况下发现硬盘崩溃了 诸如RAID的备份和存储技术可以在任何时候帮用户恢复数据 但为预防硬件崩溃造成数据丢失所花费的代价却是相当可观的 特别是在用户从来没有提前考虑
  • linux下socket编程处理TCP粘包

    一 数据接收时会出现以下几种情况 一次接收到了客户端发送过来的一个完整的数据包 一次接收到了客户端发送过来的 N 个数据包 由于每个包的长度不定 无法将各个数据包拆开 一次接收到了一个或者 N 个数据包 下一个数据包的一部分 还是很悲剧 无
  • Redis内存数据库

    Redis内存数据库 NoSQL数据库简介 Redis简介 Redis应用场景 windows下安装和使用Redis 在linux下安装redis Redis数据可视化RedisDesktopManager Redis配置 Redis 数据
  • 无人机(总结的一个报告)

    无人机系统是配备了必要的数据处理单元 传感器 自动控制和通信系统 并且能够自动执行任务的系统 脑 能源 传感器 执行机构 无人系统分为 区域 无人空中系统 UAS 无人地面系统 UGS 无人海上系统 UMS 那么军用无人机系统未来的发展从哪
  • 如何用Jenkins和Perforce Helix Core搭建CI/CD管道

    Jenkins是常用的CI CD管道支持工具 在这一篇文章中 我们将详细讨论Jenkins对于CI CD管道的重要性 以及如何用Jenkins和Perforce Helix Core搭建CI CD管道 什么是Jenkins搭建的CI CD管
  • 使用Cmake封装API接口成Package方法

    本文是个人探究API封装成Package以让他人像使用OpeCV PCL等第三方库那样方便时所总结的经验 一 CmakeLists txt的编写 1 基本工程实现 cmake minimum required VERSION x x 最小C
  • c语言push操作的作用,C语言对栈的实现基本操作

    c语言中栈是一种数据结构 后进先出 即最后进入栈的数据最先弹出 c语言中没有栈这种数据类型 需要自己编程构建 下面我们就一起来了解一下c语言中栈的基本操作 C语言对栈的实现基本操作 操作如下 include include include
  • 重新学javaweb---路径专题

    绝对路径 以 开头的路径就叫做绝对路径 绝对路径在相对于的路径上直接拼接得到最终的路径 相对路径 不以 开头的路径就叫做相对路径 相对路径基于当前所在的路径计算的到最终的路径 硬盘路径 以盘符开头的路径就叫做硬盘路径 是哪个路径就是哪个路径
  • AKM项目轶事之客户南沙工厂Kick-off大会

    AKM项目轶事之客户南沙工厂Kick off大会 2014 10 29我们项目组一行十多号人 从上海飞往广州 参加客户在广州南沙工厂的项目Kick off meeting 项目启动大会 第二天 我们提前赶到客户办公室 在一个大会议室里面 我
  • 智能合约及其web3共识机制

    目录 什么是共识 什么是共识机制 共识机制的目标 为什么需要共识机制 如何评价一个共识机制的优劣 共识机制分类 PoW Proof of Work 工作量证明 多劳多得 PoS Proof of Stake 股权证明算法 持有越多 获得越多
  • 空域图像增强-图像灰度变换

    1 图像灰度变换 自选一张图片 完成以下图像处理 显示图像的灰度直方图 直方图均衡化 对比变化前后的图像和灰度直方图 对图像进行线性灰度变换 对某部分灰度值进行扩展 压缩其它灰度值区域 对比变化前后的图像和灰度直方图 图像增强 图像不清晰
  • CentOS7下安装helm

    1 先下载2 11 0版本 记住就下这个版本 其他版本要确认你有相应的镜像源 否则装不上 wget https get helm sh helm v2 11 0 linux amd64 tar gz tar xf helm v2 15 2
  • mybatis以及mybatisplus批量插入问题

    1 思路分析 批量插入是我们日常开放经常会使用到的场景 一般情况下我们也会有两种方案进行实施 如下所示 方案一 就是用 for 循环循环插入 优点 JDBC 中的 PreparedStatement 有预编译功能 预编译之后会缓存起来 后面
  • 嵌入式驱动那年的笔试面试-有干货

    面试简述 从9月份开始即吹响了找工作的号角 众说纷纭 有老师说9月份的没有必要 因为面向学历招聘 很抱歉啊 博主第一学历太渣了 研究生学历还可以把 有学生也因为数次的碰壁而退居幕后 准备这十月份的再次重来 但是残酷的现实证明 没有经过9月分
  • nms-python和C

    代码 import numpy as np def nms bboxes iou threshold x1 bboxes 0 y1 bboxes 1 x2 bboxes 2 y2 bboxes 3 score bboxes 4 area x
  • 【PHP小皮】下载高版本php8.1.0

    博主介绍 爱打csgo 有空来go一把 目录 前言 一 到官网下载PHP8 1 0版本 二 到小皮下载PHP 前言 提示 今天的内容是php小皮下载高版本 来兼容laravel框架 一 到官网下载PHP8 1 0版本 官网下载链接 PHP
  • Python:要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和

    题目 使用函数求特殊a串数列和 给定两个均不超过9的正整数a和n 要求编写函数fn a n 求a aa aaa aa aa n个a 之和 fn须返回的是数列和 思路 1 先输入a n的值 2 编写函数 使用for循环再 0 n 之间遍历 构
  • List (单链表17个函数讲解)

    链表时一种常用的数据结构 是通过 链 来建立起数据元素之间的逻辑关系 这种用链接方式储存的线性表简称链表 Link List 一 链表与顺序表的对比 在接触链表之前大家想必已经了解过了顺序表的储存结构方式 顺序表与链表的不同之处如下 1 顺