单链表的数据结构和基本操作

2023-11-16

链表是一种线性结构,在存储数据时,在逻辑上是连续的,但是在物理空间上并不连续。

一个链表的结点由两个部分组成,分别是数据域和指针域。

而单链表就是它的每一个结点,除了记录元素的数据外,只记录其直接后继结点的地址。
在这里插入图片描述
单链表由两种实现方法:

  • 头结点实现
  • 头指针实现

头结点单链表的基本操作

头结点单链表的数据结构

typedef int ElemType;

typedef struct Node {
	ElemType data; 
	struct Node *next;
}HeadList;

头结点的初始化

头结点的初始化只需把头结点的next指针域置空即可。

void InitHeadList(HeadList* head) 
{ 
	if (head == NULL) exit(0);
	head->next = NULL; 
}

插入新结点

在这里插入图片描述
单链表插入新结点的逻辑如上图。
先找到插入位置的前一个结点p,然后申请一个新结点,然后就是:

  1. s->next = p ->next;
  2. p->next = s;
    需要注意:这两步先后顺序不可改变。

头插法插入新结点

思路:

  1. 申请一个新结点,并把新结点的next指针指向头结点的后继节点
  2. 最后把头结点的next指针指向新结点
  3. 插入成功
bool InsertOFHead(HeadList* head, ElemType val) 
{ 
	if (head == NULL) exit(0); 
	if (pos < 0) return false; 
	HeadList* newNode = ApplyNode(val, head->next); 
	if (newNode == NULL) return false; 
	head->next = newNode; 
	return true; 
}

尾插法插入新结点

思路:

  1. 先声明一个结点类型的指针p指向头结点
  2. 把p指针后置,一直到指向最后一个结点,也就是p所指向的结点的后继为空
  3. 申请一个新结点并把指针域置空,把p的后继指向新结点
  4. 插入成功
bool InsertOFTail(HeadList* head, ElemType val) 
{ 
	if (head == NULL) exit(0);
	HeadList* p = head; 
	while (p->next != NULL) p = p->next; 
	p->next = ApplyNode(val, NULL); 
	return true; 
}

按位置插入新结点

思路:

  1. 先声明一个结点类型的指针p指向头结点
  2. p向后迭代,迭代的过程中,迭代一次插入的位置也随之减1
  3. 如果p为空,则插入的位置大于链表的长度,插入失败
  4. 如果插入的位置存在,申请一个新结点,新结点的指针域指向p的next指向的结点
  5. 把p的next指针指向新结点
  6. 插入成功
bool InsertOFPos(HeadList* head, ElemType val, int pos) 
{ 
	if (head == NULL) exit(0); 
	if (pos < 0) return false; 
	HeadList* p = head; 
	while (pos && p != NULL) 
	{ 
		pos--; p = p->next; 
	}
	if (p == NULL) return false; 
	HeadList* newNode = ApplyNode(val, p->next); 
	if (newNode == NULL) return false; 
	p->next = newNode; return true; 
}

删除节点

在这里插入图片描述
单链表删除新结点的逻辑如上图。
先找到删除节点的前一个结点p的位置,q为要删除的结点,然后把p->next = q->next;,然后释放删除的结点即可完成删除。

头删

思路:

  1. 声明一个结点类型的指针q,q指向头结点next指向的结点
  2. 把头结点的next域指向q指向结点的next域
  3. 释放q指向的结点
  4. 删除成功
bool DeleteOFPos(HeadList* head) 
{ 
	if (head == NULL) exit(0); 
	HeadList *q = head->next; 
	head->next = q->next; 
	free(q); 
	return true; 
} 

尾删

思路:

  1. 声明两个指针p、q,p指向头结点,q指向头结点的下一个结点
  2. 把p和q一起迭代,直到q的next为空
  3. 把p的next置空
  4. 释放q
  5. 删除完成
