单链表基本操作详解

单链表详解:定义、基本操作与逆序合并实践 在数据结构体系中,线性表是最基础的数据组织方式,而单链表正是线性表链式存储的核心实现。与依赖连续内存的数组不同,单链表通过结点中的指针域将离散的内存单元串联起来,从而在插入、删除操作中展现出更高的灵活性,同时支持按需分配内存,避免扩容带来的性能损耗。正是这种特性,使单链表成为理解指针/引用、内存管理和算法设计的基石,也是求职面试、考研与 LeetCode 链表类题目的高频考点。从带头结点与不带头结点的区别,到头插法、尾插法创建,再到按值删除、按位序插入、遍历查找等典型操作,都是工程中封装链表组件、实现 LR 阅读详情

#  单链表



文中提到的内容的链接一并列在这里:

单链表详细分析的博客链接:http://blog.youkuaiyun.com/bitboss/article/details/51586293







@ 昨天用6个小时将单链表初步成型,那么说好的高质版就在今天完成!


@ 首先,因为前面实现过顺序表,就先来说说顺序表和单链表的区别吧!(画图功底太差,本篇无插图)

@ 顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,一个顺序表在使用前必须指定起长度,一旦分配内 存,则在使用中不可以动态的更改。他的优点是访问数据是比 较方便,可以随即的访问表中的任何一个数据。

@ 链表是通过指针来描述元素关系的一种数据结构,他可以是物理地址不连续的物理空间。不能随即访问链表元素, 必须从表头开始,一步一步搜索元素。它的优点是:对于数 组,可以动态的改变数据的长度,分配物理空间。

@ 在使用中:如果一个数组在使用中,查询比较多,而插入,删除数据比较少,数组的长度不变时,选顺序表比较合 理。如果插入,删除,长度不定的数组,可以选链表。


# 我在这篇文章将函数功能一个一个列出来单独说明,最后将全部综合在一起列出来;

先将自定义的头文件包含一些函数的声明列出来,还有主函数包含测试部分,请先看这部分,方便理解后面的内容!

代码中包含部分注释!!!

@ “LinkList.h”

#define  _CRT_SECURE_NO_WARNINGS 1//消除scanf的警告!

#ifndef __LINKLIST_H__//防止头文件的重定义
#define __LINKLIST_H__

//将所有引入的头文件都放到自定义的头文件中即可!
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DataType;//将int重命名,方便修改,如果元素是char只需要将int改为char;

enum Select//将所有选项用枚举表现出来,方便阅读;很有必要的操作,增强代码的可读性;
{
	EXIT,
	INSERT,
	PRINT,
	REMOVE,
	REMOVEALL,
	SEARCH,
	SORT,
	PUSHF,
	PUSHB,
	POPF,
	POPB,
	DOSTORY,
	EASER,

	
};

