数据结构——单链表1

1. 单链表

1.1 概念与结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

1.1.1 结点

  • 与顺序表不同的是,链表里的每节都是独立申请下来的空间,我们称之为“节点/结点”
  • 节点的组成部分主要有两个部分组成:当前节点要保存的数据(数据域)和保存下一个节点的地址(指针域)
  • 链表中每个节点都是独立申请的,(需要插入数据时才去申请一块节点的空间),需要指针变量来保存下一个节点的位置才可以从当前的节点找到下一个节点。

1.1.2 链表的性质

  • 链表结构在逻辑上时连续的,在物理结构上不一定是连续的
  • 节点一般是从堆上申请的
  • 从堆上申请来的空间,是按照一定的策略来分配的,每次申请的空间可能是连续的,也可能是不连续的

每个节点对应的结构体代码:

typedef int SLTDataType;
//定义链表节点的结构
typedef struct SListNode
{SLTDataType  data;       //节点数据struct SListNode* next;  //下一个节点的地址
}SLTNode;

1.1.3 链表的打印

//单链表的打印
void SLTPrint(SLTNode* phead) {SLTNode* pcur = phead;while (pcur){printf("%d -> ",pcur->data);pcur = pcur->next;}printf("NULL\n");
}

1.2 实现单链表

SList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//定义单链表就是定义节点,因为单链表是由节点组成的,所以定义单链表就是定义节点
typedef int SLTDataType;
//定义链表节点的结构
typedef struct SListNode
{SLTDataType  data;struct SListNode* next;
}SLTNode;//单链表的打印
void SLTPrint(SLTNode* phead);//单链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);//单链表的头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);//单链表的尾删
void SLTPopBack(SLTNode** pphead);
SList.c
#include"SList.h"//单链表的打印
void SLTPrint(SLTNode* phead) {SLTNode* pcur = phead;while (pcur != NULL){printf("%d -> ",pcur->data);pcur = pcur->next;}printf("NULL\n");
}//新节点的申请
SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));//申请新节点这里传的应该是节点类型而不是数据类型//单链表:每次插入一个节点时,需要分配一个节点(结构体)的内存,因此使用 `sizeof(节点类型)`。//顺序表:在扩容时,需要为多个数据元素分配一块连续的内存(即数组),因此使用 `元素个数 * sizeof(数据类型)`。if (node == NULL){perror("malloc fail!\n");exit(1);}node->data= x;node->next = NULL;return node;
}//单链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x) {//单链表为空assert(pphead);//SLTNode* Tail = *pphead; 不能在这里定义Tail 因为这里的Tail为空,后面循环中的Tail->next 就会报错,不会进入循环当中SLTNode* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else {//单链表不为空,找尾节点,插入新节点SLTNode* Tail = *pphead;while (Tail->next != NULL){Tail = Tail->next;}//跳出循环,插入新节点Tail->next = newnode;//newnode->next = NULL; 不需要写是因为,newnode在初始化的时候就已经置为NULL了}
}//单链表的头插
void SLTPushFront(SLTNode** pphead, SLTDataType x) 
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead;*pphead = newnode;
}//单链表尾删
void SLTPopBack(SLTNode** pphead)
{assert(pphead);//只有一个节点的情况if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}SLTNode* Tail = *pphead;SLTNode* prev = NULL;while (Tail->next){prev = Tail;Tail = Tail->next;}//跳出循环prev->next = NULL;free(Tail);Tail = NULL;
}

后续还有其它的单链表的实现哦~~~

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

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

相关文章

STM32CubeMX + HAL库:基于DHT11温湿度监测实现

1. 概述1.1 实验目的本实验旨在利用 DHT11 温湿度传感器&#xff0c;每隔 5 秒采集一次环境的温度与湿度数据&#xff0c;并通过串口将数据循环打印输出。所使用的 DHT11 模块硬件结构简单&#xff0c;包含三个接口引脚&#xff1a;电源正极&#xff08;VCC&#xff09;、电源负…

常见排序的特性总结

目录 1.排序的稳定性 2.直接插入排序的特性总结 3.希尔排序的特性总结 4.直接选择排序的特性总结 5.堆排序的特性总结 6.冒泡排序的特性总结 7.快速排序的特性总结 8.归并排序的特性总结 9.计数排序的特性总结 10.总结 1.排序的稳定性 排序的稳定性是说 相同大小的元…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-49,(知识点:OSI模型,物理层、数据链路层、网络层)

目录 1、题目 2、解答 OSI 七层模型的分层及功能&#xff08;从下到上&#xff09; 1. 物理层&#xff08;Physical Layer&#xff09; &#xff1a;网卡的物理接口、网线、光纤、集线器 2. 数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;交换机&#xf…

R 环境安装指南

R 环境安装指南 引言 R 是一种针对统计计算和图形表示的编程语言和软件环境。它广泛应用于数据分析和统计建模领域。本指南旨在为用户提供一个清晰、详细的 R 环境安装步骤,确保用户能够顺利地开始使用 R 进行数据分析。 安装前的准备 在开始安装 R 之前,请确保您的计算机…

Cesium entity跟随第一人称视角

