当前位置: 首页 > news >正文

数据结构——单向链表

什么是数据结构

数据结构:用来组织和存储数据

程序 = 数据结构 + 算法

数据与数据之间的关系

(1)逻辑结构:数据元素与元素之间的关系

        集合:元素与元素之间平等的关系

        线性结构:数据元素之间存在一对一的关系(顺序表、链表、队列、栈,内存是一种线性的存储结构)

        树形结构:数据元素之间存在一对多的关系(二叉树)

        图形结构:数据元素之间存在多对多的关系(网状结构)

(2)物理结构:数据元素在计算机内存中的存储方式

        顺序结构:在内存中选用一段连续的内存空间进行存储

                1,数据访问方便(O(1))

                2,插入和删除数据时需要移动大量数据

                3,需要进行预内存分配,即预先知道需要多少内存空间

                4,可能造成大量的内存碎片(零碎的内存空间,由于太小而无法被使用)

                        内存碎片:内内存碎片,例如结构体中补上的内存

                        外内存碎片:两端连续的内存空间之间的内存空间,经常出现在申请两段大的内存空间之间

        链式结构:可以在内存中选用一段非连续的内存空间进行存储

                1,数据访问时候必须要从头遍历(O(n))

                2,插入和删除元素方便

                3,不需要预内存分配,是一种动态存储的方式

        索引结构:将要存储的数据的关键字和存储位置之间构建一个索引表

        散列结构(哈希结构):将数据的存储位置与数据元素之间的关键字建立起对应的关系(哈希函数),并根据该关系进行数据存储和查找

单向链表的定义及其他操作

链表:存储数据的对象

        单向链表

data(数据域)
pnext(指针域,存储下一个元素的首地址)

                两个域组成在一起,称之为链表的结点,结点与结点之间通过指针的联系构成了单向链表,链表最后一个结点的指针域指向NULL,而第一个结点需要一个头节点来指向,而头节点还保存了链表的其他属性

        需要链表时应需要的步骤

        (1)创建链表对象(结构体)

        (2) 插入、删除、查找、修改数据

        (3)销毁链表

        例:结点

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

        链表对象(clen为节点个数)

struct link
{struct node * phead;int clen;
};

进行单向链表操作前,需要进行链表的定义,先在link.h中定义,并声明link.c中的函数

 

在link.c中创建,为了防止栈区被填满,所以申请堆区空间

        创建链表对象函数

        申请堆区空间,判断是否申请成功,初始化,返回链表对象的地址 

头插法,在头节点前插入新数据

        申请节点:申请新的堆区空间,判断是否申请成功

        初始化结点:将申请的结点初始化

        头插2步:先将新定义的结点指向原先的头节点,再将链表对象指向新的头节点,增加结点个数。其中两步不可颠倒,如果颠倒,则会导致头节点位置消失,无法找到头节点

遍历 

        定义指向头节点的指针ptmp,循环(当ptmp为空指针时终止),输出该结点的数据,将ptmp指向下一个结点 

        会倒着遍历出链表中的元素,因为采用的是头插法,所以先插入的在后,后插入的在前

查找

        在遍历的基础上删除输出并添加判断条件,并返回该值的地址,如果没有则返回空指针

修改

        在查找的基础上添加判断条件,并返回值来说明是否成功修改

头删

        第一个函数为判断是否为空链表,第二个函数为头删,判断是否为空链表, 定义新指针指向头节点,将链表对象指向第二个结点,释放新指针指向的旧头节点,节点数减一,成功删除则返回0

http://www.dtcms.com/a/313255.html

相关文章:

  • Kali基础知识点【1】
  • Pytorch-04 搭建神经网络架构工作流
  • TikTokShop-美国本土跨境-达人邀约_影刀RPA源码解读
  • 8.1.3 TiDB集群方案雨Replication原理
  • 关于逻辑回归的相关知识大全
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘scikit-learn’问题
  • 【AI】持久化聊天记忆(隔离对话)
  • ELECTRICAL靶机攻略
  • Linux驱动学习(四)字符设备
  • PyTorch生成式人工智能(24)——使用PyTorch构建Transformer模型
  • HBK公司核心产品和业务简析
  • 架构——异地多活成熟的架构模式
  • useSelector useDispatch
  • 高级开发 | 零人工干预的 @Value 实时刷新
  • 直流无刷电机(一)
  • ElementUI之使用以及表单验证
  • lumerical——锥形波导偏振转换
  • 第九章:了解特殊场景下的redis
  • 解决dify前端页面中公式显示的问题
  • 字典序最小的拼接字符串(贪心+全排列)详解
  • 数据分析—numpy库
  • Pytorch-03数据的Transform
  • 2106. 摘水果,梳理思路
  • 新手向:Python制作贪吃蛇游戏(Pygame)
  • Redis面试精讲 Day 9:Redis模块开发与扩展
  • 信创数据库-DM(达梦)数据库安装教程
  • Rust:如何访问 *.ini 配置文件?
  • 【项目日志|苍穹外卖】 Day1:项目环境搭建与架构设计
  • 反向代理+网关部署架构
  • Java学习第一百零二部分——API网关