带头结点双向链表的内存分布情况


头文件

#pragma once
//双向链表
typedef struct DNode
{int data;DNode* next;DNode* prio;
}DNode , *DList ;//初始化
void InitList(DList plist);//头插法
bool Insert_head(DList plist,int val);//尾插法
bool Insert_tail(DList plist,int val);//在pos下标插入数据val
bool Insert_pos(DList plist,int pos,int val);//查找,找到返回节点地址,没有找到返回NULL
DNode *Search(DList plist,int key);//删除第一个key对应的节点
bool Delete(DList plist,int key);//删除第一个数据节点,并通过rtval获得删除的值
bool Delete_head(DList plist,int *rtval);//删除最后一个数据节点,并通过rtval获得删除的值
bool Delete_tail(DList plist,int *rtval);//获取长度,统计数据节点的个数
int GetLength(DList plist);//判空
bool IsEmpty(DList plist);//清除所以数据
void Clear(DList plist);//销毁所有节点
void Destroy(DList plist);//打印
void Show(DList plist);//反转
void Reverse(DList plist);

cpp文件

#include<stdlib.h>
#include<assert.h>
#include"dlist.h"
#include<stdio.h>
//初始化
void InitList(DList plist)
{assert(plist != NULL);if(plist == NULL){return ;}plist->next = NULL;plist->prio = NULL;
}
static DNode *BuyNode(int val)
{DNode* p = (DNode*) malloc (sizeof(DNode));p->data = val;return p;
}//头插法
bool Insert_head(DList plist,int val)
{DNode * p = BuyNode(val);assert(plist != NULL);if(plist  == NULL){return false;}if(plist->next != NULL){plist->next->prio = p;}p->prio = plist;p->next = plist ->next;plist->next = p;return true;
}//尾插法
bool Insert_tail(DList plist,int val)
{DNode * p = BuyNode(val);assert(plist != NULL);if(plist  == NULL){return false;}DNode *q;for(q = plist;q->next!= NULL;q = q->next);//将p 插在q 的后面q->next =p;p->prio =q;p->next = NULL;return true;
}//在pos下标插入数据val
bool Insert_pos(DList plist,int pos,int val)
{DNode * p = BuyNode(val);assert(plist != NULL);if(plist  == NULL){return false;}DNode *q;int i = 0;for( q =plist->next; q!= NULL && i<pos;q = q->next);if(i < 0){return false;}p->next = q->next;p->prio = q;q->next = p;return true;
}//查找,找到返回节点地址,没有找到返回NULL
DNode *Search(DList plist,int key)
{assert(plist != NULL);if(plist == NULL){return false;}for(DNode *p = plist->next;p != NULL;p = p->next){if(p->data == key){return p;}}return NULL;}//删除第一个key对应的节点
bool Delete(DList plist,int key)
{assert(plist != NULL);if(plist == NULL){return false;}DNode * p =Search(plist,key);if(p == NULL){return false;}p->prio->next = p->next;if(p->next != NULL){p->next->prio = p->prio;}free(p);return true;}//删除第一个数据节点,并通过rtval获得删除的值
bool Delete_head(DList plist,int *rtval)
{assert(plist != NULL);if(plist != NULL || plist->next == NULL){return false;}if(rtval != NULL){*rtval = plist->data;}DNode *p = plist->next;plist->next = p->next;p->next ->prio = plist;free(p);return true;
}//删除最后一个数据节点,并通过rtval获得删除的值
bool Delete_tail(DList plist,int *rtval)
{assert(plist != NULL);if(plist == NULL || plist->next == NULL){return false;}DNode *p = plist ;DNode *q;for(q = plist; q->next != NULL;q = q->next);q->next = p;if(rtval != NULL){*rtval = p->data;}q->next = NULL;free(p);return true;
}//获取长度,统计数据节点的个数
int GetLength(DList plist)
{int length = 0;for(DNode *p=plist->next;p!=NULL;p=p->next){length++;}return length;
}//判空
bool IsEmpty(DList plist)
{return plist->next == NULL;
}//清除所有数据
void Clear(DList plist)
{Destroy(plist);
}//销毁所有节点
void Destroy(DList plist)
{DNode *p;while(plist->next != NULL){p = plist->next;plist->next = p->next;free(p);}
}//打印
void Show(DList plist)
{for(DNode *p=plist->next;p!=NULL;p=p->next){printf("%d ",p->data);}printf("\n");
}//反转
void Reverse(DList plist)
{DNode * q;DNode * p  = plist->next;while(p != NULL){q = p;p = p->next;q->next = plist ->next;plist ->next = p;}}

