《数据结构》 循环链表和双向链表常用操作代码集合
时间:2022-04-26
本文章向大家介绍《数据结构》 循环链表和双向链表常用操作代码集合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Ps:每段代码中,添加了署名Solo的代码为博主本人所写,其余来自课本或者老师。
大量操作等同于单链表。重复的操作不再贴出,可以查看之前的博文。
循环链表
//结构体部分同单链表 略
//初始化循环链表
InitCLinkList(LinkList *CL)
{
*CL = (LinkList)malloc(sizeof(Node)); //建立循环链表的指针
(*CL)->next = *CL; //建立空的循环链表
}
//尾插法建立循环单链表
void CreateCLinkList(LinkList CL)
/*CL是定义好的,已经初始化好的、带头结点的空循环链表的头指针
通过键盘输入元素值*/
{
Node *rear, *s;
char c;
rear = CL; /*rear指针动态地指向链表的当前表尾,其初值指向头结点*/
while((c = getchar()) != '$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c;
rear->next = s;
s = rear;
}
rear->next = CL; /*最后一个节点的nxt域指向头结点*/
}
//循环链表的合并算法(1)
LinkList merge_1(LinkList LA, LinkList LB)
{ /*此算法将采用头指针的循环单链表的首尾链接起来*/
Node *p,*q;
p =LA;
q = LB;
while(p->next != LA) p = p->next;
while(q->next != LB) q = q->next;
q->next = LA; //修改表LB的尾指针,指向表LA的头结点
p->next = LB->next; //修改LA的尾指针,指向LB的首元结点
free(LB);
return(LA);
}
//循环链表的合并算法(2)
LinkList merge_2(LinkList RA, LinkList RB) //注意,RA、RB是尾指针
{ /*此算法将两个采用尾指针的循环单链表的首尾链接起来*/
Node *p;
p = RA->next; /*保存链表RB的头结点地址*/
RA->next = RB->next->next; /*链表RB的开始结点链到链表RA的终端结点之后*/
free(RB->next); /*释放链表RB的头结点*/
RB->next = p; /*链表RB的开始结点链到链表RA的终端结点之后*/
return RB;
}
双向链表
//双向链表的结构体定义如下
typedef struct DNode
{
ElemType data;
struct DNode *prior, *next;
} DNode, *DoubleList;
#define OK 1
#define ERROR 0
//双向链表的前插操作
int DlinkIns(DoubleList L, int i, ElemType e)
{
DNode *s, *p;
p = L; k = 0;
while(p && k<i) //检查插入位置是否合法
{
p = p->next;
k++;
}
if(!p || k>i) return ERROR;
s = (DNode *)malloc(sizeof(DNode));
if(s)
{
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s; //四个步骤不能换位置,否则会产生指针丢失
return OK;
}
}
//双向链表的删除操作
int DLinkList(DoubleList L; int i; ElemType *e)
{
DNode *p;
p = L; k = 0;
while(p && k<i) { p = p->next; k++}
if(!p || k>i) return ERROR;
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return OK;
}
- Docker可视化界面(Consul+Shipyard+Swarm+Service Discover)部署记录
- windows 2008上启用防火墙后sqlserver 2005经常出现连接超时的解决办法
- 重温delphi之控制台程序:Hello World!
- Docker集中化web界面管理平台-Shipyard部署记录
- "Goole项目托管"及"CodePlex发布开源项目"要点
- Docker网络解决方案-Calico部署记录
- c#中开发ActiveX的学习笔记
- Android新手之旅(4) 通过HTTP访问web
- Flash/Flex学习笔记(9):ActionScript3.0与Javascript的相互调用
- Flash/Flex学习笔记(8):ActionScript3.0中的面对对象
- Docker网络解决方案-Weave部署记录
- Flash/Flex学习笔记(7):FMS3.5基于IIS的安装
- Netdata---Linux系统性能实时监控平台部署记录
- linux下向一个文件中的某行插入数据的做法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android开发之RadioGroup的简单使用与监听示例
- Android 根据手势顶部View自动展示与隐藏效果
- Vue 3 如何安装
- Android实现状态栏(statusbar)渐变效果的示例
- Linux中stat函数和stat命令使用详解
- Android Beam 文件传输失败分析与解决方法
- Android实现修改状态栏背景、字体和图标颜色的方法
- Android视频压缩的示例代码
- Android如何从实现到封装一个MVP详解
- Android利用爬虫实现模拟登录的实现实例
- Android实现移动小球和CircularReveal页面切换动画实例代码
- Android4.4+ 实现半透明状态栏(Translucent Bars)
- Android弹出dialog后无法捕捉back键的解决方法
- Android编程设置屏幕亮度的方法
- 利用SurfaceView实现下雨与下雪动画效果详解(Kotlin语法)