数据结构之无头单向非循环链表

565-约瑟夫环问题(无头节点的单向循环链表) 约瑟夫环问题(无头节点的单向循环链表) 我们采用无头节点的单向循环链表解决约瑟夫环问题 假设k=1 , m=3 图中的1个数字代表着1个节点 我们采用双指针,初始化均指向第一个有效节点 因为单链表删除节点,用双指针方便 我们用p专门用来指向要删除的节点 q专门用来指向要删除的节点的前一个节点 但是现在比较尴尬的是,它没有头节点,所以一开始只能指向第一个有效节点 k=1的话,它们本身就在第一个元素上,从第一个元素开始报数,报道第3个, 现在我们要删除3这个节点,3出列。 然后p指向的是4节点,从1开始报 阅读详情

链表在数据结构中相当的重要,在以后的实际工作中使用率也很高,所以今天分享一些关于链表的基本操作:

1.链表的概念以及定义:

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,形式如下图所示:
在这里插入图片描述

typedef struct Node         //链表的定义
{
	int value;               //结点的数据域
	struct Node* next;       //结点的指针域
}Node;

2.无头单向非循环链表的一些基本操作:

1.链表的初始化
这里说一下为什么要使用二级指针,首先是定义一个指针指向首结点,因为链表的操作全程靠指针完成,凡是牵扯到首结点指针指向的改变都得用二级指针。

void SListInit(Node **ppFirst)
{
	*ppFirst = NULL;
}

2.销毁链表

void SListDestroy(Node *first)
{
	Node* ptr;                //定义ptr指针记录当前结点的下一个结点位置,然后再free当前结点
	for (Node* cur = first; cur != NULL; cur = ptr) //定义cur指针来操作链表,而不是直接使用头指针。
	{
		ptr = cur->next;
		free(cur);
	}
}

3.链表的头插

//头插不需要担心头指针为空的问题,因为这个方法一样适用
void SListPushFront(Node **ppFirst, int v)
{
		Node* node = (Node*)malloc(sizeof(Node));  //先为要插入的新结点申请空间
		node->next = *ppFirst;            
		*ppFirst = node;
		node->value = v;
}

4.链表的尾插

void SListPushBack(Node **ppFirst, int v)
{
	if (*ppFirst == NULL)      //头指针为空的话就相当于头插
	{
		Node* node = (Node*)malloc(sizeof(Node));
		node->next = *ppFirst;
		*ppFirst = node;
		node->value = v;
		return; 
	}
	//找到尾结点
	Node* cur = *ppFirst;
	while (cur->next != NULL){
		cur = cur->next;
	}

	Node* node = (Node*)malloc(sizeof(Node));
	node->next = NULL;           //这行和下面这行的代码顺序不能改变,否则会出错
	cur->next = node;
	node->value = v;
}

5.链表的头删

void SListPopFront(Node **ppFirst)
{
	assert(*ppFirst != NULL);       //首先判断是否为空
	Node* ptr = (*ppFirst)->next;   //首先定义指针ptr记录首结点的下一个结点的位置,然后再释放首结点,否则会导致后面的数据全部丢失
	free(*ppFirst);
	*ppFirst = ptr;
}

6.链表的尾删

void SListPopBack(Node **ppFirst)
{
	assert(*ppFirst != NULL);         
	if ((*ppFirst)->next == NULL)     //这是链表中只有一个结点的情况
	{
		free(*ppFirst);
		*ppFirst = NULL;
		return;
	}
	Node* ptr = *ppFirst;
	while (ptr->next->next!= NULL)     //找到倒数第二个结点
	{
		ptr = ptr->next;
	}
	free(ptr->next);    //先释放尾结点所占内存,否则会导致内存泄漏
	ptr->next = NULL;   //再让倒数第二个结点的next=NULL
}

7.查找数据为指定值的结点

Node * SListFind(Node* first, int v)
{
	for (Node* cur = first; cur != NULL; cur = cur->next) 
	{
		if (cur->value == v)
			return cur;
	}
}

8.在pos后插入一个结点

void SListInsertAfter(Node *pos, int v)
{
	Node* node = (Node*)malloc(sizeof(Node));
	node->value = v;
	node->next = pos->next;
	pos->next = node;
}

9.删除pos后的一个结点

void SListEraseAfter(Node *pos)
{
	Node* ptr = pos->next;              //定义一个指针ptr记录pos的下一个结点地址
	pos->next = pos->next->next;        //改变pos指针域,让pos和他后面的第二个结点相连
	free(ptr);                          //此时释放ptr
}

10.修改指定值的结点的值

void SListModify(Node *ppFirst,int u,int v)
{
	if (ppFirst == NULL)
	{
		return;
	}
	Node* ret = SListFind(ppFirst,u);
	if (ret != NULL)
	{
		if (u != v)
		{
			ret->value = v;
		}
		else
			return;
	}
	else
		return;
}

11.打印链表

