day 18 数据结构单链表(头插/删,尾插/删)

一、数据结构基础概念

程序=数据结构+算法。

数据结构:数据的结构数据 = 元素之间的关系 = 数据的组织方式。

算法 = 数据元素之间的相互作用的操作(运算)。

1.数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别并输入给计算机处理的符号集合。

2.数据对象:性质相同的数据元素的集合。

3.数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。

4.数据项是数据不可分割的最小单位。

数据结构研究的是数据元素之间的关系。

二、数据结构分为逻辑结构和物理结构。

逻辑关系:逻辑上存在一种联系;物理结构(关系):存储到计算机中的结构。

逻辑结构:数据元素之间无关联的集合。

线性结构(特点:除了第一个元素和最后一个元素之外其余元素素都只有一个前驱和后继);

树:目录层次结构一对多关系;

图:地图地点---图的结构多对多关系。

物理结构:指存储方式,如顺序存储(数组)和链式存储(指针)。

计算机本身的存储结构-------线性。

计算机的线性存储空间中表示不同的逻辑机构。

存储结构:

顺序结构:用一片连续的内存空间存放数据。对应到c语言数组 (单一性,有序性,连续性)----- 数据结构-------顺序表。 

特点:访问数据方便 O(1),插入删除不方便O(n)。

链式结构:通过指针指向下一个元素。也可以用来表示一种线性关系彼此联系起来  eg:铁链   

 特点:访问数据需要遍历O(n),插入删除方便O(1)。

索引结构:找---【索引表(有序)】-----数据    eg:查字典,书目录。

散列(哈希)结构:找(key)------【散列结构(无序)】------计算在哪里。

算法5个基本特性:输入,输出,有穷性,确定性和可行性。

设计算法:正确性,健壮性,可读性,时间和空间效率。

算法效率的度量:

时间复杂度(更重要):时间复杂度用于衡量算法执行时间随输入规模增长的变化趋势。常见的表示方法为大O符号(O),描述最坏情况下算法的增长上限。(最好,最坏,平均)

空间复杂度:空间复杂度用于衡量算法在运行过程中临时占用存储空间的大小随输入规模增长的变化趋势。同样使用大O符号表示。

非原地插入排序O(n);原地插入排序O(1);

三、学习数据结构

线性表:顺序表---以顺序结构存储的线性表(数组);链表----以链式结构存储的线性表。

链表:

1.数据元素-----节点{数据---数据域    联系-----指针域}

头节点------数据部分不关心-----只是为了方便操作链表,链表---都是有头链表

尾节点的指针域为空NULL;

2.代码的实现:创建(增删改查),销毁。

链表:1.创建空列表2.销毁链表3.增数据--插入4.删数据---删除;5.查数据---找值;6.改数据----改值

//结构体 struct node { int data;//要处理的数据是int类型的数据 struct node*pnext://指向下一个节点 }

数据插入到链表:

1.头插法

step1.创建了一个新节点并且给值
step2.新节点指向原先首节点
            p_new->pnextt=phead->pnext
step3.将头节点指向新节点
            phead->pnextt=p_new;
#include <stdio.h> #include <stdlib.h> typedef int date_t; typedef struct node { date_t date; struct node *pnext; }node_t; node_t *create_linklist(void) { node_t *head = malloc(sizeof(node_t));//在堆上开空间不用传参不会自动销毁 if(head == NULL) { printf("malloc fail"); return NULL; } head->pnext = NULL;//头节点指针域为空 return head; } void linklist_insert_head(node_t *phead,date_t date) //插入一个新的节点 { node_t *p_new = malloc(sizeof(node_t)); //创建新节点 if(head == NULL) //开空间可能失败 { printf("malloc fail"); return NULL; } p_new->date = date; //传入数据 p_new->pnext = NULL; //指针域给空(可写可不写) //连接链表 p_new->pnext = phead->pnext; //插入,指向头节点所指的指针域 phead->pnext = p_new; //头节点指向新节点 } int is_empty(node_t *phead) //判断链表是否为空 { return phead->pnext == NULL; } int length(node_t *phead) { if(is_empty(phead) == 1) { return 0; } int i = 0; node_t *p = phead->pnext; while(p!=NULL) { i++; p = p->pnext; } return i; } void linklist_print(node_t *phead) //打印链表 { if(is_empty(phead) == 1) { printf("empty linklist\n"); return; } node_t *p = phead->pnext; //头节点之后的节点指针域 while(p!=NULL) { printf("%d ",p->date); //打印数据域 p = p->pnext; //指向链表下一个指针域 } putchar('\n'); } int main() { node_t *phead = create_linklist(); linklist_insert_head(phead,4); linklist_insert_head(phead,3); linklist_insert_head(phead,2); linklist_insert_head(phead,1); linklist_print(phead); int i = length(phead); printf("i = %d ",i); return 0; }