主函数

#include<stdio.h>
#include<stdlib.h>
#include"dlist.h"
int main()
{DNode dlist;InitList(&dlist);for(int i=0;i<10;i++){Insert_head(&dlist,i);}Show(&dlist);Reverse(&dlist);Show(&dlist);return 0;
}

双向链表(带头结点)相关推荐

  1. 带头结点双向循环 -- 双向链表

    目录 一.双向链表初始化 二.尾插 问题1:什么时候传一级指针,什么时候传二级指针呢? 三.打印 四.尾删 五.头插 六.头删 七.pos之前插入 八.删除pos位置的节点 九.销毁链表 总代码: L ...

  2. c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...

    对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾 ...

  3. C语言实现双向非循环链表(不带头结点)的基本操作

    双向链表也叫双链表,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任何一个节点开始,都可以很方便的访问它的前驱结点和后继节点.别人常常来构造双向循环链表,今天我们特立 ...

  4. 数据结构——带头结点双向循环链表

    相比较与单链表,双向循环链表每个结点多了一个prev指针域,用于指向该结点的前驱,并且链表的头尾结点也用指针域相连.所以对于带头结点的双向循环链表的判空条件为head->next=head;除此 ...

  5. 数据结构_带头结点的双向循环链表

    这篇博客整理带头结点的双向循环链表.带头结点的双向循环链表在进行操作的时候是要比单链表更方便的,比如说在尾删的时候,不需要遍历整个链表,头结点的上一个结点就是尾结点.凡是涉及到寻找尾结点的操作,都会比 ...

  6. java不带头结点单链表,java带头结点的单链表

    JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...

  7. 带头结点的线性表的链式实现

    复习了顺序实现后,自己模仿着写了链式实现 /*** @author lirui 带头结点的线性表的链式实现*/ public class MyLinkList<T> {// 内部类LNod ...

  8. 带头结点的单链表的逆置

    代码 //带头结点的单链表逆置.cpp #include<iostream> using namespace std; struct Node{ int data; Node* next; ...

  9. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

最新文章

  1. a标签跳页传参,以及截取URL参数
  2. java中的默认排序规则,C#中列表,集合排序Sort,OrderBy与Java排序规则默认不一致...
  3. 使用共享网口方式访问BMC管理控制器
  4. 配置DNS辅助服务器:DNS系列之四
  5. Android之提示Method return type must not include a type variable or wildcard:
  6. 从功能、交互、性能全方位解读,BI工具FineBI4.0.2测评报告
  7. ENVI Flaash大气校正与6S大气校正(TM为例)
  8. 微信小程序搜索排名算法
  9. lodop 调用打印机打印条码
  10. 数据筛选特征方法-方差法
  11. 事务Transaction的理解(一)
  12. 命令行把java项目打成jar包
  13. 《Cloud Native Data Center Network》读书笔记-1
  14. apple store 爬虫
  15. 第一册:lesson thirteen.
  16. 工作小记-Linux磁盘空间告警
  17. Spring、Spring MVC、Spring Boot对比
  18. 【UEFI基础】Shell下的命令(一)
  19. 前端设计师常用的一些基础工具素材合集
  20. 【Mysql】DQL语法及其使用

热门文章

  1. sstableloader工具使用及原理解析
  2. 一张图看懂阿里企业级分布式应用服务EDAS
  3. Redis 使用 List 实现消息队列的利与弊
  4. 倒计时 3 天!1024 程序员节全日程曝光,105 场深度演讲点燃数字经济新时代
  5. 实现工具自由!开源的桌面工具箱
  6. 循环队列的java结构_java数据结构之循环队列(数组实现)
  7. powershell快捷键_借助Windows Terminal搞一个花里胡哨的PowerShell终端
  8. sql中“delete from 表名”表示_SQL查询语句知识点总结
  9. mysql管理器源码_一个HelloWorld版的MySQL数据库管理器的设计与实现(源码)
  10. SpringBoot2.x Flowable 6.4.2 开源项目