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

【数据结构】手搓链表

一、定义

typedef struct node_s
{int _data;struct node_s *_next;
} node_t;typedef struct list_s
{node_t *_head;node_t *_tail;
} list_t;
  1. 节点结构体(node_s)

    • int _data;存储节点中的数据
    • struct node_s *_next;:指向 node_s 类型的指针,用来指向链表中的下一个节点
  2. 链表结构体(list_s)

    • node_t *_head;:这是一个指向 node_s 类型的指针,用来指向链表的第一个节点,即头节点。如果链表为空,那么 _head 应该指向 NULL
    • node_t *_tail;:这是一个指向 node_s 类型的指针,用来指向链表的最后一个节点,即尾节点。如果链表为空,那么 _tail 也应该指向 NULL

链表的结构图如下:

初始化:

头尾结点指针均置为空

void init(list_t *l)
{l->_head = NULL;l->_tail = NULL;
}

 二、插入

1、头插法

由于函数需要更改pHead的指向,而pHead是指向Head结点的指针类型为node_t *,所以函数需要传入pHead的地址即:node_t **二级指针,如图所示传入ppHead和ppTail

  • 若链表为空,则头尾指针均指向新节点
  • 若不为空,则新结点与pHead指向相同,即指向Head,再将pHead前移

void headInsert(node_t **ppHead, node_t **ppTail, int data)
{node_t *pNew = (node_t *)malloc(sizeof(node_t));bzero(pNew, sizeof(node_t));pNew->_data = data;if (*ppHead == NULL){*ppHead = pNew;*ppTail = pNew;}else{pNew->_next = *ppHead;*ppHead = pNew;}
}

2、尾插法

参数与头插法相同

  • 若链表为空,则头尾指针均指向新节点
  • 若不为空,则pTail指向的Tail结点的_next指向新节点,再将pTail后移
void tailInsert(node_t **ppHead, node_t **ppTail, int data)
{node_t *pNew = (node_t *)malloc(sizeof(node_t));bzero(pNew, sizeof(node_t));pNew->_data = data;if (*ppHead == NULL){*ppHead = pNew;*ppTail = pNew;}else{(*ppTail)->_next = pNew;*ppTail = pNew;}
}

三、遍历

void visit(node_t *pHead)
{node_t *pCur = pHead;while (pCur){printf("%d ", (*pCur)._data);pCur = pCur->_next;}printf("\n");
}

四、测试

1、头插法

list_t list;
init(&list);
for (int i = 0; i < 10; i++)
{headInsert(&list._head, &list._tail, i);visit(list._head);
}

运行结果: 

2、尾插法

list_t list;
init(&list);
for (int i = 0; i < 10; i++)
{tailInsert(&list._head, &list._tail, i);visit(list._head);
}
return 0;

运行结果: 

五、使用C++对其封装

class List
{
public:List();~List();void push_back(int data);void push_front(int data);void visit();private:typedef struct node_s{int _data;struct node_s *_next;} node_t;node_t *_pHead;node_t *_pTail;
};
List::List()
{_pHead = nullptr;_pTail = nullptr;
}
List::~List()
{node_t *pCur = _pHead;node_t *temp = nullptr;while (pCur){temp = pCur;pCur = pCur->_next;delete temp;temp = nullptr;}
}
void List::push_back(int data)
{node_t *pNew = new node_t();pNew->_data = data;pNew->_next = nullptr;if (_pHead == nullptr){_pHead = pNew;_pTail = pNew;}else{pNew->_next = _pHead;_pHead = pNew;}
}
void List::push_front(int data)
{node_t *pNew = new node_t();pNew->_data = data;pNew->_next = nullptr;if (_pHead == nullptr){_pHead = pNew;_pTail = pNew;}else{_pTail->_next = pNew;_pTail = pNew;}
}
void List::visit()
{node_t *pCur = _pHead;while (pCur){std::cout << (*pCur)._data << " ";pCur = pCur->_next;}std::cout << "\n";
}

相关文章:

【数据结构】手搓链表

一、定义 typedef struct node_s {int _data;struct node_s *_next; } node_t;typedef struct list_s {node_t *_head;node_t *_tail; } list_t;节点结构体&#xff08;node_s&#xff09;&#xff1a; int _data;存储节点中的数据struct node_s *_next;&#xff1a;指向 node…...

ThinkPHP场景动态验证

一、缘由 今天在用thinkphp8写东西的时候发现&#xff0c;写验证器规则和场景优点费时间&#xff0c;就算用tinkphp的命令行生成也是生成一个空壳。内容还是要自己填写感觉麻烦。 就突发奇想能不能自动生成验证器&#xff0c;也不能是说自动生成验证器&#xff0c;生成验证其的…...

在M3上面搭建一套lnmp环境

下载docker-desktop 官网下载docker-desktop 切换镜像源 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docke…...

【C++笔记】二叉搜索树

前言 各位读者朋友们大家好&#xff01;上期我们讲完了面向对象编程三大属性之一的多态&#xff0c;这一期我们再次开始数据结构二叉搜索树的讲解。 目录 前言一. 二叉搜索树的概念二. 二叉搜索树的性能分析三. 二叉搜索树的插入四. 二叉搜索树的查找五. 二叉搜索树的删除六.…...

Fork/Join框架简介

一、Fork/Join框架简介 Fork/Join框架是Java 7引入的一个用于并行执行任务的框架&#xff0c;它可以将一个大任务分割成若干个小任务&#xff0c;并行执行这些小任务&#xff0c;然后将每个小任务的结果合并起来&#xff0c;得到大任务的结果。这种框架特别适合于能够被递归分…...

Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…...

