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

实现双向循环链表

双向循环链表

本文章将展示zack实现双向循环链表的代码

// list.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int data_type;
typedef struct list_node
{data_type data;struct list_node* next;struct list_node* prve;
}list_node;list_node* buy_node(data_type x);void list_init(list_node** pphead);void list_print(list_node* phead);void list_push_back(list_node* phead, data_type x);void list_push_front(list_node* phead, data_type x);bool list_empty(list_node* phead);void list_pop_back(list_node* phead);void list_pop_front(list_node* phead);list_node* list_find(list_node* phead, data_type x);// 在指定位置之前插入
void list_insert(list_node* pos, data_type x);void list_erase(list_node* pos);void list_destroy(list_node** pphead);
// list.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"list.h"list_node* buy_node(data_type x)
{list_node* new_node = (list_node*)malloc(sizeof(list_node));if (new_node == NULL){perror("malloc fail");exit(1);}new_node->data = x;new_node->next = new_node->prve = new_node;return new_node;
}void list_init(list_node** pphead)
{*pphead = buy_node(-1);
}void list_print(list_node* phead)
{list_node* pcur = phead->next;while (pcur != phead){printf("%d->", pcur->data);pcur = pcur->next;}printf("\n");
}void list_push_back(list_node* phead, data_type x)
{assert(phead);list_node* new_node = buy_node(x);new_node->next = phead;new_node->prve = phead->prve;phead->prve->next = new_node;phead->prve = new_node;
}void list_push_front(list_node* phead, data_type x)
{assert(phead);list_node* new_node = buy_node(x);new_node->next = phead->next;new_node->prve = phead;phead->next->prve = new_node;phead->next = new_node;
}bool list_empty(list_node* phead)
{assert(phead);return phead->next == phead;
}void list_pop_back(list_node* phead)
{list_empty(phead);assert(phead);list_node* del = phead->prve;phead->prve->prve->next = phead;phead->prve = phead->prve->prve;free(del);del = NULL;
}void list_pop_front(list_node* phead)
{list_empty(phead);assert(phead);list_node* del = phead->next;phead->next->next->prve = phead;phead->next = phead->next->next;free(del);del = NULL;
}list_node* list_find(list_node* phead, data_type x)
{list_node* pcur = phead->next;while (pcur != phead){if (pcur->data == x)return pcur;pcur = pcur->next;}return NULL;
}void list_insert(list_node* pos, data_type x)
{assert(pos);list_node* new_node = buy_node(x);new_node->next = pos;new_node->prve = pos->prve;pos->prve->next= new_node;pos->prve = new_node;
}void list_erase(list_node* pos)
{assert(pos);pos->prve->next = pos->next;pos->next->prve = pos->prve;free(pos);pos = NULL;
}void list_destroy(list_node** pphead)
{assert(pphead && *pphead);list_node* pcur = (*pphead)->next;while (pcur != *pphead){list_node* del = pcur;pcur = pcur->next;free(del);del = NULL;}free(*pphead);*pphead = NULL;pcur = NULL;
}
// test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"list.h"void list_test01()
{list_node* plist;list_init(&plist); // 这里是传哨兵位的地址,因为plist的指向发生改变list_push_back(plist, 1);list_push_back(plist, 2);list_push_back(plist, 3);list_push_back(plist, 4);list_push_back(plist, 5);list_print(plist);list_push_front(plist, 5);list_push_front(plist, 4);list_push_front(plist, 3);list_push_front(plist, 2);list_print(plist);
}void list_test02()
{list_node* plist;list_init(&plist);list_push_back(plist, 1);list_push_back(plist, 2);list_push_back(plist, 3);list_push_back(plist, 4);list_print(plist);list_pop_back(plist);list_print(plist);list_pop_back(plist);list_print(plist);list_pop_back(plist);list_print(plist);list_pop_back(plist);list_print(plist);
}void list_test03()
{list_node* plist;list_init(&plist);list_push_back(plist, 1);list_push_back(plist, 2);list_push_back(plist, 3);list_push_back(plist, 4);list_print(plist);list_pop_front(plist);list_print(plist);list_pop_front(plist);list_print(plist);list_pop_front(plist);list_print(plist);
}void list_test04()
{list_node* plist;list_init(&plist);list_push_back(plist, 1);list_push_back(plist, 2);list_push_back(plist, 3);list_push_back(plist, 4);list_print(plist);list_node* pos = list_find(plist, 1);list_insert(pos, 22);list_print(plist);pos = list_find(plist, 22);list_erase(pos);list_print(plist);list_destroy(&plist);
}
int main()
{//list_test01();//list_test02();//list_test03();list_test04();return 0;
}


