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

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;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS开发实例:【app帐号管理】

应用帐号管理 介绍 本示例选择应用进行注册/登录,并设置帐号相关信息,简要说明应用帐号管理相关功能。效果图如下: 效果预览 使用说明参考鸿蒙文档:qr23.cn/AKFP8k点击或者转到。 1.首页面选择想要进入的应用,首次进…

Redis 之集群模式

一 集群原理 集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。 集群由多个节点(Node)组成,Redis的数据分布在这些节点中。 集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从…

接口测试用例编写和接口测试模板

一、简介 接口测试区别于传统意义上的系统测试,下面介绍接口测试用例和接口测试报告。 二、接口测试用例模板 功能测试用例最重要的两个因素是测试步骤和预期结果,接口测试属于功能测试,所以同理。接口测试的步骤中,最重要的是将…

项目管理软件评测:选择合适软件是关键

在过去,中小企业项目管理沿用的是office全家桶,用到后面项目由简单变复杂,项目资源越来越庞大,项目成员越来越多,项目管理问题日益凸显。好用的项目管理软件是化解问题的好方法,好用的项目管理软件是什么样…

(Oracle)SQL优化案例:隐式转换优化

项目场景 项目现场的某个kettle模型执行非常缓慢,原因在于某个SQL执行效率非常的低。甲方得知此事要求公司赶紧优化,负责该模块的同事对SQL优化并不熟悉。所以作为一个立志成为优秀DBA的ETL工程师,我自告奋勇:不是DBA,…

4.2 面向对象程序设计-类的继承实验

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系将于24小时内删除 目录 1.实验内容 2.实验原理 2.1类的继承 2.2 继承的优点和缺点 2.3 继承的方式 3.实验代码 1.实验内容 创建一个父类CalcTime,在父类中依次定义用于保存…

10 Php学习:循环

在 PHP 中,提供了下列循环语句: while - 只要指定的条件成立,则循环执行代码块do…while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环for - 循环执行代码块指定的次数foreach - 根据数组中每个元素来循环代码块 当…

Python八股文:基础知识Part2

1. Python中变量的保存和访问 Python中的变量实际上是一个指向对象的引用,每个对象都有一个唯一的标识符(即内存地址)。对于一些不可变对象,如字符串和整数,因为它们的值不可更改,所以当多个变量引用相同的…

React Hooks 全解: 常用 Hooks 及使用场景详解

React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。 React 中常用的 10 个 Hooks,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect、useImperativeHandle 和 useDebugValue。这些…

分享一下项目中遇到的排序失效问题

今天把原来的一个查询接口的业务代码进行了优化&#xff0c;减少了十几行冗余的代码。 原来的代码 ChongwuServiceImpl.java /*** author heyunlin* version 1.0*/ Slf4j Service public class ChongwuServiceImpl implements ChongwuService {Overridepublic JsonResult<…

中介者模式:简化对象间通信的协调者

在面向对象的软件开发中&#xff0c;中介者模式是一种重要的行为型设计模式&#xff0c;用于降低多个对象间通信的复杂性。通过提供一个中心化的对象来处理不同组件之间的交互&#xff0c;中介者模式使得组件间不必显式引用彼此&#xff0c;从而使其松散耦合、更易于维护。本文…

数据库系统概论(超详解!!!)第四节 数据库安全性

问题的提出&#xff1a; 数据库的一大特点是数据可以共享 数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享。 1.数据库的安全概述 数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 。 系统安全保护措施是否有效…