当前位置: 首页 > news >正文

数据结构_带头双向循环链表

List.h

相较于之前的顺序表和单向链表,双向链表的逻辑结构稍微复杂一些,但是在实现各种接口的时候是很简单的。因为不用找尾,写起来会舒服一点。(也可能是因为最近一直在写这个的原因)

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int LTDataType;
typedef struct ListNode
{struct ListNode* prev;LTDataType data;struct ListNode* next;}LTNode;LTNode* LTInit();
void LTDestroy(LTNode* phead);
void LTPrint(LTNode* phead);
//bool LTEmpty(LTNode* phead);void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);
LTNode* LTFind(LTNode* phead, LTDataType x);

List.c

在实现接口的时候,除了没有找尾,其他的操作和单向链表是差不多的,这里就不多说了。(注意代码里的注释)

#define _CRT_SECURE_NO_WARNINGS 1#include"List.h"LTNode* BuyNode(LTDataType x)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc is fail!");exit(1);}node->data = x;node->prev = node->next = node;return node;
}LTNode* LTInit()
{LTNode* phead = BuyNode(-1);return phead;
}void LTPrint(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){printf("%d->",pcur->data);pcur = pcur->next;}printf("\n");//注意换行
}void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = BuyNode(x);newnode->prev = phead->prev;newnode->next = phead;newnode->prev->next = newnode;phead->prev = newnode;
}void LTPopBack(LTNode* phead)
{assert(phead && phead->next != phead);//第二个很容易忽视!LTNode* del = phead->prev;del->prev->next = phead;phead->prev = del->prev;free(del);del = NULL;
}void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = BuyNode(x);phead->next->prev = newnode;newnode->next = phead->next;phead->next = newnode;newnode->prev = phead;
}void LTPopFront(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* del = phead->next;del->next->prev = phead;phead->next = del->next;free(del);del = NULL;
}LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead && phead->next != phead);LTNode* pcur = phead->next;while (pcur != phead){if (pcur->data == x)//别忘了连等号!!!return pcur;pcur = pcur->next;}return NULL;
}void LTErase(LTNode* pos)
{assert(pos);pos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;
}void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = BuyNode(x);pos->next->prev = newnode;newnode->next = pos->next;newnode->prev = pos;pos->next = newnode;
}void LTDestroy(LTNode* phead)//理论上这里应该传二级指针,但是为了保持接口的一致性,用一级。
{assert(phead);LTNode* des = phead->next;while (des != phead){LTNode* next = des->next;free(des);des = next;}free(phead);phead = des = NULL;
}

本博客旨在记录学习过程,以后忘了随时来看。

http://www.lryc.cn/news/340677.html

相关文章:

  • 常见的垃圾回收器(下)
  • 网桥的原理
  • STM32 CAN过滤器细节
  • 网络编程(现在不重要)
  • 10-菜刀连接木马
  • Unity数据持久化—Json存档
  • 基于SSM的在线学习系统的设计与实现(论文+源码)_kaic
  • 数据库SQL语言实战(二)
  • idea错误地commit后如何处理
  • VRTK(Virtual Reality Toolkit)深入介绍
  • 【LeetCode热题100】【贪心算法】划分字母区间
  • 第二届数据安全大赛暨首届“数信杯”数据安全大赛数据安全积分争夺赛-东区预赛部分WP
  • 如何在Python中使用matplotlib库进行数据可视化?
  • 网工基础协议——TCP/UDP协议
  • ClickHouse--16--普通函数
  • 03-JAVA设计模式-组合模式
  • C++发票识别、发票查验接口示例,您的“发票管理专家”
  • 【电控笔记6.2】拉式转换与转移函数
  • 第十五届蓝桥杯题解-数字接龙
  • 【vue】绑定事件 v-on
  • 【应用】SpringBoot-自动配置原理
  • 中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏
  • C++笔记之注册回调函数常见的5种情况对比
  • 人工智能揭示矩阵乘法的新可能性
  • 实在智能携手长江新零售俱乐部:探秘实在Agent数字员工,开启零售品牌增长新篇章
  • 计算机科学与导论 第十七 十八章 计算理论,人工智能
  • linux 设置定时任务---学习
  • 钡铼IOy系列模块深挖工业场景需求提供丰富多样的I/O解决方案
  • 【刷题笔记】第三天
  • 开源模型应用落地-LangChain试炼-CPU调用QWen1.5(一)