C语言带头双向循环链表怎么实现
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇"C语言带头双向循环链表怎么实现"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C
千家信息网最后更新 2025年11月08日C语言带头双向循环链表怎么实现
这篇"C语言带头双向循环链表怎么实现"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C语言带头双向循环链表怎么实现"文章吧。
带头双向循环链表的结构
实际上,单链表也存在一个比较大的缺陷:
1.不能从后往前遍历
2.无法找到前驱
除了单链表之外,我们自然还有双向链表,我们要说的就是带头双向循环链表,简单理解为:带头结点的,有两个方向的。循环的。结构图如下:
结构虽然比较复杂,但是极大方便我们找结点,比如可以直接找到尾结点,然后再进入相关的操作。实际代码的操作将会比单链表简单,极为方便,这里不做过多说明,直接上手代码
代码操作
我们直奔主题,进入代码实现的操作,之前的操作如果理解了,那我相信这个对于你来说肯定是不难的。下面直接给出源码:
List.h
#pragma once#include#include #include #include #include typedef int LTDataType;//带头双向循环--最优链表结构,在任意位置插入删除数据都是O(1)typedef struct listNode{ struct ListNode* next; struct ListNode* prev; LTDataType data;}ListNode;//初始化ListNode*ListInit();//销毁void ListDestory(ListNode* phead);//打印void ListPrint(ListNode* phead);//尾插void ListPushBack(ListNode* phead, LTDataType x);//头插void ListPushFront(ListNode* phead, LTDataType x);//头删void ListPopFront(ListNode* phead);//尾删void ListPopBack(ListNode* phead);ListNode* ListFind(ListNode* phead, LTDataType x);//在pos位置之前插入xvoid ListInsert(ListNode* pos, LTDataType x);//删除pos位置的值void ListErase(ListNode* pos);
List.c
#include "List.h"//开辟一个新结点ListNode* BuyListNode(LTDataType x){ ListNode* newnode =(ListNode*)malloc(sizeof(ListNode)); newnode->data = x; newnode->next = NULL; newnode->prev = NULL; return newnode;}//初始化ListNode* ListInit(){ ListNode*phead = BuyListNode(0); phead->next = phead; phead->prev = phead; return phead;}//销毁void ListDestory(ListNode* phead){ assert(phead); ListNode* cur = phead->next; while (cur != phead) { ListNode* next = cur->next; free(cur); cur = next; } free(phead); phead = NULL;}//打印void ListPrint(ListNode* phead){ ListNode* cur = phead->next; while (cur != phead) { printf("%d ", cur->data); cur = cur->next; } printf("\n");}//尾插void ListPushBack(ListNode* phead, LTDataType x){ assert(phead); ListNode* tail = phead->prev; ListNode* newnode = BuyListNode(x); tail->next = newnode; newnode->prev = tail; newnode->next = phead; phead->prev = newnode;}//头插void ListPushFront(ListNode* phead, LTDataType x){ assert(phead); ListNode* first = phead->next; ListNode* newnode = BuyListNode(x); newnode->next = first; first->prev = newnode; phead->next = newnode; newnode->prev = phead;}//头删void ListPopFront(ListNode* phead){ assert(phead); assert(phead->next != phead); ListNode* first = phead->next; ListNode* second = first->next; phead->next = second; second->prev = phead; free(first); first = NULL;}//尾删void ListPopBack(ListNode* phead){ assert(phead); assert(phead->next != phead); ListNode* tail = phead->prev; ListNode* prev = tail->prev; prev->next = phead; phead->prev = prev; free(tail); tail = NULL;}ListNode* ListFind(ListNode* phead, LTDataType x){ assert(phead); ListNode* cur = phead->next; while (cur != phead) { if (cur->data == x) { return cur; } cur = cur->next; } return NULL;}//在pos位置之前插入xvoid ListInsert(ListNode* pos, LTDataType x){ assert(pos); ListNode* prev = pos->prev; ListNode* newnode = BuyListNode(x); prev->next = newnode; newnode->prev = prev; newnode->next = pos; pos->prev = newnode;}//删除pos位置的值void ListErase(ListNode* pos){ assert(pos); ListNode* prev = pos->prev; ListNode* next = pos->next; prev->next = next; next->prev = prev; free(pos);}Test.c
#include "List.h"void TestList1(){ ListNode* plist = ListInit(); ListPushBack(plist, 1); ListPushBack(plist, 2); ListPushBack(plist, 3); ListPushBack(plist, 4); ListPrint(plist); ListPushFront(plist, 0); ListPushFront(plist, -1); ListPrint(plist); ListPopFront(plist); ListPopFront(plist); ListPopFront(plist); ListPrint(plist); ListPopBack(plist); ListPrint(plist);}void TestList2(){ ListNode* plist = ListInit(); ListPushBack(plist, 1); ListPushBack(plist, 2); ListPushBack(plist, 3); ListPushBack(plist, 4); ListPrint(plist); ListNode* pos = ListFind(plist, 3); if (pos) { pos->data *= 10; printf("找到了,并且*10\n"); } else { printf("没找到\n"); } ListPrint(plist); ListInsert(pos, 300); ListPrint(plist); ListErase(pos); ListPrint(plist);}int main(){ TestList2(); return 0;}以上就是关于"C语言带头双向循环链表怎么实现"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
双向
环链
位置
内容
代码
结构
结点
语言
实际
就是
文章
知识
篇文章
循环
复杂
两个
主题
价值
前驱
大部分
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中专生学软件开发用什么笔记本好
服务器内存条spd写保护7脚
目录服务器 状态 不可用
数据库安全读写
莱阳微信小程序软件开发推荐
防欺凌网络安全黑板报
摩尔庄园服务器崩溃
济宁互联网养老软件开发公司
湖北服务器机柜要多少钱
网络安全设备信息
linux数据库导入表格
新三板上市公司网络安全
面临的网络安全威胁
梦幻转原服务器规则
计算机软件开发及销售税率
黄石网络技术
超算中心如何构建网络安全
湖北it软件开发培训
信息边疆与网络安全的关系
开源流媒体服务器系统
网络安全人员李健
服务器远程管理软件有哪些
上海楼控管理软件开发哪家好
有安装包安装数据库步骤
显示与控制软件开发
手机服务器如何重启
系统集成软件开发合同
参与数据库设计你会考虑哪些
如何虚拟服务器
服务器的基频和睿频