bool DeleteOFTail(HeadList * head) 
{ 
	if (head == NULL) exit(0); 
	if (head->next == NULL) return false; 
	HeadList * p = head, *q = head->next; 
	while (q->next != NULL) 
	{ 
		p = q; 
		q = q->next; 
	}
	p->next = NULL; 
	free(q); 
	return true;
}

按位置删

思路:

  1. 先声明一个结点类型的指针p指向头结点
  2. p向后迭代,迭代的过程中,迭代一次插入的位置也随之减1
  3. 迭代结束如果p的next为空,删除位置没有元素,删除失败
  4. 如果删除的位置存在元素,声明一个结点类型的指针q指向删除位置的元素
  5. 把p->next = q->next;
  6. 释放q指向的结点
  7. 删除完成
bool DeleteOFPos(HeadList* head, int pos) 
{ 
	if (head == NULL) exit(0); 
	HeadList * p = head; 
	while (pos && p->next != NULL) 
	{ 
		pos--; 
		p = p->next; 
	} 
	if (p->next == NULL) return false; 
	HeadList * q = p->next; 
	p->next = q->next; 
	free(q); 
	return true; 
} 

头指针单链表的基本操作

头指针单链表的实现和头结点单链表的实现几乎一致。
和头结点单链表实现的区别: 插入时为空链的特殊处理和删除第一个结点的特殊处理。

实现代码

带头结点单链表的C语言代码实现

头指针单链表的C语言代码实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表的数据结构和基本操作 的相关文章

  • 详解JavaScript中的Event Loop(事件循环)机制

    转载 javascript从诞生之日起就是一门单线程的非阻塞的脚本语言 单线程意味着 javascript代码在执行的任何时候 都只有一个主线程来处理所有的任务 而非阻塞则是当代码需要进行一项异步任务 无法立刻返回结果 需要花一定时间才能返

