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

数据结构4—双向链表(附源码)

1.概念与结构

在整个链表中存在一个“哨兵位”,这个哨兵位不存储任何有效元素,置是站在这里放哨,空站一个位置。

2.源码

2.1 List.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int LTDataType;typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}LTNode;//打印
void Print(LTNode* phead);//初始化
void LTInit(LTNode** pphead);//尾插
void LTPushBack(LTNode** pphead);//头插
void LTPushFront(LTNode* phead, LTDataType x);//尾删
void LTPopBack(LTNode* phead);//头删
void LTPopFront(LTNode* phead);//查找结点
LTNode* LTFind(LTNode* phead, LTDataType x);//在pos位置之后插入结点
void LTInsert(LTNode* pos, LTDataType x);

2.2 List.c

#include "List.h"void Print(LTNode* phead)
{LTNode* pcur = phead->next;while (pcur != phead){printf("%d", pcur->data);pcur = pcur->next;}
}LTNode* LTBuyNode(LTDataType x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));if (newnode == NULL){perror("malloc fail");exit(1);}newnode->data = x;newnode->prev = newnode->next = newnode;return newnode;
}//初始化
void LTInit(LTNode** pphead)
{//创建一个头结点(哨兵位)*pphead = LTBuyNode(-1);
}void LTPushBack(LTNode* phead,LTDataType x)
{LTNode* NewNode = LTBuyNode(x);NewNode->next = phead;NewNode->prev = phead->prev;phead->prev->next = NewNode;phead->prev = NewNode;}void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* NewNode = LTBuyNode(x);phead->next->prev = NewNode;NewNode->next = phead->next;phead->next = NewNode;NewNode->prev = phead;
}//判断是否是空链表
bool LTEmpty(LTNode* phead)
{assert(phead);return phead->next == phead;//如果为空,返回true。返回false,不为空
}void LTPopBack(LTNode* phead)
{assert(phead);assert(!LTEmpty(phead));//保证不是空链表LTNode* del = phead->prev;LTNode* prev = del->prev;prev->next = phead;phead->prev = prev;free(del);del = NULL;
}void LTPopFront(LTNode* phead)
{assert(phead);assert(!LTEmpty(phead));//保证不是空链表LTNode* del = phead->next;LTNode* prev = del->next;phead->next = prev;prev->prev = phead;free(del);del = NULL;}LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){if (pcur->data == x){return pcur;}pcur = pcur->next;}
}void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = LTBuyNode(x);newnode->next = pos->next;newnode->prev = pos;pos->next->prev = newnode;pos->next = newnode;
}

2.3 test.c

#include "List.h"void ListTest01()
{//创建双向链表LTNode* pList = NULL;LTInit(&pList);//LTPushBack(pList, 1);//LTPushBack(pList, 2);//LTPushBack(pList, 3);LTPushFront(pList,3);LTPushFront(pList,2);LTPushFront(pList,1);//LTPopBack(pList);//LTPopFront(pList);/*Print(pList);*/LTNode* pos = LTFind(pList, 2);LTInsert(pos, 6);Print(pList);if (pos == NULL){printf("没有找到");}else{printf("找到了");}
}int main()
{ListTest01();return 0;
}

http://www.mrgr.cn/news/18832.html

相关文章:

  • 【前端面试】设计循环双端队列javascript
  • 智慧医院必备信息化系统之——LIS系统源码
  • C++——入门基础(下)
  • 深入理解 FastAPI 测试:TestClient带你飞起来
  • 1.3 JavaWeb基础面试题
  • TeeChart助力科研软件:高效实现数据可视化
  • Vue3实时更新时间(年-月-日 时:分:秒)
  • 还在用谷歌翻译?这4款翻译工具也许更高效!
  • python计算机视觉编程——照相机模型与增强现实
  • kubernetes里面那些事—————存储
  • 香港服务器支持PHP吗?还支持哪些语言?
  • Vue 组件有哪些通讯方式?这里有10种方式及示例代码
  • wacat - 一款开源随机测试工具
  • AI 生成技术引领创新潮流,多领域应用展现广阔前景
  • vue3中播放m3u8,附测试网址
  • 涨薪秘籍?40w年薪项目经理力荐,10个项目管理神器大放送!
  • quartz源码-Schedule启动过程分析
  • Java算法之LRUCache缓存实现
  • JVM面试(三)类加载过程
  • 人该怎样活着呢?48