Mysql读写分离分库分表

读写分离 什么是读写分离 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话&#xff0c;就能够小幅提升写性能&#xff0c;大幅提升读性能。一般情况下&#xff0c;我们都会选择一主多从&#xff0c;也就是一台主数据库负责写&#xff0c;其他的从…...

B站狂神说--springboot项目学习(新建一个springboot项目)

文章目录 1.新建项目java8项目1.解决自带的idea2024无法使用java8的问题 2.新建接口3.项目打包为jar包4.使用jar包 1.新建项目java8项目 1.解决自带的idea2024无法使用java8的问题 将server.url修改为阿里云的地址&#xff1a;https://start.aliyun.com/ 选择Spring Web 创建…...

eltable el-table 横向 滚动条常显

又遇到了难受的问题&#xff0c;el-table嵌入在一个div里面&#xff0c;结果因为内容太多,横向、纵向我都得滚动查看&#xff01; 结果发现横向滚动时只能让它纵向触底后才能进行横向操作&#xff0c;这就很变态&#xff0c;明显不符合用户操作习惯。如下图&#xff1a; 要先纵…...

centos8 mysql 主从复制

原理 一、一主一从 准备工作 1.主库配置 1、修改配置文件 /etc/my.cnf #mysql 服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;取值范围:1-232-1&#xff0c;默认为 server-id1 #是否只读,1 代表只读,0代表读写 read-only0 #忽略的数据,指不需要同步的数据库 #binlog…...

【C++】入门【五】

本节目标 一、C/C内存分布 二、C语言中动态内存管理方式 三、C中动态内存管理 四、operator new与operator delete函数 五、new和delete的实现原理 六、定位new表达式(placement-new) 七、常见面试题 一、C/C内存分布 一个程序占用的内存主要有以下几部分栈区&#xff08;stac…...

【React】二、状态变量useState

文章目录 1、React中的事件绑定1.1 基础事件绑定1.2 使用事件对象参数1.3 传递自定义参数1.4 同时传递事件对象和自定义参数 2、React中的组件3、useState 1、React中的事件绑定 1.1 基础事件绑定 语法&#xff1a;on 事件名称 { 事件处理程序 }&#xff0c;整体上遵循驼峰…...

SQL Server中的数据处理函数:提升SQL查询能力

文章目录 前言1. 数据类型转换函数CAST()CONVERT()TRY_CAST() 和 TRY_CONVERT() 2. 数学函数ABS()CEILING()FLOOR()ROUND()POWER()SQRT() 3. 日期和时间函数GETDATE()SYSDATETIME()DATEADD()DATEDIFF()YEAR()、MONTH() 和 DAY()FORMAT() 4. 条件处理函数CASEIIF() 总结 前言 在…...

TypeScript 语言学习入门级教程五

在前面的教程中&#xff0c;我们已经逐步深入地学习了 TypeScript 的诸多特性&#xff0c;包括基础语法、类型系统、面向对象编程、装饰器以及一些高级类型等。在本教程中&#xff0c;我们将聚焦于 TypeScript 的模块系统、命名空间与模块的关系、声明文件以及如何在实际项目中…...

上海市计算机学会竞赛平台2022年7月月赛丙组匹配括号(三)

题目描述 如果字符序列仅由 ( 与 ) 构成&#xff0c;则在满足以下条件时&#xff0c;它是匹配的&#xff1a; 空序列是匹配的&#xff1b;如果括号序列 s 是匹配的&#xff0c;那么 (s) 也是匹配的&#xff1b;如果括号序列 s 与 t 是匹配的&#xff0c;那么 st 也是匹配的。…...

108.【C语言】数据结构之二叉树查找值为x的节点

目录 1.题目 代码模板 2.分析 分类讨论各种情况 大概的框架 关键部分(继续递归)的详解 递归调用展开图 3.测试结果 其他写法 4.结论 5.注意事项 不推荐的写法 1.题目 查找值为x的节点并返回节点的地址 代码模板 typedef int BTDataType; typedef struct BinaryT…...

Java学习笔记(10)--面向对象基础

学习资料来自黑马程序员 目录 设计对象并使用 类和对象 定义类 创建类的对象 使用对象 类的几个补充注意事项 设计对象并使用 类和对象 类&#xff08;设计图&#xff09;&#xff1a;是对象共同特征的描述。 对象&#xff1a;是真实存在的具体东西。 在Java中必须先…...

社群分享在商业引流与职业转型中的作用:开源 AI 智能名片 2+1 链动模式小程序的应用契机

摘要&#xff1a;本文聚焦于社群分享在商业领域的重要性&#xff0c;阐述其作为干货诱饵在引流方面的关键意义。详细探讨了提供有价值干货的多种方式&#xff0c;包括文字分享、问题解答以及直播分享等&#xff0c;并分析了直播分享所需的条件。同时&#xff0c;以自身经历为例…...

nodejs官方文档学习-笔记-1

一、异步工作 process.nextTick()&#xff1a; 回调会在当前操作完成后立即执行&#xff0c;但在事件循环进入下一个阶段之前。它是最先执行的。 Promise.then()&#xff1a; 回调会在 microtask 队列中执行&#xff0c;通常是在当前操作完成后&#xff0c;但在事件循环进入…...

android视频播放器之DKVideoPlayer

一个老牌子的播放器了&#xff0c;项目可能已经有些日子没有维护了。但是使用效果还是不错的。支持多种视频格式&#xff0c;及重力感应、调节亮度等多种效果。想来想去&#xff0c;还是记录下来&#xff0c;我会在文章的最后注明github地址&#xff1a; 首先引入依赖&#xff…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...