随机推荐

  • nginx下载并安装

    一 nginx简介 什么是 nginx 和可以做什么事情 Nginx 是高性能的 HTTP 和反向代理的web服务器 处理高并发能力是十分强大的 能经受高负 载的考验 有报告表明能支持高达 50 000 个并发连接数 其特点是占有内存少 并
  • python 贪吃蛇小游戏代码

    usr bin python coding UTF 8 作者 黄哥 链接 https www zhihu com question 55873159 answer 146647646 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权
  • 再见!微软官宣放弃Mac 版 Visual Studio IDE

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 5 分钟 来自 撰稿丨千山 对于Visual Studio 只要是开发者 或多或少都接触过 发布于1997年的Visual Studio标志着微软第一次将这么多开发工
  • 关系代数之专门的关系运算(选择、投影)

    选择 选择运算是从指定的关系中选出满足给定条件 用逻辑表达式表达 的元组而组成一个新的关系 进行选择运算的对象是 一个关系当中某一个属性的值 选择运算是将一张表当中的某一属性进行筛选 比如 将性别 sex 这列当中性别为女的元组筛选出来组成
  • constraint的一些用法总结

    主要就是增加约束的 以下几种约束 并 一一列举 1 主键约束 要对一个列加主键约束的话 这列就必须要满足的条件就是分空 因为主键约束 就是对一个列进行了约束 约束为 非空 不重复 以下是代码 要对一个列加主键 列名为id 表名为emp 格式
  • 刷脸支付:双12刷脸支付5折省翻天,政策持续补贴预热双十二

    刷脸支付成潮流 三家巨头争江山 刷脸支付的使用场景正在深入拓展 进入每一个与人民生活息息相关的行业 在政府综合政务 社会公交运输 商超营销运营 酒店景区服务等各方面都出现了刷脸支付的身影 我们能够看到 科技是在进步的 社会是在进步的 二维码
  • Caffe2——cifar10数据集创建lmdb或leveldb类型的数据

    cifar10数据集和mnist数据集存储方式不同 cifar10数据集把标签和图像数据以bin文件的方式存放在同一个文件内 这种存放方式使得每个子cifar数据bin文件的结构相同 所以cifar转换数据代码比mnist的代码更加的模块化
  • Vue项目提示 doesn‘t work properly without JavaScript enabled. Please enable it to continue

    由于本地是用docker部署了一套微服务 为了避免跨越问题 前端使用的nginx配置转发后端路径 访问返回状态时200 但是在response返回We re sorry but doesn t work properly without J
  • 「雕爷学编程」Arduino动手做(37)——MQ-3乙醇易燃气酒精传感器模块

    37款传感器与模块的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止37种的 鉴于本人手头积累了一些传感器和模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手试试做实验 不管成功与否 都
  • Android studio心得——fragment动态加载

    前言 在Android应用程序中 Fragment是一种可以嵌入Activity中的组件 通过 Fragment 我们可以将UI 目录 前言 一 什么是Android Studio 二 简介Fragment 三 学期知识汇总 四 什么是碎片
  • C++类与对象--static修饰符

    C 类与对象 static修饰符 1 类静态数据成员的定义及初始化 1 1 声明 1 2 初始化 1 3 调用 1 4 案例 1 5 小结 2 类静态成员函数的定义 2 1 声明 2 2 调用 2 3 案例 2 4 小结 3 static
  • 数据库字段类型

    太长时间没有操作数据库 收集了部分有用的资料 一 创建数据表 CREATE TABLE mytable id VARCHAR 4 NOT NULL name VARCHAR 10 sex CHAR 1 createtime DATE age
  • ROS系统

    参考 https blog csdn net qq 28087491 article details 119053810 https www bilibili com video BV1zt411G7Vn spm id from 333 3
  • 静态网页怎样实现动态交互?-JavaScript

    在Html基础上 javascript能够开发交互式web网页 javascript的出现使得网页和用户之间实现了一种实时性的 动态的 交互性的关系 javascript短小精悍 又是在客户机上执行的 大大提高了网页的浏览速度和交互能力 同
  • Python高级培训第三次作业

    任务 作业 import threading 导入threading库 import time 导入time库 class Get time object 创建类Get time 用于获取当前时间 def init self each ti
  • “msg“:“Request method ‘GET‘ not supported“,“code“:500原因及解决

    GetMapping add parentId 这里的路径纠错 漏 了 controller 缺少add的保存方法 GetMapping add parentId 及其以下 Html出现错误 如下图
  • B树及其基本操作、B+树的基本概念

    B树及其基本操作 B 树的基本概念 1 B树 B 树的基本概念 1 B树的基本概念及性质 2 B 树的基本概念及性质 2 B树与B 树的区别 3 B树的基本操作 1 B树的查找 2 B树的插入 3 B树的删除 1 B树 B 树的基本概念 1
  • SpringBoot集成海康设备网络SDK

    文章目录 SDK介绍 概述 功能 下载 对接指南 集成 初始化项目 初始化SDK 初始化SDK概述 新建AppRunner 新建SdkInitService 新建InitSdkTask 新建 HCNetSDK 调用业务接口 部署 拷贝so库
  • 解决鼠标右击菜单的新建中没有“文本文档”的问题

    解决鼠标右击菜单的新建中没有 文本文档 的问题 原创 丶无殇 2022 2 12 注意 博主测试平台为WIN10系统 其他系统不保证一定可以 一 问题现象 在桌面右击打开新建菜单时没有文本文档这个选项 二 问题原因 有以下可能 安装某个软件
  • 单链表的数据结构和基本操作

    单链表的基本操作 头结点单链表的基本操作 头结点单链表的数据结构 头结点的初始化 插入新结点 头插法插入新结点 尾插法插入新结点 按位置插入新结点 删除节点 头删 尾删 按位置删 头指针单链表的基本操作 实现代码 链表是一种线性结构 在存储