双向循环链表涉及双向指针的基本操作(C语言)
链表大概分为有无头指针,有无尾指针,是否循环,单向还是双向,
这些都很简单,前提是你要把指针和单链表理解透彻。这些都是基于单链表
的变形,要根据实际问题,选择链表的类型。
头指针的指针域储存着储存头节点的地址,其数据域我们不使用。
尾指针同理。
循环链表的最后一个节点指向头节点(如果有头指针,则是指向头指针),
非循环链表的最后一个节点指向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语言)的更多相关文章
- C语言通用双向循环链表操作函数集
说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低. 可基于该函数集方便地构造栈或队列集. 本函数集暂未考虑并发保护. 一 ...
- (java实现)双向循环链表
什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的 ...
- C++实现双向循环链表
本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表中,已经给大家分析了双向循环链表的结构,并以图示的方式给大家解释了双向循环链表的基本操 ...
- 【C语言教程】“双向循环链表”学习总结和C语言代码实现!
双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...
- python实现 双向循环链表
最近身边的朋友在研究用python来实现数据结构.遇到一个问题就是双向循环链表的实现,改指向的时候总是发蒙. 我自己尝实现了一个python的双向循环链表.附上代码,希望对大家有帮助. 如果不懂什么是 ...
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循环的链表,通过每个节点的两个指针把它们扣在一起组成一个环状.所以呢,每个节点都有前驱节点和后继节点(包括头节点和 ...
- 双向链表、双向循环链表的JS实现
关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法: 单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...
- 双向循环链表的Java版本实现
1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
随机推荐
- centos openvpn 安装
安装环境: 系统:centos 6.5 openvpn:openvpn-2.2.1 lzo:lzo-2.09 下载地址:http://www.oberhumer.com/opensource/l ...
- HDU-2612.Find way .(不同起点不同终点的BFS)
我要被这个好用的memset气死了...... 真香 #include <cstring> #include <string> int main () { ]; memset( ...
- 1. Two Sum (快速排序;有序数组的查找: 两个指针; 哈希表)
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Python+Selenium学习--分页处理
场景 我们在测试一个web 应用时,经常出现翻页的情况,下面介绍翻页场景 代码 #!/usr/bin/env python # -*- codinfg:utf-8 -*- ''' @author: J ...
- linux ubuntu 18.04 无线网卡 rtl8821ce的安装
解压rtl8821ce.zip 修改makefile,在shell中输入pwd,查看当前文件的路径,之后在Makefile中查找export Topdir ?= /home/zzm/Download ...
- Django1.0和2.0中的rest_framework的序列化组件之超链接字段的处理
大家看到这个标题是不是有点懵逼,其实我就是想要一个这样的效果 比如我get一条书籍的数据,在一对多的字段中我们显示一个url,看起来是不是很绚! 下面我们就来实现这么一个东西 首先我们一对多字段中的一 ...
- 不通过调用__Init__来创建实例
老样子,抛出个问题,我们想要创建一个实例,但是由于某些原因想绕过__init__方法,用别的方式来进行创建. 举个栗子 小贱贱反序列化数据,或者说实现一个类方法将其作为备选的构造函数,都属于这种情况. ...
- c#异步等待
1:一直等待 2方法 现实等待 3:方法 带返回值得 begin -endinvoke 4: func 带返回值
- 23.Mysql应用优化
23.应用优化23.1 使用连接池应用启动时创建好连接,以供用户使用,而不是每次创建. 23.2 减少对Mysql的访问 23.2.1 避免对同一数据做重复检索合并简单查询,减少访问次数. 23.2. ...
- PDO 代码
<?php try{ $dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root&qu ...