typedef struct LinkNode
{
	DataType data;
	struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体

typedef struct LinkList//将头指针单独封装一个结构体方便使用!
{
	LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表


void InitLinkList(pLinkList pList);//初始化列表
void PrintList(pLinkList pList);//打印
void DostoryList(pLinkList pList);//free链表

void PopBack(pLinkList pList);//尾删
void PopFront(pLinkList pList);//头删
void PushBack(pLinkList pList,DataType x);//尾插
void PushFront(pLinkList pList,DataType x);//头插
void Insert(pLinkList pList,pLinkNode pos,DataType x);//指定位置前或者后插入元素


pLinkNode Find(pLinkList pList,DataType x);//查找
void Search(pLinkList pList,DataType x);//查找指定元素;


void Remove(pLinkList pList,DataType x);//删除指定元素
void RemoveAll(pLinkList pList,DataType x);//删除所有出现的指定元素
void Erase(pLinkList pList,pLinkNode pos);//删除指定位置的元素
void BubbleSort(pLinkList pList);//冒泡排序链表元素
void Exit(pLinkList pList);

#endif //__LINKLIST_H__

@ test.c

#include"LinkList.h"

//注意:请仔细阅读自定义头文件"LinkList.h"的内容!!!

//打印菜单这个,主要看自己喜好,设计的好看一点总是没问题的;
//注意的是你每次进行选择一个操作前都要打印一次菜单!

void Print()
{
	printf("\n————————————————————\n");
	printf("***************************************\n");
	printf("**** 0.退出                      ******\n");
	printf("**** 1. 插入元素                 ******\n");
	printf("**** 2. 打印链表                 ******\n");
	printf("**** 3. 删除指定元素             ******\n");
	printf("**** 4. 删除所有出现的指定元素   ******\n");
	printf("**** 5. 查找                     ******\n");
	printf("**** 6. 排序                     ******\n");
	printf("**** 7. 头插                     ******\n");
	printf("**** 8. 尾插                     ******\n");
	printf("**** 9. 头删                     ******\n");
	printf("**** 10. 尾删                    ******\n");
	printf("**** 11. 释放链表              
数据结构-单链表基本操作带图完整详解 1.什么是链表 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指 针链接次序实现的。 2.为什么要使用链表 在未学习链表时,我们常用的存储数据的方式无非就是数组。使用数组存储数据的好处就是查询快,但是它的弊端也很明显: 1.使用前需声明数组的长度,一旦声明长度就不能更改 2.插入和删除操作需要移动大量的数组元素,效率慢 3. 只能存储一种类型的数据 顺序表就是在计算机中内存以数组的形式保存的线性表,因此这些弊端同理 而链表则可以实现以上这些数组所不具备的功 阅读详情

相关推荐

单链表基本操作超全详解与实战

抽象数据类型(Abstract Data Type, ADT)是对数据及其操作的高度概括,强调“做什么”而非“怎么做”。对于单链表而言,ADT 应涵盖初始化、插入、删除、查找、遍历等核心操作,并提供一致的接口规范。单链表作为基础线性结构,其性能表现直接影响上层算法设计决策。以下是各项常见操作的复杂度汇总:操作类型最好情况平均情况最坏情况空间复杂度说明访问第i个元素O(1)O(n)O(n)O(1)不支持随机访问头部插入。

weixin_29859471的博客 915

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

别再手动算临界转速了!用ANSYS Workbench 2023 R2快速搞定转子坎贝尔图(附完整APDL命令流)

本文详细介绍了如何利用ANSYS Workbench 2023 R2快速生成转子坎贝尔图,实现全自动临界转速分析。通过对比传统手动计算与Workbench自动化流程的效率差异,展示了其在旋转机械设计中的革命性优势,包括大幅缩短分析周期、提升精度至98.7%。文章还提供了完整的APDL命令流和实战案例,帮助工程师快速掌握这一高效工具。

weixin_42699679的博客 471

暑期实习前端面试笔试总结汇总

腾讯2020暑期实习——前端视频面试(1)回顾 腾讯2020暑期实习——前端视频面试(2)回顾 腾讯2020暑期实习——前端视频面试(3)回顾 腾讯2020暑期实习——前端视频面试(4)回顾 蘑菇街2020暑期实习——前端视频面试回顾 二、笔试 奇安信前端实习笔试总结 vivo笔试(2020年3月8日) ...

明媚 3065

RedHat 9 替换yum源镜像

引言:我们个人通常使用的红帽系统yum源是需要注册付费的,所以在使用yum源安装一些软件时无法正常安装(例如:MySQL),这时我们就需要将yum源替换为CentOS对应的源,以实现在红帽系统中正常安装软件。

YUJIAOZHU666的博客 3738

Arduino与Proteus仿真实例-HG7881(L9110)驱动直流电机仿真

HG7881(L9110)驱动直流电机仿真 HG7881 (L9110) 双通道电机驱动器模块。 HG7881 (L9110) 是一款紧凑型电机驱动芯片,支持 2.5-12V 电压范围,800mA 连续电流。 这些芯片具有内置输出钳位二极管以保护敏感的微控制器电子设备。 它们适用于非常小的机器人项目。 每个 HG7881 (L9110) 芯片都能够使用两个数字控制输入驱动单个直流电机。 一个输入用于选择电机方向,而另一个用于控制电机速度。 速度是通过使用 PWM 脉冲宽度调制来控制的。 电机驱动器通常具有

视觉与物联智能 3049

pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]‘ is not a valid editable requirement解决方案

本文主要介绍了pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]’ is not a valid editable requirement解决方案,希望能对使用markitdown的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 2万+

【AI智能体】QClaw 对接GitHub处理自动化任务实战操作详解

QClaw 对接GitHub处理自动化任务实战操作详解

congge 4869

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

STM32F407中文手册

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 单链表
下一篇: 位运算之只出现一次的的数字
John__xs
博客等级 码龄11年 499粉丝 112原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值