数据结构C语言双向循环链表,数据结构和算法(双向链表和双向循环链表)
双向链表
双向链表也称双链表,每个数据结点都有两个指针,分别指向直接前驱和直接后继。所以从双向链表的任何结点开始都可以方便的找到他的前驱和后继。
双向链表的每个结点如图所示:
双向链表由N个此类结点构成:
定义双向链表(C语言):包括前驱,后继,还有数据
typedef struct Node{
struct Node *prior;
Element data;
struct Node *next;
}Node;
typedef struct Node * ListNode;
复制代码
接下来,创建一个双向链表:
思路:
1.创建一个首元结点(为了方便操作,不用经常挪动头指针)
2.在链表中加入数据(单纯的为了后面的操作方便,也可以先初始化,之后再插数据)
复制代码
初始化代码如下
Status creatListNode(ListNode *L){
*L = (ListNode)malloc(sizeof(Node));
if (!(*L)) return ERROR;
(*L)->data = 0;
(*L)->prior = NULL;
(*L)->next = NULL;
//初始化这里直接增加数据,可以方便查询
ListNode p = *L;
for (int i = 0; i<5; i++) {
ListNode temp = (ListNode)malloc(sizeof(Node));
temp->next = NULL;
temp->prior = NULL;
temp->data = i;
p->next = temp;
temp->prior = p;
p = p->next;
}
return OK;
}
复制代码
为了方便操作调试,加了个打印链表的方法:
void printListNode(ListNode L){
printf("打印链表\n");
ListNode temp = L->next;
if (temp == NULL) {
printf("打印链表为空\n");
return;
}
while (temp) {
printf("%d\t",temp->data);
temp = temp->next;
}
printf("\n");
}
复制代码
下面说下插入结点:
思路:
1、首先找到插入结点的位置。
2、是不是在链表尾部(这个就直接看代码就好了)
3、temp的next指向p的next
4、p的next的prior指向temp
5、p的next指向temp
6、temp的prior指向p
如下图所示:
复制代码
Status insertListNode(ListNode *L, int place, Element data){
ListNode p = *L;
//1. 插入的位置不合法 为0或者为负数
if(place < 1) return ERROR;
ListNode temp = (ListNode)malloc(sizeof(Node));
temp->data = data;
temp->prior = NULL;
temp->next = NULL;
//找到前驱 p
for (int i = 1;i < place && p; i++) {
p = p->next;
}
//灭有
if(p==NULL) return ERROR;
//尾部
if (p->next == NULL) {
p->next = temp;
temp->prior = p;
}else{
//插入
temp->next = p->next;
p->next->prior = temp;
temp->prior = p;
p->next = temp;
}
return OK;
}
复制代码接下来是删除代码:
老规矩--思路:
1、找到要删除位置的前一个
2、p的next指向要删除结点的next
3、删除结点的next的prior指向p
4、看下面的图(已经很生动了。。)
复制代码
代码:
Status deleteListNode(ListNode *L, int place){
if(place < 0) return ERROR;
ListNode p = *L;
int i;
for (i = 1; i
p = p->next;
}
if (place>i || p == NULL) {
return ERROR;
}
//要删除的结点
ListNode deleTemp = p->next;
printf("要删除的值为:%d\n",deleTemp->data);
//删除
p->next = deleTemp->next;
if (deleTemp->next != NULL) {
deleTemp->next->prior = p;
}
free(deleTemp);
return OK;
}
复制代码
双向链表的查找:
思路:
简单来说就是把值传过来,然后遍历,找一样的。。
数据结构C语言双向循环链表,数据结构和算法(双向链表和双向循环链表)相关推荐
- c语言必背数据结构_C语言实现常用数据结构:简要一览(第1篇
线性表 最简单的一种数据结构,具有相同类型的数据元素组成的序列.顺序表.链表是其两种简单实现. 备注:数组也可以算一种简单的线性表. 链表可以分为:带头结点的简单链表 不带头结点的简单链表静态链表 循 ...
- 数据结构C语言版字符串,数据结构c语言版
数据结构c语言版是一款非常使用的数据结构课程的编写和教材:它也可将软件作为学习数据结构.算法C程序设计的参数教材,只需要用户学习该软件之后,就算遇到在繁杂的代码也可以清晰的写出来,本书的钱半部分主要介 ...
- 数据结构c语言程序设计报告,数据结构与算法课程设计报告模版.doc
数据结构与算法课程设计报告模版.doc 数据结构与算法课程设计报告题 目本科生导师制问题与家族关系查询系统院 (系) 信息科学与工程 专业班级 计算机应用技术1301班 学生姓名 顾 泉 学 号 20 ...
- 数据结构(C语言版)顺序栈相关算法的代码实现
这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...
- 数据结构c语言版总结,数据结构:C语言常见算法总结
[1]求最大值与最小值. #include void main() { int num[5],max,min,i; printf(\"请输入5个数字:\") for(i=0;i&l ...
- 数据结构c语言函数大全,数据结构习题库(c语言版).doc
数据结构习题库(c语言版) 第一章 绪 论 一.基本内容 数据.数据元素.数据对象.数据结构.存储结构和数据类型等概念术语的确定含义.抽象数据类型的定义.表示和实现方法.描述算法的类C语言.算法设计的 ...
- 中常用的数据结构_C语言实现常用数据结构:基本概念(第0篇
写在前面:为什么学习C语言数据结构 今天开始,我准备和一起分享学习C语言常用数据结构,这里不求事无巨细的掌握数据结构的方方面面,而是学习编程.考试等实际中常用的重要数据结构,这里以分享可以运行的代码为 ...
- c语言程序设计和数据结构,C语言程序设计与数据结构实践 闵光太主编.pdf
第 一 章 概 论 语 言 是 近 年 来 在 国 内 外 流 行 的 高 级 程 序 设 计 语 言 , 它 既 具 有 高 级 语 言 的 特 点 , 又 具 备 低 级 语 言 的 特 点 , ...
- 【数据结构(C语言)】数据结构-表
数据结构-表 [知识索引][数据结构(C语言)] 一.线性表 (1)基本概念 1.定义(性质相同的数据元素构成的有限序列) 2.表长,空表,位序,直接前驱,直接后继 3.基本操作(12) (2)存储结 ...
- 【数据结构(C语言)】数据结构-内部排序
内部排序 文章目录 内部排序 一.概述 (1)排序定义 (2)稳定性 (3)内部排序和外部排序 (4)两种基本操作 (5)数据类型定义 二.分类 (1)插入排序 (2)交换排序 (3)选择排序 (4) ...
最新文章
- 人脸识别门禁在安防行业的发展前景
- while 小项目练习
- 语言中knitr_R语言软件包的批量引用
- [HNOI2007]分裂游戏
- 【ACM】nyoj_540_奇怪的排序_201308050951
- python pickle模块操作
- mysql -- 索引的使用
- Java基础——枚举类的使用教程
- 树莓派4b自带wifi_树莓派4B日志二:WiFi远程配置与换源
- redis 缓存 淘汰
- 各大厂大数据精品分享汇总(进阶版)
- PAT (Basic Level) Practice1004 成绩排名
- Struts框架(一)
- 列生成(Column Generation)算法
- null 和 undefined 的区别
- Linux aarch64交叉编译之glm数学库
- tapestry3常见问题
- 如何测算BMI指数(Python)
- 开源为什么是“白色”的?
- NPOI创建DOCX常用操作