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

数据结构---双向循环链表

双向循环链表:

1双向对应有一个指向前一个节点的prev和一个指向和一个节点的node,和一个数据域data,

2循环就是连起来跟一个园一样,就是最后一个节点指向头节点,头节点的前一个prev指向尾节点

代码实战

1创建结构体,基本程序框架

//头文件
#include<stdio.h>
#include<stdlib.h>//宏
#define  DataType  int
//全局变量//结构体
typedef struct node
{DataType data;struct node* prev;struct node* next;
}node,*Node;
//函数int main()
{return 0;
}

 2实现链表初始化函数,增加函数,打印/遍历函数

初始化函数

Node Init(Node phead) {phead = malloc(sizeof(node));if (phead == NULL){printf("malloc file\n");return -1;}phead->next = phead;phead->prev= phead;return phead;
}

尾插函数

int add(Node phead, int num)
{//创建节点Node newnode = NULL;newnode = malloc(sizeof(node));newnode->data = num;newnode->next = NULL;newnode->prev = NULL;//找到尾Node  cur = NULL;for (cur = phead; cur->next != phead; cur = cur->next);cur->next = newnode;newnode->prev = cur;phead->prev = newnode;newnode->next = phead;return 0;
}

遍历函数

int show(Node phead)
{if (phead == NULL){printf("NULL\n");return 0;}Node cur = NULL;for (cur = phead->next; cur != phead; cur = cur->next){printf("%d->", cur->data);}printf("NULL\n");return 0;}

效果演示

int main()
{Node phead = NULL;phead = Init(phead);add(phead, 1);add(phead, 2);add(phead, 3);add(phead, 4);show(phead);return 0;
}

 

 

3修改与删除 

修改函数
int change(Node phead, int num1, int num2)
{if (phead == NULL){printf("phead is null\n");return -1;}Node cur = NULL;for (cur = phead->next; cur != phead; cur = cur->next){if (cur->data == num1){cur->data = num2;return 0;}}printf("no find %d\n", num1);return 0;
}
删除函数
void delete(Node phead, int num)
{if (phead == NULL){printf("phead is NULL\n");return 0;}Node cur1 = NULL;Node cur2 = NULL;for (cur1 = phead, cur2 = phead->next; cur2 != phead; cur1 = cur2, cur2 = cur2->next){if (cur2->data == num){cur1->next = cur2->next;cur2->next->prev = cur1;free(cur2);return 0;}}printf("no find num\n");
}
效果
int main()
{Node phead = NULL;phead = Init(phead);add(phead, 1);add(phead, 2);add(phead, 3);add(phead, 4);show(phead);delete(phead, 1);delete (phead, 2);change(phead, 3, 5);show(phead);change(phead, 6, 5);delete(phead, 3);delete (phead, 4);show(phead);return 0;
}

 

最终代码

//头文件
#include<stdio.h>
#include<stdlib.h>//宏
#define  DataType  int
//全局变量//结构体
typedef struct node
{DataType data;struct node* prev;struct node* next;
}node,*Node;
//函数
Node Init(Node phead) {phead = malloc(sizeof(node));if (phead == NULL){printf("malloc file\n");return -1;}phead->next = phead;phead->prev= phead;return phead;
}int add(Node phead, int num)
{//创建节点Node newnode = NULL;newnode = malloc(sizeof(node));newnode->data = num;newnode->next = NULL;newnode->prev = NULL;//找到尾Node  cur = NULL;for (cur = phead; cur->next != phead; cur = cur->next);cur->next = newnode;newnode->prev = cur;phead->prev = newnode;newnode->next = phead;return 0;
}int show(Node phead)
{if (phead == NULL){printf("NULL\n");return 0;}Node cur = NULL;for (cur = phead->next; cur != phead; cur = cur->next){printf("%d->", cur->data);}printf("NULL\n");return 0;}int change(Node phead, int num1, int num2)
{if (phead == NULL){printf("phead is null\n");return -1;}Node cur = NULL;for (cur = phead->next; cur != phead; cur = cur->next){if (cur->data == num1){cur->data = num2;return 0;}}printf("no find %d\n", num1);return 0;
}void delete(Node phead, int num)
{if (phead == NULL){printf("phead is NULL\n");return 0;}Node cur1 = NULL;Node cur2 = NULL;for (cur1 = phead, cur2 = phead->next; cur2 != phead; cur1 = cur2, cur2 = cur2->next){if (cur2->data == num){cur1->next = cur2->next;cur2->next->prev = cur1;free(cur2);return 0;}}printf("no find num\n");
}
int main()
{Node phead = NULL;phead = Init(phead);add(phead, 1);add(phead, 2);add(phead, 3);add(phead, 4);show(phead);delete(phead, 1);delete (phead, 2);change(phead, 3, 5);show(phead);change(phead, 6, 5);delete(phead, 3);delete (phead, 4);show(phead);return 0;
}

 

 
 
 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • elementplus 二次封装 select 自定义指令上拉加载更多 完美解决 多次接口调用 重新加载数据多次调用数据!!!
  • LeetCode-字母异位词分组
  • 用R语言进行数据类型的检查和基础转换
  • 如果将一个对象赋值给 ref,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。这也意味着如果对象中包含了嵌套的 ref,它们将被深层地解
  • rk3568-linux sdk编译update.img时以当前时间进行命名
  • 前端开发有什么专业术语吗?
  • Golang | Leetcode Golang题解之第335题路径交叉
  • Android 12系统源码_多屏幕(二)模拟辅助设备功能开关实现原理
  • SecureCRT for Mac/Win:安全高效的专业终端SSH工具软件
  • 重修设计模式-创建型-原型模式
  • 超详细!!!electron-vite-vue开发桌面应用之配置路由router(五)
  • CopyOnWriteArrayList技术探究
  • C:每日一题:二分查找
  • DevExpress开发WPF应用实现对话框总结:编织界面的艺术之旅
  • 搭建jenkins+k8s过程中遇到的问题
  • 自己简单写的 事件订阅机制
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • C学习-枚举(九)
  • iOS 系统授权开发
  • js操作时间(持续更新)
  • Mithril.js 入门介绍
  • Puppeteer:浏览器控制器
  • SAP云平台里Global Account和Sub Account的关系
  • use Google search engine
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 第2章 网络文档
  • 给github项目添加CI badge
  • 汉诺塔算法
  • 前端自动化解决方案
  • 前嗅ForeSpider采集配置界面介绍
  • 区块链分支循环
  • 如何学习JavaEE,项目又该如何做?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我这样减少了26.5M Java内存!
  • 一个完整Java Web项目背后的密码
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 白色的风信子
  • ![CDATA[ ]] 是什么东东
  • #100天计划# 2013年9月29日
  • #AngularJS#$sce.trustAsResourceUrl
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • $.ajax()方法详解
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)斐波那契Fabonacci函数
  • (六)c52学习之旅-独立按键
  • (一) springboot详细介绍
  • (转)iOS字体
  • (转载)Linux 多线程条件变量同步
  • .NET C# 使用 iText 生成PDF
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET 解决重复提交问题
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • /bin/bash^M: bad interpreter: No such file ordirectory