void SLprint(Node* first)
{
	if (first == NULL)
	{
		return;
	}
	for (Node* cur = first; cur != NULL; cur = cur->next)
	{
		printf("%d ",cur->value);
	}
}

3.总结

将顺序表和链表做一个对比:
顺序表:
空间连续,支持随机访问且方便;但是中间或前面插入的时间复杂度为O(n),容量的代价比较大。
链表:
是以结点为单位存储,不支持随机访问,在任意位置插入删除时间复杂度O(1),没有增容问题,插入一个开辟一个空间,但是查找的时间复杂度就为O(n),对于不清楚总量的数据,空间利用率高。
链表和顺序表的使用场景还得因情况而定。

Python实现-无头单向非循环链表 无头单向非循环链表链表 无头单向非循环链表结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等 无头单向非循环链表 对于任意一个数据元素a(i)来说,储存本身的数据.(这个域叫数据域) 存储一个下一个(后继)数据元素的信息(Next)(这个域叫指针域) Python实现 class Node: def __init__(self, data): """ 初始化链表:data相当于链表的数据域,next相当于链表的指针 :param data:存储数据本身 """ 立即下载

相关推荐

<蓝桥杯软件赛>零基础备赛20周--第16周--GCD和LCM

gcd,lcm

罗勇军的博客 7604

单循环链表(不带表头)的C语言实现(详细)

单循环链表(不带表头)的C语言实现,非常详细

qq_983030560的博客 2538

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

weixin_28278377的博客 229

无头单向链表

链表的概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 结构示意图:由前一个链表中的指针指向下一个链表的地址,在逻辑上是连续的。 优点:1. 无头单向链表可以轻松地插入或删除链表的头部和尾部,因为它不需要像有头链表一样先找到头部节点。 2. 在某些情况下,无头单向链表可以在空间上更加高效,因为它不需要额外的头节点。

Ljiyu0506的博客 585

Intel SGX Explained

计算机中最主要的资源是CPU和内存,由操作系统和虚拟管理系统等系统软件来管理这些资源。

hanqdi_的博客 3456

在 Ubuntu 22.04 上配置 SonarQube 与 CI/CD 流水线实现自动化代码审查

本文详细介绍了在Ubuntu 22.04系统上配置SonarQube并与CI/CD流水线集成的完整流程,实现自动化代码审查。从环境准备、数据库配置到核心参数调优,再到与Jenkins和GitHub Actions的深度集成,提供了实战技巧和性能优化建议,帮助团队提升代码质量监控效率。

weixin_28829325的博客 260

C语言~无头链表,双向链表,双向循环链表

目录 无头链表: 双向链表: 双向循环链表: 无头链表: 头插: #include <stdio.h> #include <string.h> #include <stdlib.h> //使用二级指针方法 //无头链表:第一个节点存放数据 struct Node { int data; struct Node* next; }; //创建节点 struct Node* createNode(int data) { struct Node.

小杨的博客 1166

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

【数据结构】链表及无头单向非循环链表实现

顺序表的问题 顺序表与链表的比较 链表的概念、结构及分类 无头+单向+非循环链表实现 创建节点 头插数据头删数据 尾插 尾删 链表销毁 查找一个元素在pos之前插入在pos之后插入 删除pos位置 删除pos之后的位置

m0_64538862的博客 755

别再只会复制Haar级联代码了!OpenCV人脸检测全方案深度解析,从原理到工业级落地

通用预训练模型在你的业务场景效果不好时,用自己的业务数据集训练专属的级联器,是提升精度的终极方案,OpenCV自带和工具,支持自定义Haar/LBP级联器训练。场景首选方案次选方案新手入门学习Haar级联分类器LBP级联分类器嵌入式轻量固定场景LBP级联分类器YuNet轻量版工业级落地项目(99%场景)DNN+YuNetMTCNN多人脸+小目标复杂场景DNN+YuNet自定义微调模型同时做人脸+其他目标检测。

2601_94871597的博客 379

Python 爬虫实战:解析 JSON 数据爬取今日头条热点新闻(API 接口逆向与字段提取)

在当今信息爆炸的时代,新闻资讯的获取变得尤为重要。今日头条作为国内领先的新闻聚合平台,其热点新闻数据具有很高的价值。本文将详细介绍如何通过 Python 爬虫技术,逆向解析今日头条的 API 接口,提取并解析 JSON 数据,最终获取热点新闻信息。

yansideyucsdn的博客 3210

【用C实现数据结构】链表——无头单向非循环链表

【用C实现数据结构】链表——无头单向非循环链表。

Merrill_Rosie的博客 381

YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml

全网最详细的YOLOv5源码解读之配置文件yaml。逐行注释,逐句讲解,一文带你了解yaml。小白必看!

路人贾的博客 1万+

【数据结构】无头单向非循环链表

