1,双向链表相当于两个单向循环链表。

2,双向链表的结点定义。

1 struct DULNode
2 {
3 int data;
4 struct DULNode * prior;
5 struct DULNode * next;
6 };
7
8 typedef struct DULNode * linklist;

3,单循环链表的操作都适用于双循环链表。
4,双循环链表的操作集合仍在头文件defs.h中。

5,InitList操作。双循环链表初始化操作示意图

 1 #include"defs.h"
2
3 void InitList(linklist *L) //改变头指针
4 {
5 *L = (linklist)malloc(sizeof(struct DULNode));
6 if (*L == NULL)
7 exit(0);
8 (*L)->next = *L;
9 (*L)->prior = *L;
10 }

6,ClearList操作.

 1 #include"defs.h"
2
3 void ClearList(linklist L)
4 {
5 linklist p = L->next; //p指向链表第一个元素
6
7 while (p != L)
8 {
9 p = p->next; //p指向第二个元素
10 free(p->prior);
11 }
12 (*L)->next = *L;
13 (*L)->prior = *L;
14 }

ClearList.c

7,DestroyList操作

1 #include"defs.h"
2
3 void DestroyList(linklist *L)
4 {
5 ClearList(*L);
6 free(*L);
7 *L = NULL;
8 }

DestroyList.c

8,ListEmpty操作

1 #include"defs.h"
2
3 int ListEmpty(linklist L)
4 {
5 if (L->next == L && L->prior == L) //两个条件均要有
6 return 0;
7 else
8 return 1;
9 }

ListEmpty.c

9,ListLength操作

 1 #include"defs.h"
2
3 int ListLength(linklist L)
4 {
5 linklist p = L->next;
6 int j = 0;
7
8 while (p != L)
9 {
10 ++j;
11 p = p->next;
12 }
13 return j;
14 }

ListLength.c

10,GetElem操作

 1 #include"defs.h"
2
3 int GetElem(linklist L, int i, int *e)
4 {
5 linklist p = L;
6 int j = 0;
7 if (i<1 || i>ListLength(L))
8 exit(0);
9
10 while (j<i) //找到第i个结点
11 {
12 ++j;
13 p = p->next;
14 }
15 *e = p->data;
16 }

GetElem.c

11,LocateElem操作, 没有找到返回-1

 1 #include"defs.h"
2
3 int LocateElem(linklist L, int e)
4 {
5 linklist p = L->next;
6 int j = 0;
7
8 while (p != L)
9 {
10 ++j;
11 if (p->data == e)
12 return j;
13 }
14 return -1;
15 }

LocateElem.c

12,PriorElem操作

 1 #include"defs.h"
2
3 int PriorElem(linklist L, int cur_e, int *pri_e)
4 {
5 linklist p = L->next->next; //p指向第二个元素
6
7 while (p != L)
8 {
9 if (p->data == cur_e)
10 {
11 *pri_e = p->prior->data;
12 return 0;
13 }
14 }
15 return 0;
16 }

PriorElem.c

13,NextElem操作

 1 #include"defs.h"
2
3 int NextElem(linklist L, int cur_e, int *nex_e)
4 {
5 linklist p = L->next->next;
6
7 while (p != L)
8 {
9 if (p->prior->data == cur_e)
10 {
11 *nex_e = p->data;
12 return 0;
13 }
14 }
15 return 0;
16 }

NextElem.c

14,ListInsert操作

 1 #include"defs.h"
2
3 int ListInsert(linklist L, int i, int e)
4 {
5 linklist p = L; //p指向头结点
6 linklist q, s;
7 int j = 0;
8 if (i<1 || i>ListLength(L)+1)
9 exit(0);
10
11 while (j < i-1) //找到第i-1个结点
12 {
13 ++j;
14 p = p->next;
15 }
16 q = p->next; //q指向第i个结点
17
18 s = (linklist)malloc(sizeof(struct DULNode));
19 s->data = e;
20
21 s->next = q; //先改变向右的指针
22 p->next = s;
23 s->prior = p; //改变向左的指针
24 q->prior = s;
25 return 0;
26 }

ListInsert.c

15,ListDelete操作

 1 #include"defs.h"
2
3 int ListDelete(linklist L, int i, int *e)
4 {
5 linklist p = L;
6 linklist q;
7 int j = 0;
8 if (i<1 || i>ListLength(L)) //位置是否合理
9 exit(0);
10
11 while (j < i-1) //找到第i-1个元素
12 {
13 ++j;
14 p = p->next;
15 }
16 q = p->next; //p指向第i个结点
17 *e = q->data;
18
19 p->next = q->next;
20 q->next->prior = p;
21 free(q);
22 return 0;
23 }

