双向循环链表涉及双向指针的基本操作(C语言)
链表大概分为有无头指针,有无尾指针,是否循环,单向还是双向,
这些都很简单,前提是你要把指针和单链表理解透彻。这些都是基于单链表
的变形,要根据实际问题,选择链表的类型。
头指针的指针域储存着储存头节点的地址,其数据域我们不使用。
尾指针同理。
循环链表的最后一个节点指向头节点(如果有头指针,则是指向头指针),
非循环链表的最后一个节点指向NUll。
单向链表只有一个指针域,且指向下一个节点地址,
而双向链表有两个指针域,一个指向该节点的上一个节点地址,
另一个指向该节点的下一个节点地址。
构建链表节点:
1 #define ElemType int //链表元素类型 2 3 //线性表的双向链表储存结构 4 typedef struct DuLNode { 5 ElemType data; //数据域 6 struct DuLNode *prior; //前驱指针域 7 struct DuLNode *next; //后继指针域 8 9 }DuLNode;
如果d为指向链表中某一个节点的指针 则显然满足
d->next->prior=d->prior->next=d
//d->next 表示d的上一个节点
//d->next->prior 表示d的上一个节点的下一个节点 即d本身
//-_-!有点绕啊
双向循环链表中有一些操作只需要一个方向的指针,比如计算链表长度(这里全局变量iCount即为长度),
查找元素,返回元素位置等等(这些我都不想写 请原谅我的懒-_-) ,当然涉及两个方向的指针我都会贴出来的。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define OK 1 4 #define ERROR 0 5 #define ElemType int //链表元素类型 6 int iCount; // 定义全局变量 表示链表长度 7 //线性表的双向链表储存结构 8 typedef struct DuLNode { 9 ElemType data; //数据域 10 struct DuLNode *prior; //前驱指针域 11 struct DuLNode *next; //后继指针域 12 13 }DuLNode; 14 //创建链表 15 DuLNode *CreateDuLNode() { 16 DuLNode *pHead , *pEnd, *pNew; 17 //头指针的初始化 18 pHead=(DuLNode*)malloc(sizeof(DuLNode)); 19 pHead->prior = NULL; 20 pHead->next = NULL; 21 if (!pHead) exit(0); 22 23 pNew = pEnd = (DuLNode*)malloc(sizeof(DuLNode)); 24 if (!pNew) exit(0); 25 scanf("%d", &pNew->data); 26 while (pNew->data != 0 ) //读取到0结束 27 { 28 iCount++; 29 if (iCount == 1) 30 { 31 pNew->prior= pHead; 32 pNew->next = NULL; 33 pHead->next = pNew; 34 pEnd = pNew; 35 36 } 37 else 38 { 39 pNew->prior = pEnd; 40 pNew->next = NULL; 41 pEnd->next = pNew; 42 pEnd = pNew; 43 } 44 pNew = (DuLNode*)malloc(sizeof(DuLNode)); 45 if (!pNew) exit(0); 46 scanf("%d", &pNew->data); 47 48 } 49 free(pNew); //释放多余的空间 50 pHead->prior = pEnd; //形成 51 pEnd->next = pHead; // 双循环 52 return pHead; 53 } 54 //插入节点 55 int DuLInsert(DuLNode *p, int i, DuLNode *s) { 56 /*在带头指针的的双链循环线性表p中的第i个位置 57 之前插入节点s,i的合法值为1<=i<=表长(头指针不算长度)+1 58 i取最小值头插,i取最大值尾插*/ 59 DuLNode *q; 60 if (i<1 || i>iCount + 1) //i的值不合法 61 return ERROR; 62 63 if (i == iCount + 1) //在p中确定第i个元素的位置 指针q 64 q = p; 65 else 66 for (q = p; i > 0; i--) 67 q = q->next; 68 //先插入 后修改 防止断链 69 q->prior->next = s; 70 s->prior = q->prior; 71 q->prior = s; 72 s->next = q; 73 74 return OK; 75 } 76 //删除第i个节点,并用e返回删除值 77 int DuLDelete(DuLNode *p, int i, ElemType *e) { 78 /*在带头指针的的双链循环线性表p中的第i个位置 79 之前插入节点s,i的合法值为1<=i<=表长(头指针不算长度)+1 80 i取最小值头删,i取最大值尾删*/ 81 DuLNode *q; 82 if (i<1 || i>iCount + 1) //i的值不合法 83 return ERROR; 84 85 //在p中确定第i个元素的位置 指针q 86 for (q = p; i > 0; i--) 87 q = q->next; 88 89 90 *e = q->data; 91 q->prior->next = q->next; 92 q->next->prior = q->prior; 93 free(q); 94 95 96 return OK; 97 }
转载于:https://www.cnblogs.com/mwq1024/p/10148079.html
双向循环链表涉及双向指针的基本操作(C语言)相关推荐
- 【数据结构】带头双向循环链表的增删查改(C语言实现)
文章目录 前言 一.什么是带头双向循环链表 二.带头双向循环链表的实现 1.结构的定义 2.链表的初始化 3.开辟新节点 4.在头部插入数据 5.在尾部插入数据 6.查找数据 7.在pos位置之前插入 ...
- 双向循环链表:鸿蒙轻内核中数据的“驿站”
本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二 数据结构-双向循环链表>,原文作者:zhushy . 在学习OpenHarmony鸿蒙轻内核源代码的时候,常常会遇到一些数据结构的使用. ...
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循 ...
- 【数据结构】双向链表(带头双向循环链表)——超详细代码
文章目录 1. 双链表 1.1 前言 1.2 带头双向循环链表 2. 带头双向循环链表的实现 2.1 双向链表的定义声明 2.2 双向链表的初始化 2.3 释放双向链表 2.4 打印双向链表 2.5 ...
- 【数据结构初阶】链表(下)——带头双向循环链表的实现
目录 带头双向循环链表的实现 1.带头双向循环链表的节点类型 2.创建带头双向循环链表的节点 3.向带头双向循环链表中插入数据 <3.1>从链表尾部插入数据 <3.2>从链表头 ...
- python 双向循环链表实现_python实现双向循环链表基本结构及其基本方法
双向循环链表是在双向链表的基础上发展的,双向链表的最后一个节点指向起始节点,起始节点的上一个节点指向最后一个节点,就得到双向循环链表. 双向循环链表比双向链表具有更多的优势,节点的增加和删除有很多优化 ...
- 试编写一个将双向循环链表逆置的算法_图解:链表的快慢指针,解决 80% 的链表面试题!...
一.前言 链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高.例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存 ...
- 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是?
题目: 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是( D ) A p->next=s; s->prior=p; p->next->prior=s; s- ...
- 详解Linux内核之双向循环链表 By邪恶八进制
[转载]详解Linux内核之双向循环链表 详解Linux内核之双向循环链表 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 摘要: 本文详解了内核中面向对象的list ...
最新文章
- Java项目:前台后台玩具商城系统(java+JSP+SSM+Springboot+Jsp+maven+Mysql)
- CSS之 background-color: rgba(255,0,0,opacity number)
- echarts中graphic_使用Pyecharts进行奥运会可视化分析!
- 使用Mapping实现的以太坊智能合约的代码
- 关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码
- zabbix邮件报警配合logging模块排错的python脚本
- mysql group by top_Mysql group by top N的问题 | 学步园
- Acwing:最长回文子串
- java类路径定制_设置Java类路径的注意事项
- 3dmax塌陷在哪里?怎么用?
- O2O模式的赢利点有哪些?
- 阴历日期和阳历日期互相转换(java)
- Mongodb分组查询
- 微信小程序 getPhoneNumber获取用户手机号
- 申宝公司-探底回升再续升势
- 免费在线鉴别邮箱是不是国外客户(真实外国人)
- JAVA8时间类库与JodaTime
- C语言中0UL 1UL什么意思
- 机器越“智能”,数据标注员越容易被淘汰?丨曼孚科技
- C++堆空间和栈空间的区别
热门文章
- C#中的高级测试驱动开发
- 基于matlab的车牌定位算法设计与实现,matlab车牌定位系统设计(源码+文档)
- mysql json 引号 双引号_关于JSON字符串key缺少双引号的解决方法 的讲解
- 用thymeleaf转化日期格式的方法
- php做姓名隐藏,PHP只显示姓名首尾字符,隐藏中间字符并用*替换
- java中el是什么_java中jsp的EL的定义以及使用
- android 插入gif,android – Gboard:在EditText上启用GIF插入
- 在c语言中数据类型高低,C语言的数据类型
- 在java 中调c_在Java中调用C
- Qt实现Linux下模拟点击界面,如何利用QT实现模拟鼠标点击?