【零基础学数据结构】双向链表

1.双向链表的概念

1.1头节点 

 1.2带头双向循环链表

注意: 哨兵位创建后,首尾连接自己

1.3双链表的初始化

// 双向链表的初始化
void ListInit(ListNode** pphead)
{
	// 给双链表创建一个哨兵位
	*pphead = ListBuyNode(-1);
}

2.双向链表的打印 

// 双向链表的打印
void ListPrint(ListNode* phead)
{
	// 遍历链表
	ListNode* pcur = phead->next;
	while (pcur != phead)
	{
		// 打印
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("\n");
}

 3.双向链表的尾插 

// 双向链表的尾插
void ListPushBack(ListNode* phead, ListDatatype x)
{
	// 创建一个存放数据的新节点
	ListNode* newnode = ListBuyNode(x);

	// 进行尾插
	// 新节点连接
	newnode->prev = phead->prev;
	newnode->next = phead;

	// 改变原来链表的连接
	phead->prev->next = newnode;
	phead->prev = newnode;
}

4.双向链表的头插 

void ListPushFront(ListNode* phead, ListDatatype x)
{
	// 创建一个存放数据的新节点
	ListNode* newnode = ListBuyNode(x);

	// 进行头插
	// 新节点连接
	newnode->prev = phead;
	newnode->next = phead->next;

	// 改变原来链表的连接
	phead->next->prev = newnode;
	phead->next = newnode;
}

5.双向链表的尾删 

void ListPopBack(ListNode* phead)
{
	assert(phead && phead->next != phead);

	// 进行尾删除
	ListNode* del = phead->prev;
	del->prev->next = del->next; 
	del->next->prev = del->prev;

	// 释放空间
	free(del);
	del = NULL;
}

6.双向链表的头删 

void ListPopFront(ListNode* phead)
{
	assert(phead && phead->next != phead);

	// 进行头删除
	ListNode* del = phead->next;
	del->next->prev = phead;
	phead->next = del->next;

	// 释放空间
	free(del);
	del = NULL;
}

7.双向链表的查找  

ListNode* ListFind(ListNode* phead, ListDatatype x)
{
	// 遍历双向链表
	ListNode* pcur = phead->next;
	while (pcur != phead)
	{
		// 打印
		if (pcur->data == x)
		{
			return pcur;
		}
		pcur = pcur->next;
	}

	// 没有找到
	return NULL;
}

 8.双向链表在pos位置之后插入 

void ListInsret(ListNode* pos, ListDatatype x)
{
	assert(pos);

	// 创建一个存放数据的新节点
	ListNode* newnode = ListBuyNode(x);

	// 插入
	// 新节点连接
	newnode->prev = pos;
	newnode->next = pos->next;

	// 原链表连接
	pos->next->prev = newnode;
	pos->next = newnode;
}

9.双向链表删除pos节点 

void ListErase(ListNode* pos)
{
	//pos理论上来说不能为phead,但是没有参数phead,无法增加校验
	assert(pos);

	pos->prev->next = pos->next;
	pos->next->prev = pos->prev;

	free(pos);
	pos = NULL;
}

 10.双向链表的销毁

void ListDesTroy(ListNode* phead)
{
	assert(phead);

	// 遍历删除
	ListNode* pcur = phead->next;
	while (pcur != phead)
	{
		ListNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	//此时pcur指向phead,而phead还没有被销毁
	free(phead);
	phead = NULL;
	printf("销毁成功!");
}

 测试文件:

#include "List.h"

void ListNodetext()
{
	ListNode* plist;
	ListInit(&plist);

	// 测试尾插
	ListPushBack(plist, 1);
	/*ListPrint(plist);*/
	ListPushBack(plist, 2);
	/*ListPrint(plist);*/
	ListPushBack(plist, 3);
	ListPrint(plist); // 1->2->3->

	// 测试头插
	//ListPushFront(plist, 6);
	//ListPrint(plist);
	//ListPushFront(plist, 7);
	//ListPrint(plist);
	//ListPushFront(plist, 8);
	//ListPrint(plist);

	// 测试尾删
	//ListPopBack(plist);
	//ListPrint(plist);
	//ListPopBack(plist);
	//ListPrint(plist);
	//ListPopBack(plist);
	//ListPrint(plist);

	// 测试头删
	//ListPopFront(plist);
	//ListPrint(plist);
	//ListPopFront(plist);
	//ListPrint(plist);
	//ListPopFront(plist);
	//ListPrint(plist);

	// 测试查找
	//ListNode* find = ListFind(plist, 30);
	//if (find == NULL)
	//{
	//	printf("没有找到!");
	//}
	//else
	//{
	//	printf("找到了!");
	//}

	// 测试pos位置之后插入
	//ListNode* find = ListFind(plist, 2);
	//ListInsret(find, 5);
	//ListPrint(plist);

	// 测试删除pos节点
	//ListNode* find = ListFind(plist, 3);
	//ListErase(find);
	//find = NULL;
	//ListPrint(plist);

	ListDesTroy(plist);
	plist = NULL;
}

int main()
{
	ListNodetext();
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/541152.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qlik在数据隐私计划中利用人工智能和分析

在技术快速变革的时代,政府正在努力追赶技术发展和我们日常生活中产生的个人身份信息(“PII”)数量不断增加的步伐。规范 PII 使用的隐私法不断加强(Gartner估计,虽然到 2020 年,全面的隐私法将覆盖全球 10…

2024年广东省网络系统管理样题第1套网络搭建部分

2024年广东省职业院校技能大赛样题1 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书,赛题,解析等资料,知识点培训服务 添加博主wx:liuliu5488233 网络系统管理赛项 模块A:网络…

Unity给地图物体添加对撞机

在项目/Assets下创建Prefabs文件夹 选择素材拖入层级下,注意此时地图素材有可能看不到,此时选择Tilemap在检查器中修改图层顺序调至最低。 添加对撞机 选择素材,在检查器中点击添加组件Box Collider 2D,将素材拖入Prefabs文件下…

C++ - 二叉搜索树的基本实现

目录 0. 引言 1. 二叉搜索树 1.1 定义 1.2 特点 2. 二叉搜索树的实现 2.1 基本框架 2.2 查找 2.3 插入 2.4 删除 2.4.1 右子树为空 2.4.2 左子树为空 2.4.3 左右都不为空 2.4.4 代码 0. 引言 在C语言数据结构中,我们已经基本了解过二叉树&#xff…

04异常Lambda算法正则

异常 异常是什么? 异常是代码在编译或者执行的过程中可能出现的错误。避免异常的出现,同时处理可能出现的异常,让代码更稳健。 异常分为几类? 编译时异常、运行时异常。编译时异常:没有继承RuntimeExcpetion的异常…

GB/T 28181标准中的错误码,国标28181中可能出现的SIP协议相关的错误码及其含义

目录 一、GB/T 28181标准介绍 (一)概述 (二)关键内容和特点 1. 系统架构: 2. 设备接入: 3. 网络通信: 4. 业务功能: 5. 安全保护: 6. 平台管理: &a…

MATLAB 构建协方差矩阵,解算特征值和特征向量(63)

MATLAB 局部点云构建协方差矩阵,解算特征值和特征向量(63) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 对于某片有待分析的点云,我们希望构建协方差矩阵,计算特征值和特征向量,这是很多算法必要的分析方法,这里提供完整的计算代码(验证正确) !!! 特别需要注意…

03-JAVA设计模式-责任链模式

责任链模式 什么是责任链模式 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许你将请求沿着处理者链进行传递。每个处理者均对请求进行某些处理,并可决定是否将请求沿着链传递下去。这种模式给予请求的处理…

使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景,博主所在的业务组有一个核心系统,需要同步两个不同数据源给过来的数据到redis中,但是每次同步之前需要过滤掉一部分数据,只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

Windows 关闭占用指定端口的进程

以下示例以443端口为例,具体哪个端口视自己情况而定 输入命令 # 输出的最后一列就是进程号pid netstat -ano | findstr "443" 找出占用443端口的进程号(pid)(第二列是你本机的应用占用的端口,看第二列就行)如下图&am…

面向电力行业定制安全云工作站解决方案,麒麟信安出席2024年电力企业信创替代技术研讨会

日前,由中国电子企业协会主办的“2024年电力企业信创替代技术研讨会”在江苏南京正式召开。会议以国家推进实现自主可控、加快建设“数字中国”为大背景,聚焦电力企业紧抓“信创替代”机遇,通过安全可靠的软硬件迭代升级,实现企业…

算法打卡day39|动态规划篇07| Leetcode 70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数

算法题 Leetcode 70. 爬楼梯&#xff08;进阶版&#xff09; 题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 输入描述…

初始Linux(上)

目录 Linux的发展史UNIX发展史Linux的发展史 Linux下的基本命令ls指令pwd命令cd指令touch指令mkdir指令rmdir指令和rm指令man指令cp指令mv指令cat指令 总结 Linux的发展史 UNIX发展史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名…

从0到1实现RPC | 12 限流

在服务提供者provider端添加限流逻辑 限流&#xff1a;指定时间内请求数超过指定阈值时就抛出异常。 在ProviderInvoker的调用过程中&#xff0c;添加限流逻辑&#xff1a; 使用滑动窗口SlidingTimeWindow统计30s的请求数&#xff1b;每个服务service对应一个滑动窗口&#…

【C语言】字符串函数和内存函数及其模拟实现

文章目录 前言 一、常见字符串库函数1.strlen函数2.长度不受限制的字符串函数2.1 strcpy2.2 strcat2.3 strcmp 3.长度受限制的字符串函数3.1 strncpy3.2 strncat3.3 strncmp 二、字符串查找函数strstrstrtok 三、strerror函数四、内存操作函数1.memcpy2.memmove3.memcmp 五、字…

天地人和•大道不孤——卢禹舜中国画作品展在重庆美术馆隆重开幕

2024年4月12日&#xff0c;由中国国家画院、重庆市文化和旅游发展委员会主办&#xff0c;重庆美术馆&#xff08;重庆画院、重庆国画院&#xff09;、北京八荒锦绣美术馆、中国国际文化交流基金会卢禹舜艺术基金承办的“天地人和•大道不孤——卢禹舜中国画作品展”开幕式在重庆…

照片jpeg怎么变成jpg格式?这2种方法超简单!

在上传或下载照片时&#xff0c;某些网络服务可能对jpeg格式的上传或下载速度较慢&#xff0c;或者可能对文件大小有限制。通过将照片转换为jpg格式&#xff0c;您可以减小文件大小&#xff0c;提高上传和下载速度&#xff0c;并适应网络服务对jpg格式的更好支持&#xff0c;接…

·13·1dawwd

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

21 标准错误

标准输出重定向关闭无数据 下面的代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {close(1);i…

使用Postman发送跨域请求实验

使用Postman发送跨域请求 1 跨域是什么&#xff1f;2 何为同源呢?3 跨域请求是如何被检测到的&#xff1f;4 Postman跨域请求测试4.1 后端准备4.2 测试用例4.2.1 后端未配置跨域请求(1) 前端不跨域&#xff08;2&#xff09;前端跨域 4.2.2 后端配置跨域信息&#xff08;1&…