1.跟随视角let firstView:any; const firstPerspective (entity: any) > {firstView () > {let curTime window.viewer.clock.currentTime;const pos entity.position.getValue(curTime);const orientation entity.orientation.getValue(curTime);if (pos &&…

传输层协议UDP与TCP

目录 一. UDP 1.1 UDP协议段格式 1.2 UDP传输的特点 1.3 面向数据报 1.4 UDP缓冲区 1.5 报文的理解 二. TCP 2.1 TCP协议段格式 2.2 确认应答机制&#xff08;ACK&#xff09; 2.3 超时重传机制 2.4 连接管理机制 为什么要三次握手&#xff1f; 三次&#xff1f;四…

SringBoot入门

文章目录SpringBoot入门一、关于&#xff1a;约定大于配置二、创建SpringBoot项目---起步案例创建SpringBoot项目案例创建项目方式2&#xff1a;通过aliyun网站创建创建项目方式3---基于官方地址创建三、配置项目项目结构自定义配置四、SpringBoot原理&#xff08;重点&#xf…

ansible 版本升级

1. 服务器上查看对应ansible 可安装的版本 yum info ansible 对比官网,服务器对应ansible 版本比较地址,不利于了解新版本的属性。 2. 升级比较新的ansible 版本,安装epel-release wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm rpm -iv…

企业微信API接口发消息实战:从0到1的技术突破之旅

摘要&#xff1a;本文详细介绍了通过企业微信官方API接口实现消息发送功能的完整实战流程。首先阐述了企业微信API在数字化办公中的重要性&#xff0c;重点讲解了消息发送接口的应用场景。实战部分分为前期准备、开发环境搭建和具体实现三个环节&#xff0c;包括创建企业微信应…

Linux的小程序——进度条

为了写出这个小程序我们先来了解几个知识点(一)回车和换行先以写作文为例子了解一下&#xff0c;当在一行中写了一半&#xff0c;由此处位置往下一行的操作叫做换行&#xff0c;回到该行的开头位置为回车。而在c语言中\n帮我们完成了换行和回车两个动作&#xff0c;那单纯回车是…

在macOS上使用VS Code和Clang配置C++开发环境

本文基于VS Code官方文档&#xff0c;详细介绍如何在macOS系统下配置Clang/LLVM编译器与VS Code的C开发环境。通过本文&#xff0c;你将学会如何搭建开发环境、创建并调试C程序&#xff0c;适合C初学者和需要在macOS上进行C开发的开发者。 前提条件 在开始配置前&#xff0c;…

Ganttable 基于工时的进度分析

时间进度分析是 Ganttable 提供的高级进度管理功能&#xff0c;它基于实际工作时长&#xff0c;结合计划预估工时&#xff0c;可精准计算项目及任务的完成度。开启进度分析开启进度分析功能的操作如下&#xff1a;在时间管理页面&#xff0c;点击右上角的 “设置” 按钮&#x…

duiLib 自定义资源目录

前面的demo&#xff0c;把布局文件放在默认目录了&#xff0c;想着应该也可以自定义资源路径。先debug看下默认目录是什么路径。设置调试选项&#xff0c;调试信息格式改为程序数据库&#xff08;/Zi&#xff09;再调试项目&#xff0c;选中监视1&#xff1a;在监护窗口中查看变…

YOLO-01目标检测基础

1、概念目标检测&#xff08;Object Detection&#xff09;是计算机视觉中的一个重要领域&#xff0c;它涉及到识别图片或视频某一帧中的物体是什么类别&#xff0c;并确定它们的位置。通常用于多个物体的识别&#xff0c;可以同时处理图像中的多个实例&#xff0c;并为每个实例…

Linux->动静态库

目录 引入&#xff1a; 一&#xff1a;动静态库的介绍 1&#xff1a;库的本质 2&#xff1a;库的类别及优缺点 3&#xff1a;动态链接 4&#xff1a;静态链接 二&#xff1a;头文件和库的查找 三&#xff1a;静态库的制作和使用 1&#xff1a;制作 2&#xff1a;指令打…

【LY88】双系统指南及避坑

一. Windows重装&#xff08;前提是Windows可正常使用&#xff0c;优点是无需U盘&#xff09; 1. PE工具和系统镜像 机械师只只提供的资源链接 完成微PE工具的安装并下载了系统镜像之后&#xff0c;&#xff08;如果要装ubuntu的话&#xff09;需确认磁盘分区格式和引导项。前…

Ubuntu22.04.1搭建php运行环境

步骤 1: 更新你的系统 首先&#xff0c;确保你的系统是最新的。打开终端并运行以下命令&#xff1a; sudo apt update sudo apt upgrade步骤 2: 安装Apache Web服务器 使用Apache作为你的Web服务器。运行以下命令&#xff1a; sudo apt install apache2安装完成后&#xff0c;你…

防止飞书重复回调通知分布式锁

## 场景销售订单下&#xff0c;明细25明细款&#xff0c;发起飞书审批&#xff0c;飞书设置自动审核通过&#xff0c;导致会收到两次审核通过通知加了分布式锁 &#xff0c;仍导致执行业务执行两遍了String lockKey "feihsu-approvalNotify:" instanceCode; RLock …

数据结构:下三角矩阵(Lower Triangular Matrix)

目录 什么是下三角矩阵&#xff1f; 我们要存哪些元素&#xff1f;一共几个&#xff1f; 推导索引映射公式 核心问题&#xff1a;给定 (i,j)&#xff0c;如何计算 k&#xff1f; 什么是下三角矩阵&#xff1f; 一个 n n 的矩阵&#xff0c;如果它在主对角线以上的所有元…

力扣209:长度最小的子数组

力扣209:长度最小的子数组题目思路代码题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回…