双向链表

双向链表也称双链表,每个数据结点都有两个指针,分别指向直接前驱和直接后继。所以从双向链表的任何结点开始都可以方便的找到他的前驱和后继。

双向链表的每个结点如图所示:

双向链表由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语言双向循环链表,数据结构和算法(双向链表和双向循环链表)相关推荐

  1. c语言必背数据结构_C语言实现常用数据结构:简要一览(第1篇

    线性表 最简单的一种数据结构,具有相同类型的数据元素组成的序列.顺序表.链表是其两种简单实现. 备注:数组也可以算一种简单的线性表. 链表可以分为:带头结点的简单链表 不带头结点的简单链表静态链表 循 ...

  2. 数据结构C语言版字符串,数据结构c语言版

    数据结构c语言版是一款非常使用的数据结构课程的编写和教材:它也可将软件作为学习数据结构.算法C程序设计的参数教材,只需要用户学习该软件之后,就算遇到在繁杂的代码也可以清晰的写出来,本书的钱半部分主要介 ...

  3. 数据结构c语言程序设计报告,数据结构与算法课程设计报告模版.doc

    数据结构与算法课程设计报告模版.doc 数据结构与算法课程设计报告题 目本科生导师制问题与家族关系查询系统院 (系) 信息科学与工程 专业班级 计算机应用技术1301班 学生姓名 顾 泉 学 号 20 ...

  4. 数据结构(C语言版)顺序栈相关算法的代码实现

    这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...

  5. 数据结构c语言版总结,数据结构:C语言常见算法总结

    [1]求最大值与最小值. #include void main() { int num[5],max,min,i; printf(\"请输入5个数字:\") for(i=0;i&l ...

  6. 数据结构c语言函数大全,数据结构习题库(c语言版).doc

    数据结构习题库(c语言版) 第一章 绪 论 一.基本内容 数据.数据元素.数据对象.数据结构.存储结构和数据类型等概念术语的确定含义.抽象数据类型的定义.表示和实现方法.描述算法的类C语言.算法设计的 ...

  7. 中常用的数据结构_C语言实现常用数据结构:基本概念(第0篇

    写在前面:为什么学习C语言数据结构 今天开始,我准备和一起分享学习C语言常用数据结构,这里不求事无巨细的掌握数据结构的方方面面,而是学习编程.考试等实际中常用的重要数据结构,这里以分享可以运行的代码为 ...

  8. c语言程序设计和数据结构,C语言程序设计与数据结构实践 闵光太主编.pdf

    第 一 章 概 论 语 言 是 近 年 来 在 国 内 外 流 行 的 高 级 程 序 设 计 语 言 , 它 既 具 有 高 级 语 言 的 特 点 , 又 具 备 低 级 语 言 的 特 点 , ...

  9. 【数据结构(C语言)】数据结构-表

    数据结构-表 [知识索引][数据结构(C语言)] 一.线性表 (1)基本概念 1.定义(性质相同的数据元素构成的有限序列) 2.表长,空表,位序,直接前驱,直接后继 3.基本操作(12) (2)存储结 ...

  10. 【数据结构(C语言)】数据结构-内部排序

    内部排序 文章目录 内部排序 一.概述 (1)排序定义 (2)稳定性 (3)内部排序和外部排序 (4)两种基本操作 (5)数据类型定义 二.分类 (1)插入排序 (2)交换排序 (3)选择排序 (4) ...

最新文章

  1. 人脸识别门禁在安防行业的发展前景
  2. while 小项目练习
  3. 语言中knitr_R语言软件包的批量引用
  4. [HNOI2007]分裂游戏
  5. 【ACM】nyoj_540_奇怪的排序_201308050951
  6. python pickle模块操作
  7. mysql -- 索引的使用
  8. Java基础——枚举类的使用教程
  9. 树莓派4b自带wifi_树莓派4B日志二:WiFi远程配置与换源
  10. redis 缓存 淘汰
  11. 各大厂大数据精品分享汇总(进阶版)
  12. PAT (Basic Level) Practice1004 成绩排名
  13. Struts框架(一)
  14. 列生成(Column Generation)算法
  15. null 和 undefined 的区别
  16. Linux aarch64交叉编译之glm数学库
  17. tapestry3常见问题
  18. 如何测算BMI指数(Python)
  19. 开源为什么是“白色”的?
  20. NPOI创建DOCX常用操作

热门文章

  1. Adams 2020 安装教程
  2. 某型火炮随动控制系统测试研究
  3. Web安全 Msfconsole攻击技术(成功拿下服务器最高权限.)
  4. 【通俗易懂的通信】贝叶斯公式 全概率公式 及其理解
  5. 如何下载centos7的iso文件
  6. 3dmax渲染出来的图不清晰?
  7. 流水线激光打标视觉定位系统
  8. MFC中调用WPF教程
  9. HTTP报文-请求方式
  10. 预测控制matlab程序,预测控制matlab程序