双向链表的复杂操作、内核链表、栈

ops/2024/9/23 11:13:20/

双向链表的复杂操作

一、插入

1、头插法

int HeadInsertDouList(LinkNode *pHead, DataType TmpData)
{LinkNode *pNewNode = NULL;pNewNode = malloc(sizeof(LinkNode));if (NULL == pNewNode){return -1;}pNewNode->Data = TmpData;pNewNode->pNext = pHead->pNext;pNewNode->pPre = pHead;pHead->pNext = pNewNode;if (pNewNode->pNext != NULL){pNewNode->pNext->pPre = pNewNode;}return 0;
}

2、尾插法

int TailInsertDouList(LinkNode *pHead, DataType TmpData)
{LinkNode *pLastNode = NULL;LinkNode *pTmpNode = NULL;pLastNode = pHead;while (pLastNode->pNext != NULL){pLastNode = pLastNode->pNext;}pTmpNode = malloc(sizeof(LinkNode));if (NULL == pTmpNode){return -1;}pTmpNode->Data = TmpData;pTmpNode->pNext = NULL;pTmpNode->pPre = pLastNode;pLastNode->pNext = pTmpNode;return 0;
}

二、删除

int DeleteDouList(LinkNode *pHead, DataType TmpData)
{LinkNode *pTmpNode = NULL;LinkNode *pNextNode = NULL;int cnt = 0;pTmpNode = pHead->pNext;while (pTmpNode != NULL){if (pTmpNode->Data == TmpData){pNextNode = pTmpNode->pNext;pTmpNode->pPre->pNext = pTmpNode->pNext;if (pTmpNode->pNext != NULL){pTmpNode->pNext->pPre = pTmpNode->pPre;}      free(pTmpNode);pTmpNode = pNextNode;cnt++;}else {pTmpNode = pTmpNode->pNext;}}return cnt;
}

其余的一些操作,比如正向遍历,反向遍历,查找,替换,销毁的代码与单向链表没有什么区别 

内核链表

一、插入

1、头插法

list_add (struct list_head *new, struct list_head *head)
{new->prev = head;new->next = head->next;new->prev->next = new;new->next->prev = new;
}

2、尾插法

list_add_tail (struct list_head *new, struct list_head *head)
{new->next = head;new->prev = head->prev;new->prev->next = new;new->next->prev = new;
}

二、删除 

list_del (struct list_head *old)
{old->prev->next = old->next;old->next->prev = old->prev;old->next = (void *)0xbabebabe;old->prev = (void *)0xcafecafe;
}

三、遍历 

#define list_for_each(pos, head)                                        \for (pos = (head)->next; pos != (head); pos = pos->next)

栈 

一、原则

FILO:先进后出,后进先出 


二、概念

1、栈顶:允许入栈出栈的一端称为栈顶
2、栈底:不允许入栈和出栈的一端称为栈底
3、入栈(压栈):将数据元素放入栈顶
4、出栈(弹栈):将数据元素从栈顶位置取出

三、分类

1、空增栈
2、空减栈
3、满增栈
4、满减栈

栈的基本操作也都可以通过内核链表实现


http://www.ppmy.cn/ops/104448.html

相关文章

Java算法之冒泡排序(Bubble Sort)

冒泡排序简介 冒泡排序是一种基础的排序算法,以其简单性和直观性而著称。它通过重复遍历待排序的数列,比较每对相邻元素,并在必要时交换它们的位置,从而实现排序。 算法原理 冒泡排序的基本思想是:通过重复遍历整个…

Three.js湖边小屋,包含gltf渲染、天空和水纹、光照阴影、运动的点光源、相机位置和文字切屏、粒子效果等

前期准备 使用vue3vitethree.jsgsap 开发 npm install three gsap 代码 <script setup> // 导入three.js import * as THREE from three; // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js; // 加载模型 import { GLT…

systemverilog中的DPI-C用例介绍

文章目录 前言一、dpi_longint二、dpi_packed_array三、dpi_structure四、相关参考总结 前言 本文主要基于VCS内置的三个关于DPI-C的使用用例&#xff0c;记录一下DPI-C的使用方法。测试用例的路径为$VCS_HOME/doc/examples/testbench/sv/。测试用例包括&#xff1a;dpi_longi…

python学习11-Pytorch环境安装与模型搭建

先查看下自己的电脑是否是英伟达显卡 如果不是就需要租用平台了,如 AutoDL算力云 https://www.autodl.com/home CUDA 当涉及到深度学习和 Python 时&#xff0c;CUDA 是一个非常重要的概念&#xff0c;它是 NVIDIA 开发的并行计算平台和应用程序编程接口&#xff08;API&am…

【国考】特值法

特值法 题干中存在乘除关系&#xff0c;且对应量未知。 例3&#xff1a;甲、乙、丙三个工程队的效率比为6&#xff1a;5&#xff1a;4,现将A、B两项工作量相同的工程交给这三个工程队,甲队负责A工程,乙队负责B工程,丙队参与A工程若干天后转而参与B工程.两项工程同时开工,耗时16…

无人机遥控器工作原理!!!

一、基本组成 无人机遥控器通常由发射端&#xff08;遥控器本体&#xff09;和接收端&#xff08;安装在无人机上的接收模块&#xff09;两部分组成。发射端包含控制杆、按钮、显示屏等物理控件&#xff0c;用于输入控制指令&#xff1b;接收端则负责接收来自发射端的无线电信…

[数据集][目标检测]玻璃瓶塑料瓶检测数据集VOC+YOLO格式8943张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8943 标注数量(xml文件个数)&#xff1a;8943 标注数量(txt文件个数)&#xff1a;8943 标注…

您应该让 ChatGPT 控制您的浏览器吗?

本文: 介绍授予大型语言模型 (LLM) 对 Web 浏览器的控制权的安全风险,重点关注提示注入漏洞。 通过两种场景演示了使用 Taxy AI(一种代表性概念验证浏览器代理)的利用,攻击者设法劫持代理并 (1) 从用户邮箱中窃取机密信息,(2) 强制合并 GitHub 存储库上的恶意拉取请求。 …