双向循环链表涉及双向指针的基本操作(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实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
随机推荐
- phpStudy安装教程
1.在phpStudy官网下载安装包(http://phpstudy.php.cn/)2.解压安装后,若提示没有“VC9.VC11.VC14运行库,注意是X86 32位”,则在phpStudy下载对应 ...
- 205. Isomorphic Strings (Map)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- 图片Bitmap在本地的存储与读取 File
将Bitmap存储到本地: public void SaveImage(Bitmap image, String user_id){ //照片通常存在DCIM文件夹中 String sdCardDir ...
- 我的图片爬虫demo
本来是根据scrapy教程写了一个下载图片的简易爬虫,但是搞了一天,死活下载不了图片. 然后换了一个网站,用原生的库写了一个图片爬虫. import urllib.requestimport osde ...
- 计算Python运行时间
可以调用datetime 或者 time库实现得到Python运行时间 方法1 import datetime start_t = datetime.datetime.now() #运行大型代码 e ...
- swift - scrollview 判断左右移动, 以及上下两个view联动
核心代码 1. 2. 3. 界面代码VFL /* 浏览作品view*/ import UIKit /** * 图片浏览器(大图和缩略图) */ class JYBrowseWorksView: UIV ...
- 微信小程序中用setData修改一个对象的属性值
原创文章 1. Page({ data: { items:{ //items为一个对象,is_like和like分别为其两个属性 is_like: 0, like: 0 ...
- 记录css的常用属性
background-color:背景颜色 color:字体颜色 text-align:标签内容的位置 margin-left:左外边距 font-size:字体大小 font_family:字体格式 ...
- 以太坊测试网络搭建以及RPC服务开启-配置注意事项
.Eth QA Test环境: 数据文件路径: C:\Users\Administrator\AppData\Roaming\Ethereum console启动参数: --rpc --testnet ...
- 9.10 h5日记
9.10 1.什么是属性 属性是表示某些事物的一些特征 2.属性分为标签属性和样式属性,二者的区别在于哪里 标签属性:<img src="01.jpg" width=&quo ...