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

数据结构——单链表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.lryc.cn/news/604933.html

相关文章:

  • jmeter读取上游接口并遍历数组数据并进行压测
  • Vulnhub靶场:ica1
  • 【网络运维】 Linux:使用 Cockpit 管理服务器
  • IO复用实现并发服务器
  • 2025年7月技术问答第6期
  • 无人机入门--个人笔记
  • 电力设施通道防外破防异物实时监控预警装置的核心功能是什么
  • C 语言与 C++、Java、Python 等编程语言的区别
  • 国产音频DA转换芯片DP7361支持192K六通道24位DA转换器
  • Android RTMP推送|轻量级RTSP服务同屏实践:屏幕+音频+录像全链路落地方案
  • 工业计算机ARM-如何实现工业数字化升级EC100!
  • 论文阅读|NeurIPS 2024|Mamba进一步研究|MSVMamba
  • 原生微信小程序实现语音转文字搜索---同声传译
  • NAT技术与代理服务
  • SNR-Aware Low-light Image Enhancement 论文阅读
  • 【网络工程师软考版】路由协议 + ACL
  • 15、点云<—>深度图转换原理
  • rabbitmq--默认模式(点对点)
  • 【深度学习新浪潮】3D城市建筑多样化生产的研发进展调研
  • vulhub-Thales靶机练习
  • STL学习(?、常用的算数算法和集合算法)
  • SAP-ABAP:SAP ABAP OpenSQL JOIN 操作权威指南高效关联多表数据
  • xxljob-快速上手
  • 亚马逊云科技:赋能企业数字化转型,解决实际发展难题
  • 【7】串口编程三种模式(查询/中断/DMA)韦东山老师学习笔记(课程听不懂的话试着来看看我的学习笔记吧)
  • 飞算科技:原创技术重塑 Java 开发,引领行业数智化新浪潮
  • Power Pivot 数据分析表达式(DAX)
  • 制造业企业大文件传输的痛点有哪些?
  • SpringBoot 整合 自定义MongoDB
  • C语言:逆序输出0到9的数组元素