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

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

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

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

尾指针同理。

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

非循环链表的最后一个节点指向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语言)相关推荐

  1. 【数据结构】带头双向循环链表的增删查改(C语言实现)

    文章目录 前言 一.什么是带头双向循环链表 二.带头双向循环链表的实现 1.结构的定义 2.链表的初始化 3.开辟新节点 4.在头部插入数据 5.在尾部插入数据 6.查找数据 7.在pos位置之前插入 ...

  2. 双向循环链表:鸿蒙轻内核中数据的“驿站”

    本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二 数据结构-双向循环链表>,原文作者:zhushy . 在学习OpenHarmony鸿蒙轻内核源代码的时候,常常会遇到一些数据结构的使用. ...

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

    http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循 ...

  4. 【数据结构】双向链表(带头双向循环链表)——超详细代码

    文章目录 1. 双链表 1.1 前言 1.2 带头双向循环链表 2. 带头双向循环链表的实现 2.1 双向链表的定义声明 2.2 双向链表的初始化 2.3 释放双向链表 2.4 打印双向链表 2.5 ...

  5. 【数据结构初阶】链表(下)——带头双向循环链表的实现

    目录 带头双向循环链表的实现 1.带头双向循环链表的节点类型 2.创建带头双向循环链表的节点 3.向带头双向循环链表中插入数据 <3.1>从链表尾部插入数据 <3.2>从链表头 ...

  6. python 双向循环链表实现_python实现双向循环链表基本结构及其基本方法

    双向循环链表是在双向链表的基础上发展的,双向链表的最后一个节点指向起始节点,起始节点的上一个节点指向最后一个节点,就得到双向循环链表. 双向循环链表比双向链表具有更多的优势,节点的增加和删除有很多优化 ...

  7. 试编写一个将双向循环链表逆置的算法_图解:链表的快慢指针,解决 80% 的链表面试题!...

    一.前言 链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高.例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存 ...

  8. 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是?

    题目: 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是( D ) A p->next=s; s->prior=p; p->next->prior=s; s- ...

  9. 详解Linux内核之双向循环链表 By邪恶八进制

    [转载]详解Linux内核之双向循环链表 详解Linux内核之双向循环链表 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 摘要:      本文详解了内核中面向对象的list ...

最新文章

  1. Java项目:前台后台玩具商城系统(java+JSP+SSM+Springboot+Jsp+maven+Mysql)
  2. CSS之 background-color: rgba(255,0,0,opacity number)
  3. echarts中graphic_使用Pyecharts进行奥运会可视化分析!
  4. 使用Mapping实现的以太坊智能合约的代码
  5. 关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码
  6. zabbix邮件报警配合logging模块排错的python脚本
  7. mysql group by top_Mysql group by top N的问题 | 学步园
  8. Acwing:最长回文子串
  9. java类路径定制_设置Java类路径的注意事项
  10. 3dmax塌陷在哪里?怎么用?
  11. O2O模式的赢利点有哪些?
  12. 阴历日期和阳历日期互相转换(java)
  13. Mongodb分组查询
  14. 微信小程序 getPhoneNumber获取用户手机号
  15. 申宝公司-探底回升再续升势
  16. 免费在线鉴别邮箱是不是国外客户(真实外国人)
  17. JAVA8时间类库与JodaTime
  18. C语言中0UL 1UL什么意思
  19. 机器越“智能”,数据标注员越容易被淘汰?丨曼孚科技
  20. C++堆空间和栈空间的区别

热门文章

  1. C#中的高级测试驱动开发
  2. 基于matlab的车牌定位算法设计与实现,matlab车牌定位系统设计(源码+文档)
  3. mysql json 引号 双引号_关于JSON字符串key缺少双引号的解决方法 的讲解
  4. 用thymeleaf转化日期格式的方法
  5. php做姓名隐藏,PHP只显示姓名首尾字符,隐藏中间字符并用*替换
  6. java中el是什么_java中jsp的EL的定义以及使用
  7. android 插入gif,android – Gboard:在EditText上启用GIF插入
  8. 在c语言中数据类型高低,C语言的数据类型
  9. 在java 中调c_在Java中调用C
  10. Qt实现Linux下模拟点击界面,如何利用QT实现模拟鼠标点击?