链表 首先我们来思考一个问题: 为什么要有链表这种结构呢? 上次我们写了顺序表, 其实本质上也就是一个数组, 它已经可以完成数据的存储和访问了, 但是它还存在一些不可避免的问题 1. 顺序表的中间和头部的插入删除的时间复杂度都是O(n), 复杂度太高 2. 增容的时候需要申请新的空间, 还要完成数据从旧空间到新空间的数据拷贝过程, 再释放旧空间, 消耗非常大 3. ...

卑微楽的开发之路 221

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[数据结构] 链表之一(胖黑)毁所有 (无头单向非循环链表实现)

​ 🍹欢迎各路大佬来到 Nick 主页指点 ☀️本期文章将学习 [数据结构] 链表之一(胖黑)毁所有 (无头单向非循环链表实现),我是博主Nick。✨ ✨我的博客主页:Nick_Bears 🌹꧔ꦿ 🌹꧔ꦿ博文内容如对您有所帮助,还请给个点赞 + 关注 + 收藏✨ ​

Nick 的笔记 513

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

[数据结构]----链表(无头单向非循环链表的实现)

链表(无头单向非循环链表的实现)

m0_68468727的博客 417

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据结构:无头单向非循环链表的实现(C语言)

数据结构:无头单向非循环链表的实现 先来看看单链表的结构图 单链表的结构非常简单,每个节点有两个区域组成一个是存放数据的数据域,即

qq_42613519的博客 294

数据结构--无头单向非循环链表的实现

无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构。 //写一个接口 public interface ILinked { //头插法 void addFirst(int data); //尾插法 void addLast(int data); //任意位置插入,第一个数据节点为0号下标 boolean add...

weixin_44397040的博客 152

数据结构——无头单向非循环链表的实现

文章目录一、什么是链表?1.链表的结构及概念2.链表的分类1.带头或者不带头2.单向或者双向3.循环或者非循环二、无头单向非循环的链表实现1.无头单向非循环链表的接口2.每个接口的具体实现总结 一、什么是链表? 1.链表的结构及概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 现实中的数据结构-----哈哈----可爱的小火车 重庆的轻轨: 2.链表的分类 我们注意上面

冯同学的博客 895

数据结构链表(无头单向非循环链表、带头双向循环链表)

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。 8种链表结构: 1、 单向、双向 2、带头、不带头 3、单链表、循环链表 以下是两种最常用的链表: 1、无头单向非循环链表 2、带头双向循环链表 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图的邻接表等等。另外这种结...

han_shi_lei的博客 636

温故而知新->数据结构->无头单向非循环链表->程序实现2_利用类

无头单向非循环链表 ~ 程序实现二 本篇博客的内容为利用 C++ 中的 类 对数据结构中的 顺序表 进行代码实现! 其中涉及了链表的 增(头插、尾插、任插)删(头删、尾删、任删)查(节点寻找)改(没写(~ ̄▽ ̄)~),销毁,打印等操作!并附带了实例以及对应的运行结果! 具体内容如下: (1)List.h #pragma once #include<iostream> using namespace std; #include<assert.h> typedef int LTData

m0_51961114的博客 472

【数据结构】单链表(无头单向非循环链表)各个接口的实现

顺序表存在的问题: 中间/头部的插入删除,时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗 增容一般是呈2倍的增长,势必会有一定的空间浪费。 例如当前容量为100,满了以后增容到200,如果再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。所以这时就引入了链表的概念,来解决这一系列问题。   链表的概念及结构 概念:链表...

qq_42270373的博客 289

【数据结构】链表之无头单向非循环链表

链表的特点是:物理地址不连续 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表 链表的结构:链表由数据域和指针域两部分组成,数据域是存储数据元素的部分,指针域一般指向下一个节点的指针。 链表的优点 在进行插入和删除操作时比较方便 链表的缺点 存储密度小,空间利用率低 要访问某特定元素,只能从链表开头进行遍历 头结点的作用 为了保持和后面结点的设计算法一致,保持算法的高效性 链表共...

田怼怼的博客 310

温故而知新->数据结构->无头单向非循环链表->程序实现1_利用结构体

无头单向非循环链表 ~ 程序实现一 本篇博客的内容为利用 C语言 中的 结构体 对数据结构中的 无头单向非循环链表 进行代码实现! 其中涉及了链表的 增(头插、尾插、任插)删(头删、尾删、任删)查(节点寻找)改(没写(~ ̄▽ ̄)~),销毁,打印等操作!并附带了实例以及对应的运行结果! 具体内容如下 (1)list.h #ifndef __LIST_H__ #define __LIST_H__ typedef int LDataType; //定义节点:数据 + 指针 typedef struct li

m0_51961114的博客 274

【数据结构】无头单向非循环链表的实现

无头单向非循环链表的特点:不带头结点,只有next指针,不循环 SList.h #ifndef __SLIST_H__ #define __SLIST_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;assert.h&gt; #include...

ly_6699的博客 261
上一篇: 数据结构之顺序表
下一篇: linux实现一个简易的minishell
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值