文章转载自:

http://BVwEGCpl.gtxrw.cn
http://UQbLNE08.gtxrw.cn
http://fUjsRryU.gtxrw.cn
http://vCXRyjU6.gtxrw.cn
http://XQE4orQm.gtxrw.cn
http://lDMVsOO5.gtxrw.cn
http://gGU7jDbE.gtxrw.cn
http://D46zf23J.gtxrw.cn
http://ow5Oxwqh.gtxrw.cn
http://B1anUn0o.gtxrw.cn
http://onEp6WjR.gtxrw.cn
http://owBlWc0A.gtxrw.cn
http://gkTucyLp.gtxrw.cn
http://aZwXX9mM.gtxrw.cn
http://BB0sl9D0.gtxrw.cn
http://5rLbc9yh.gtxrw.cn
http://ra4Xmmra.gtxrw.cn
http://cPumw9gB.gtxrw.cn
http://CAgl9N1T.gtxrw.cn
http://6E6zvrgs.gtxrw.cn
http://Kr8n2i2P.gtxrw.cn
http://ZNi7t6TV.gtxrw.cn
http://VaUezPpY.gtxrw.cn
http://Ev4npb6O.gtxrw.cn
http://8zrdqTjK.gtxrw.cn
http://9yBQmyI3.gtxrw.cn
http://diVOwVMv.gtxrw.cn
http://WJFDu6OK.gtxrw.cn
http://mVi7nCNo.gtxrw.cn
http://Ys05edph.gtxrw.cn
http://www.dtcms.com/a/379130.html

相关文章:

  • Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架
  • This is Game
  • Git分支管理:从创建到合并冲突解决(二)
  • Elasticsearch 7.15 存储类型详解
  • 深入解析数据结构之栈及其应用
  • (一)昇腾AI处理器技术
  • BUUCTF刷题十一道(14)
  • Linux防火墙-Iptables
  • python访问基于docker搭建的elasticsearch
  • logback-spring.xml文件说明
  • 【PyTorch训练】为什么要有 loss.backward() 和 optimizer.step()?
  • 抖音大数据开发一面(0905)
  • 原生js的轮播图
  • 连接池项目考点
  • ruoyi-flowable-plus框架节点表单的理解
  • js.228汇总区间
  • BERT中文预训练模型介绍
  • 光平面标定建立激光点与世界坐标的对应关系
  • Jmeter执行数据库操作
  • 基于FPGA的图像中值滤波算法Verilog开发与开发板硬件测试
  • 微软Aurora大模型实战:五大数据源驱动、可视化对比与应用
  • 【论文笔记】SpaRC: Sparse Radar-Camera Fusion for 3D Object Detection
  • C++基本数据类型的范围
  • Spring AI(三)多模态支持(豆包)
  • agentic Deep search相关内容补充
  • 第一篇:如何在数组中操作数据【数据结构入门】
  • PYcharm——pyqt音乐播放器
  • OpenAI已正式开放ChatGPT Projects
  • 日系电车销量破万,真正突围了,恰恰说明了电车的组装本质!
  • Linux 防火墙 Iptables