ListDelete.c

16,TravelList操作

 1 #include"defs.h"
2
3 void TravelList(linklist L)
4 {
5 linklist p = L->next;
6 int j = 0;
7 while (p != L)
8 {
9 ++j;
10 printf("第%d个元素值为:%d\n", j, p->data);
11 p = p->next;
12 }
13 }

TravelList.c

17,TravelListBack操作,逆序输出表中元素

 1 #include"defs.h"
2
3 void TravelListBack(linklist L)
4 {
5 linklist p = L->prior;
6 while (p != L)
7 {
8 printf("%d ", p->data);
9 p = p->prior;
10 }
11 printf("\n");
12 }

TravelListBack.c

c语言实现--双向循环链表操作的更多相关文章

  1. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  2. c语言实现--单向循环链表操作

    1,什么叫单向循环链表.单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空. 2,由图可知,单向循环链表的判断条件不再是表为空了,而变成了是否到表头. 3,链表的结点表示 1 ...

  3. C语言实现双向循环链表

    #include <stdio.h> #include <stdlib.h> #include <string.h> struct list_head { stru ...

  4. 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表

    1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() ...

  5. (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作

    双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循环的链表,通过每个节点的两个指针把它们扣在一起组成一个环状.所以呢,每个节点都有前驱节点和后继节点(包括头节点和 ...

  6. 双向循环链表(C语言描述)(四)

    下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...

  7. 一种神奇的双向循环链表C语言实现

    最近在看ucore操作系统的实验指导.里面提要一个双向循环链表的数据结构,挺有意思的. 其实这个数据结构本身并不复杂.在普通链表的基础上加一个前向指针,我们就得到了双向链表,再把头尾节点连起来就是双向 ...

  8. 1.Go-copy函数、sort排序、双向链表、list操作和双向循环链表

    1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 ? 1 2 3 4 5 6 7 8 9 10 11 12 package main   imp ...

  9. 【C语言教程】“双向循环链表”学习总结和C语言代码实现!

    双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...

随机推荐

  1. VRay for SketchUp渲染图黑原因及解决方案

    很多人都遇到用Vray for SketchUp云渲染的时候,渲染出来的图片是全黑或者是局部是黑色, 这是什么原因呢? 1.有一种情况是,SketchUp的文件储存机制和其他的软件有些不同,它是把模型 ...

  2. 【SpringBoot1.x】SpringBoot1.x 任务

    SpringBoot1.x 任务 文章源码 异步任务 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的.但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使 ...

  3. 【ASM】介绍Oracle自带的一些ASM维护工具 (kfod/kfed/amdu)

    转自:http://blog.csdn.net/wenzhongyan/article/details/47043253 非常感谢作者的文章,很有价值!至此转载,非常感谢 1.前言 ASM(Autom ...

  4. top有用的开关控制命令

    [原创]本文为原创博文,转发请注明出处:https://www.cnblogs.com/dingbj/p/top_command.html 今天偶然用到top命令,在动态刷新的界面上输入h顺便看了下帮 ...

  5. 本地Mac通过堡垒机代理实现跨堡垒机scp问题

    近日,公司在跳板机前架设了堡垒机,以防止ssh攻击,但这带来一个问题,我们平常直接ssh跳板机,可以直接使用scp来上传或下载跳板机数据到本地 架设堡垒之后经常使用的scp工具不好用了 于是本期就来解 ...

  6. 1.Spring的基本应用

    1.1概述 1.1.1 Spring是什么 Spring一个轻量级的框架,以IOC(控制反转)和AOP(面向切面编程)为内核,Spring在表现层提供了Spring MVC的框架整和功能,在业务逻辑层 ...

  7. 解决window10 和 ubuntu 双系统安装没有启动选项问题

    win10 和Ubuntu 双系统安装在网上已经有很多例子了,这里就不在赘述了. 今天新买的笔记本,想安装双系统.正常安装完ubuntu 重启后没有选项. 解决方法一 下载和解压以后,按照以下的步骤安 ...

  8. :setting:`task_soft_time_limit` celery 异步任务 执行时间限制 内存限制

    https://docs.celeryproject.org/en/stable/userguide/configuration.html?highlight=control_exchange#new ...

  9. SDS——动态字符串

    Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c. SDS本质上就是char *,因为有了表头sdshdr结构的存在,所以SDS比传统C字符串在某些方面更加优秀,并 ...

  10. TCP/IP网络中的显式拥塞通告(ECN)

    当前的TCP 实现将TCP 端节点之间的中间网络视为一个不透明的"黑盒".TCP 包进入和流出这个盒子.有些时候进入盒子的包被丢失了.因为今天的数字和光媒体上出现比特级错误的机会非 ...