链表大概分为有无头指针,有无尾指针,是否循环,单向还是双向,

这些都很简单,前提是你要把指针和单链表理解透彻。这些都是基于单链表

的变形,要根据实际问题,选择链表的类型。

  头指针的指针域储存着储存头节点的地址,其数据域我们不使用。

尾指针同理。

  循环链表的最后一个节点指向头节点(如果有头指针,则是指向头指针),

非循环链表的最后一个节点指向NUll。

  单向链表只有一个指针域,且指向下一个节点地址,

而双向链表有两个指针域,一个指向该节点的上一个节点地址,

另一个指向该节点的下一个节点地址。  

  构建链表节点:

 #define ElemType int //链表元素类型

 //线性表的双向链表储存结构
typedef struct DuLNode {
ElemType data; //数据域
struct DuLNode *prior; //前驱指针域
struct DuLNode *next; //后继指针域 }DuLNode;

  如果d为指向链表中某一个节点的指针  则显然满足

d->next->prior=d->prior->next=d
//d->next 表示d的上一个节点
//d->next->prior 表示d的上一个节点的下一个节点 即d本身
//-_-!有点绕啊

  双向循环链表中有一些操作只需要一个方向的指针,比如计算链表长度(这里全局变量iCount即为长度),

查找元素,返回元素位置等等(这些我都不想写 请原谅我的懒-_-)  ,当然涉及两个方向的指针我都会贴出来的。

  

 #include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define ElemType int //链表元素类型
int iCount; // 定义全局变量 表示链表长度
//线性表的双向链表储存结构
typedef struct DuLNode {
ElemType data; //数据域
struct DuLNode *prior; //前驱指针域
struct DuLNode *next; //后继指针域 }DuLNode;
//创建链表
DuLNode *CreateDuLNode() {
DuLNode *pHead , *pEnd, *pNew;
//头指针的初始化
pHead=(DuLNode*)malloc(sizeof(DuLNode));
pHead->prior = NULL;
pHead->next = NULL;
if (!pHead) exit(); pNew = pEnd = (DuLNode*)malloc(sizeof(DuLNode));
if (!pNew) exit();
scanf("%d", &pNew->data);
while (pNew->data != ) //读取到0结束
{
iCount++;
if (iCount == )
{
pNew->prior= pHead;
pNew->next = NULL;
pHead->next = pNew;
pEnd = pNew; }
else
{
pNew->prior = pEnd;
pNew->next = NULL;
pEnd->next = pNew;
pEnd = pNew;
}
pNew = (DuLNode*)malloc(sizeof(DuLNode));
if (!pNew) exit();
scanf("%d", &pNew->data); }
free(pNew); //释放多余的空间
pHead->prior = pEnd; //形成
pEnd->next = pHead; // 双循环
return pHead;
}
//插入节点
int DuLInsert(DuLNode *p, int i, DuLNode *s) {
/*在带头指针的的双链循环线性表p中的第i个位置
之前插入节点s,i的合法值为1<=i<=表长(头指针不算长度)+1
i取最小值头插,i取最大值尾插*/
DuLNode *q;
if (i< || i>iCount + ) //i的值不合法
return ERROR; if (i == iCount + ) //在p中确定第i个元素的位置 指针q
q = p;
else
for (q = p; i > ; i--)
q = q->next;
//先插入 后修改 防止断链
q->prior->next = s;
s->prior = q->prior;
q->prior = s;
s->next = q; return OK;
}
//删除第i个节点,并用e返回删除值
int DuLDelete(DuLNode *p, int i, ElemType *e) {
/*在带头指针的的双链循环线性表p中的第i个位置
之前插入节点s,i的合法值为1<=i<=表长(头指针不算长度)+1
i取最小值头删,i取最大值尾删*/
DuLNode *q;
if (i< || i>iCount + ) //i的值不合法
return ERROR; //在p中确定第i个元素的位置 指针q
for (q = p; i > ; i--)
q = q->next; *e = q->data;
q->prior->next = q->next;
q->next->prior = q->prior;
free(q); return OK;
}

双向循环链表涉及双向指针的基本操作(C语言)的更多相关文章

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

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

  2. (java实现)双向循环链表

    什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的 ...

  3. C++实现双向循环链表

    本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表中,已经给大家分析了双向循环链表的结构,并以图示的方式给大家解释了双向循环链表的基本操 ...

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

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

  5. python实现 双向循环链表

    最近身边的朋友在研究用python来实现数据结构.遇到一个问题就是双向循环链表的实现,改指向的时候总是发蒙. 我自己尝实现了一个python的双向循环链表.附上代码,希望对大家有帮助. 如果不懂什么是 ...

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

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

  7. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  8. 双向循环链表的Java版本实现

    1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...

  9. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

随机推荐

  1. 牛客练习赛15A-吉姆的运算式(Python正则表达式瞎搞)

    传送门 题意:出现的数字,取最后一个数字即可. Python正则表达式提取数字 代码: import re str = input() a = re.findall(r'\-*\d+(?:\.\d+) ...

  2. Unity性能优化 – 脚本篇

    https://wuzhiwei.net/unity_script_optimization/

  3. ES6之Promise对象

    创建Promise对象 function getHtml(url) { return new Promise((resolve, reject) => { let xhr = new XMLHt ...

  4. stm32初做项目心得

    在导师的带领下,基本了解了嵌入式的开发的基本流程: 1.首先从厂家拿到样板之后,首先进行检测,检测什么呢,先检测电源系统,看你的电源系统是否能够正常工作,就是各个管脚是否短路,断路. 2.检测完之后, ...

  5. Python: 浅淡Python中的属性(property)

    起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...

  6. stark组件之启动【模仿Django的admin】

    首先需要在settings注册app INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib ...

  7. 模拟点击事件在alert前不起作用

    本来想在ajax提交前点击一下模态框,直到返回处理之前都显示正在保存,发现如标题的现象,几经折腾没找到解决办法,发现可能是 alert线程阻塞(冒泡)引起的,也没找到解决办法,于是借助第三方插件lay ...

  8. Java IO如何读写文件

    Java把这些不同来源和目标的数据都统一抽象为数据流:Java语言的输入输出功能是十分强大而灵活的:在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上 ...

  9. asp.net core webapi iis jquery No 'Access-Control-Allow-Origin' header is present on访问跨域问题

    我的解决方案是:设置特定method允许所有请求源访问,具体看业务需求 第一步:starup文件下ConfigureServices中增加如下配置 //跨域//设置了允许所有来源 services.A ...

  10. springMvc入门--初识springMvc

    springMvc是什么 springmvc是表现层的框架,是一个spring的表现层组件.是整个spring框架的一部分,但是也可以不使用springmvc.跟struts2框架功能类似.其中的mv ...