查----遍历---打印

遍历打印逐个节点访问:

step1.指针遍历p ;  p->pnext != NULL //后面还有节点继续往后

2.尾插法

stepl.创建了一个新节点并且给值

        p_new->pnextt=NULL;

step2.找到尾节点p初始位置就从头节点开始判断p的指针域是否为NULL

        p->pnext  != NULL

step3.链接

        p->pnextt=p_new
void linklist_insert_tail(node_t *phead,date_t date) { node_t *p_new = malloc(sizeof(node_t)); if(p_new == NULL) //判断链表是不是空 { printf("%smalloc fail\n",__func__); return; } p_new->date = date; p_new->pnext = NULL;//必须有 node_t *p = phead; while(p->pnext != NULL) { p = p->pnext; } p->pnext = p_new; //连接 } 

找值:从头遍历

node_t * linklist_find_key(node_t *phead,date_t key) { if(is_empty(phead) == 1) { return NULL; } node_t *p = phead->pnext; while(p != NULL) { if(p->date == key) { return p; } p = p->pnext; } return NULL; } 

3.删除:头删,尾删

头删

//判断链表是否为空

step1.有一个指针变量指向首节点phead->pnext

step2.让头节点指向p->pnext

step3.释放p所在的节点free(p);
void linklist_delete_head(node_t *phead) { if(is_empty(phead) == 1) { return; } node_t *p = phead->pnext; phead->pnext = p->pnext; free(p); }

尾删

//判断链表是否为空--空直接返回

s1.找到尾节点前一个节点

        //统一操作逻辑p的初值得从phead开始

        p->pnext->pnext == NULL

s2.释放尾节点 free(p->pnext)

s3.将前一个节点,设置为新的尾节点 p->pnext=NULL
void linklist_delete_tail(node_t *phead) { if(is_empty(phead) == 1) { printf("empty linklist\n"); return; } node_t *p = phead; while(p->pnext->pnext != NULL) { p = p->pnext; } free(p->pnext); p->pnext = NULL; }

Read more

Unity游戏开发深度解析:从零基础到高级架构的完整实战指南

Unity游戏开发深度解析:从零基础到高级架构的完整实战指南

🌟 Hello,我是蒋星熠Jaxonic! 🌈 在浩瀚无垠的技术宇宙中,我是一名执着的星际旅人,用代码绘制探索的轨迹。 🚀 每一个算法都是我点燃的推进器,每一行代码都是我航行的星图。 🔭 每一次性能优化都是我的天文望远镜,每一次架构设计都是我的引力弹弓。 🎻 在数字世界的协奏曲中,我既是作曲家也是首席乐手。让我们携手,在二进制星河中谱写属于极客的壮丽诗篇! 摘要 Unity的魅力不仅在于其直观的可视化编辑器和强大的跨平台能力,更在于它为开发者提供了一个完整的生态系统。无论你是想要开发2D像素风格的独立游戏,还是要构建3D AAA级别的大型项目,Unity都能为你提供相应的解决方案。在我的开发历程中,我曾用Unity开发过移动端的休闲游戏、PC端的策略游戏,甚至还涉足了VR和AR应用的开发,每一次的项目经历都让我对Unity有了更深层次的理解。 特别值得一提的是Unity的组件化架构设计,这种设计理念不仅让游戏对象的管理变得更加灵活,也为代码的复用和维护提供了极大的便利。通过合理的组件设计和脚本编写,我们可以构建出高度模块化的游戏系统,这对于大型项目的团队协作尤为重要。

By Ne0inhk
详解RabbitMQ高级特性之延迟插件的安装和使用

详解RabbitMQ高级特性之延迟插件的安装和使用

目录 延迟队列插件 延迟队列插件的下载 延迟队列插件的安装  延迟队列插件的启用 编辑 添加配置 常量类 声明队列和交换机并绑定二者关系 编写生产消息代码 编写消费消息代码 观察效果 面试题 延迟队列插件 RabbitMQ官⽅也提供了⼀个延迟的插件来实现延迟的功能。 延迟队列插件的下载 插件下载链接---》链接 根据⾃⼰的RabbitMQ版本选择相应版本的延迟插件, 下载后上传到服务器。 查看RabbitMQ版本的命令 rabbitmqctl status | grep "RabbitMQ"  /usr/lib/rabbitmq/plugins 是⼀个附加⽬录, RabbitMQ包本⾝不会在此安装任何内容, 如果 没有这个路径, 可以⾃⼰进⾏创建。 延迟队列插件的安装  把下载好的 .ez文件上传到   /usr/lib/rabbitmq/

By Ne0inhk
Flutter 组件 smart_arg 适配鸿蒙 HarmonyOS 实战:智能命令行解析,构建高效开发者工具链与运维指令控制架构

Flutter 组件 smart_arg 适配鸿蒙 HarmonyOS 实战:智能命令行解析,构建高效开发者工具链与运维指令控制架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 smart_arg 适配鸿蒙 HarmonyOS 实战:智能命令行解析,构建高效开发者工具链与运维指令控制架构 前言 在鸿蒙(OpenHarmony)生态迈向工业自动化、边缘计算节点运维及开发者工具(Tooling)共建的背景下,如何为 Dart/Flutter 编写的工具脚本实现直观、健壮且具备强类型校验的命令行(CLI)参数解析,已成为提升开发与运维效率的“生产力基石”。在鸿蒙设备这类涉及大量无界面(Headless)守护进程调试与远程 SSH 控制的环境下,如果工具依然依赖基础的 List<String> 手动位置偏移解析,由于由于指令组合繁杂或参数类型误配,极易由于由于“指令注入”或默认值缺失导致关键运维任务的异常中断。 我们需要一种能够通过注解定义、支持强类型属性映射且具备自动化 Help 文档生成的智能化参数治理方案。 smart_

By Ne0inhk
企业级在线文档:ONLYOFFICE 核心优势深度解读与测评体验

企业级在线文档:ONLYOFFICE 核心优势深度解读与测评体验

在当今数字化转型的浪潮中,企业的办公模式正在经历从“单机作业”到“云端协同”的深刻变革。尤其是在混合办公、跨地域协作日益普遍的今天,寻找一款既能打破信息孤岛、提高团队协作效率,又能严格保障企业核心商业数据安全的文档处理引擎,成为了每一个 IT 架构师和企业决策者的核心诉求。 我们在评估过市面上众多协作工具后,最终将目光锁定在了 ONLYOFFICE 上。作为一款开源且功能强大的企业级在线文档套件,ONLYOFFICE 在实际业务场景中展现出了令人惊艳的稳定性和功能深度。今天,我就根据自己在企业内部署和试用 ONLYOFFICE 的第一手经验,从实时协作、数据安全、多设备支持等维度,深度解读它的核心优势,看看它是如何真正为企业降本增效的。 🚀 协同即生产力:极简且强大的实时协作体验 在企业日常运营中,最耗费精力的事情莫过于多部门共同编写同一份项目企划书或合并多张财务报表。传统模式下,文件需要在微信、邮件里丢来丢去,不仅版本极其容易混乱,沟通成本也高得惊人。而 ONLYOFFICE 作为一款企业级在线文档工具,完美地解决了这个痛点。 ONLYOFFICE 提供了两种非常贴合企业

By Ne0inhk