使用C++实现双链表

  • 使用C++实现双链表

    一、什么是双链表?

    二、双链表的初始化

    三、打印双链表

    四、获取有效长度

    五、使用头插法创建双链表

    六、使用尾插法创建双链表

    七、按值查找双链表

    八、按位查找双链表

    九、在双链表中插入数据

    十、删除节点

    完整代码

    代码运行截


一、什么是双链表?

由下图就是一个双链表节点以及c++定义双链表节点!

typedef struct DNode {//定义双链表节点结构体DNode* pre;//前驱指针int data;//数据域DNode* next;//后继指针
}DNode,*LinkList;//定义双链表节点和双链表

提示:以下是本篇文章正文内容,下面案例可供参考

二、双链表的初始化

//1.初始化双链表节点
bool InitList(LinkList& L) {L = new DNode;if (!L) {cout << "申请节点失败!" << endl;return false;}else {L->next = NULL;//初始化后继指针L->pre = NULL;//初始化前驱指针//cout << "申请节点成功!" << endl;return true;}
}

三、打印双链表

//2.打印双链表
bool PrintList(LinkList& L) {if (L->next == NULL) { cout << "该双链表不存在!" << endl;return false; }//判断是否是空链表DNode* p = L->next;while (p){cout << p->data << " ";//打印数据p = p->next;//向后移动指针}cout << endl;return true;
}

四、获取有效长度

//3.获取有效长度
int Length(LinkList& L) {DNode* p = L->next;//申请一个新节点int lenth = 0;//该变量用来保存长度while (p) {//p不为空时执行lenth++;//长度加1p = p->next;//节点向后移动}cout << endl;//只是为了换行return lenth;
}

五、使用头插法创建双链表

bool ListHeadInsert(LinkList& L) {int x;cout << "请输入元素的个数:" ;cin >> x;if (x <= 0) {cout << "您输入的值无意义!" << endl;return false;}cout << "请依次输入元素的值!"<<endl;while (x) {DNode* p = new DNode;//申请一个新节点cin >> p->data;//为新节点输入数据p->next = L->next;//将头节点的后继指针赋给新节点p->pre = L;//再让新节点的前驱指针指向头节点L->next = p;//移动头节点x--;//判断循环条件}cout << "采用头插法成功创建的双链表结果为:";PrintList(L);//打印双链表return true;
}

六、使用尾插法创建双链表

bool TailInsert(LinkList& L) {DNode* p = new DNode;//申请一个节点InitList(p);//初始化新节点L= p;//让新节点赋给头节点int x;cout << "请输入元素的个数:";cin >> x;if (x <= 0) {cout << "您输入的值无意义!" << endl;return false;}cout << "请依次输入元素的值!" << endl;while (x) {DNode* r = new DNode;//再申请一个新节点InitList(r);//初始化这个新节点cin >> r->data;//为这个新节点添加数据p->next = r;//让头节点之后的第一个节点指向这个新节点r->pre = p;//让新节点的前驱指针指向头节点p = p->next;//让头节点向后移动,目的是为了连接所有的节点x--;//判断循环并退出}cout << "采用尾插法成功创建的双链表结果为:";PrintList(L);//打印双链表return true;
}

七、按值查找双链表

bool GetValueElem(LinkList& L) {DNode* p = L->next;int x;cout << "请输入你要查找的值!" << endl;cin >> x;while (p) {if (p->data == x) {cout << "您要查找的值"<<x<<"存在!" << endl;return true;}p = p->next;}cout << "抱歉!您要查找的值"<<x<<"不存在!" << endl;return false;
}

八、按位查找双链表

bool GetBitElem(LinkList& L) {DNode* p = L->next;int x;cout << "请输入你要查找的位:";cin >> x;int t = Length(L);if (x<1 || x>t) {cout << "你要查的位不存在或无意义!" << endl;return false;}else {while (p){x--;p = p->next;if (x == 1) {cout << "按位查找成功!且该数据为:" << p->data << endl;return true;}}}
}

九、在双链表中插入数据

bool Insert(LinkList& L) {int x;cout << "请输入你要插入的位数!" << endl;cin >> x;if (x<1 || x>Length(L)) {cout << "你要插入的位数不存在或无意义!" << endl;return false;}int Value;cout << "请输入你要插入的值:" ;cin >> Value;DNode* p = L;DNode* r;InitList(r);while (x) {if (x == 1) {//成功找到了要插入的节点的前一个节点r->data = Value;//将数据保存到新节点中r->next = p->next;//让新节点指向第一个节点p->next->pre = r;//让第二个节点的前驱指针指向新节点r->pre = p;//让新节点的前驱指针指向第一个节点p->next = r;//让第一个节点的后继指针指向新节点cout << "添加成功后的双链表是";PrintList(L);//打印单链表}else p = p->next;//没有找到想要插入的节点,向后移动节点x--;}return false;
}

十、删除节点

bool Delete(LinkList& L) {int x;cout << "请输入你要删除的节点;";cin >> x;if (x<1 || x>Length(L)) {cout << "您想删除的节点不存在或无意义!" << endl;return false;}else {DNode* p = L;DNode* r;InitList(r);while (x){if (x == 1) {r->next = p->next;//新节点指向要删除的节点p->next->pre = r;//让要删除节点的前驱指针指向新节点p->next = r->next->next;//让被删除节点的前一个指向要删除的后一个节点free(r);cout << "删除成功!" << endl;cout << "删除后的双链表是"  ;PrintList(L);//打印单链表return true;}p = p->next;//没有找到想要插入的节点,向后移动节点x--;}return false;}
}

完整代码

以下代码运行在Visual Studio2019编译器下运行成功!

#include<iostream>
#include <stdio.h>
#include <string>using namespace std;typedef struct DNode {//定义双链表节点结构体DNode* pre;//前驱指针int data;//数据域DNode* next;//后继指针
}DNode,*LinkList;//定义双链表节点和双链表//1.初始化双链表节点
bool InitList(LinkList& L) {L = new DNode;if (!L) {cout << "申请节点失败!" << endl;return false;}else {L->next = NULL;//初始化后继指针L->pre = NULL;//初始化前驱指针//cout << "申请节点成功!" << endl;return true;}
}
//2.打印双链表
bool PrintList(LinkList& L) {if (L->next == NULL) { cout << "该双链表不存在!" << endl;return false; }//判断是否是空链表DNode* p = L->next;while (p){cout << p->data << " ";//打印数据p = p->next;//向后移动指针}cout << endl;return true;
}
//3.获取有效长度
int Length(LinkList& L) {DNode* p = L->next;//申请一个新节点int lenth = 0;//该变量用来保存长度while (p) {//p不为空时执行lenth++;//长度加1p = p->next;//节点向后移动}cout << endl;//只是为了换行return lenth;
}
//4.创建双链表
//(1)采用头插入法
bool ListHeadInsert(LinkList& L) {int x;cout << "请输入元素的个数:" ;cin >> x;if (x <= 0) {cout << "您输入的值无意义!" << endl;return false;}cout << "请依次输入元素的值!"<<endl;while (x) {DNode* p = new DNode;//申请一个新节点cin >> p->data;//为新节点输入数据p->next = L->next;//将头节点的后继指针赋给新节点p->pre = L;//再让新节点的前驱指针指向头节点L->next = p;//移动头节点x--;//判断循环条件}cout << "采用头插法成功创建的双链表结果为:";PrintList(L);//打印双链表return true;
}
//(2)尾插入法
bool TailInsert(LinkList& L) {DNode* p = new DNode;//申请一个节点InitList(p);//初始化新节点L= p;//让新节点赋给头节点int x;cout << "请输入元素的个数:";cin >> x;if (x <= 0) {cout << "您输入的值无意义!" << endl;return false;}cout << "请依次输入元素的值!" << endl;while (x) {DNode* r = new DNode;//再申请一个新节点InitList(r);//初始化这个新节点cin >> r->data;//为这个新节点添加数据p->next = r;//让头节点之后的第一个节点指向这个新节点r->pre = p;//让新节点的前驱指针指向头节点p = p->next;//让头节点向后移动,目的是为了连接所有的节点x--;//判断循环并退出}cout << "采用尾插法成功创建的双链表结果为:";PrintList(L);//打印双链表return true;
}
// 5.查找双链表
//(1)按值查找
bool GetValueElem(LinkList& L) {DNode* p = L->next;int x;cout << "请输入你要查找的值!" << endl;cin >> x;while (p) {if (p->data == x) {cout << "您要查找的值"<<x<<"存在!" << endl;return true;}p = p->next;}cout << "抱歉!您要查找的值"<<x<<"不存在!" << endl;return false;
}
//(2)按位查找
bool GetBitElem(LinkList& L) {DNode* p = L->next;int x;cout << "请输入你要查找的位:";cin >> x;int t = Length(L);if (x<1 || x>t) {cout << "你要查的位不存在或无意义!" << endl;return false;}else {while (p){x--;p = p->next;if (x == 1) {cout << "按位查找成功!且该数据为:" << p->data << endl;return true;}}}
}
bool Insert(LinkList& L) {int x;cout << "请输入你要插入的位数!" << endl;cin >> x;if (x<1 || x>Length(L)) {cout << "你要插入的位数不存在或无意义!" << endl;return false;}int Value;cout << "请输入你要插入的值:" ;cin >> Value;DNode* p = L;DNode* r;InitList(r);while (x) {if (x == 1) {//成功找到了要插入的节点的前一个节点r->data = Value;//将数据保存到新节点中r->next = p->next;//让新节点指向第一个节点p->next->pre = r;//让第二个节点的前驱指针指向新节点r->pre = p;//让新节点的前驱指针指向第一个节点p->next = r;//让第一个节点的后继指针指向新节点cout << "添加成功后的双链表是";PrintList(L);//打印单链表}else p = p->next;//没有找到想要插入的节点,向后移动节点x--;}return false;
}
//7.删除节点
bool Delete(LinkList& L) {int x;cout << "请输入你要删除的节点;";cin >> x;if (x<1 || x>Length(L)) {cout << "您想删除的节点不存在或无意义!" << endl;return false;}else {DNode* p = L;DNode* r;InitList(r);while (x){if (x == 1) {r->next = p->next;//新节点指向要删除的节点p->next->pre = r;//让要删除节点的前驱指针指向新节点p->next = r->next->next;//让被删除节点的前一个指向要删除的后一个节点free(r);cout << "删除成功!" << endl;cout << "删除后的双链表是"  ;PrintList(L);//打印单链表return true;}p = p->next;//没有找到想要插入的节点,向后移动节点x--;}return false;}
}int main(){LinkList L;//定义一个双链表LInitList(L);//为链表L初始化ListHeadInsert(L);//使用头插法创建双链表TailInsert(L);//使用尾插法创建双链表GetValueElem(L);//按值查找GetBitElem(L);  //按位查找Insert(L);    //插入数据Delete(L);        //删除数据}

代码运行截图

使用C++实现双链表相关推荐

  1. Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)

    列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.列表有多种实现方法,如单链表.双链表等. ​ 在 Go 语言中,将列表使用 container/list 包来实现,内部 ...

  2. 利用“哨兵”“实现双链表

    利用"哨兵""实现双链表 下面的代码用一个"哨兵"实现双链表,感觉很简洁,中间也有点绕,暂时实现,供学习之用 static Node list_han ...

  3. 一级指针和二级指以及(void**)在双链表中的应用

    因为函数参数是按值传递的,所以要想改变变量,必须传递地址. 二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**. (void**)&必须是本质上就是指针变量的地址才可以做这 ...

  4. 结构体的两种声明方式:堆上和栈上以及在双链表的应用

    在看<算法精解:C语言描述>的双链表chtbl和redis的双链表adlist.c发现代码思路基本是一致的. 但是,对于链表的初始化却不一样 1.<算法精解:C语言描述>风格 ...

  5. 【数据结构】双链表的应用

    1.设计一个算法,在双链表中值为y的结点前面插入一个值为x的新结点,即使得值为x的新结点成为值为y的结点的前驱结点. 2.设计一个算法,将一个双链表改建成一个循环双链表. #include <s ...

  6. 【数据结构】双链表的实现(C语言)

    双链表中的结点包括3个域,一个是存放数据信息的info域,另两个是指阵域,这里用llink和rlink表示,llink指向它的前驱结点,rlink指向它的后继结点. 双链表要掌握以下基本操作: 1.创 ...

  7. 链表问题2——在双链表中删除倒数第K个节点

    题目 实现一个函数,可以删除双链表中倒数第K个节点. 要求 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 思路 双链表的思路与前一篇文章单链表的思路基本一致,注意last指针 ...

  8. 建立循环双链表(尾插法)

    该方法是将节点插入在当前循环双链表的表尾上,为此增加一个尾指针r ,并始终指向当前链表的尾节点,最后让r->next 指向头结点.头结点的prior 指向尾节点. 注意:这里头结点,尾节点 要相 ...

  9. 建立循环双链表(头插法)

    该方法从一个空表开始,读取数组a中元素,生成新节点,将读取的数据存在该节点的数据域中,然后将该新节点插入到当前节点的表头上,直到结束为止. 双链表的存储结构: typedef strcut DLink ...

  10. 双链表(删除节点操作)

    在双链表中删除第i个节点算法如下: 首先要会: 双链表的存储结构定义: typedef struct DLinkList{int data;DLinkList * prior;DLinkList * ...

最新文章

  1. 161. Leetcode 55. 跳跃游戏 (贪心算法-贪心区间)
  2. 一个配件、一块面料,制造企业流水线因为AI变了新模样(人工智能应用案例)
  3. 访问修饰符(C# 编程指南)
  4. python安装完后还需要装什么_初学 Python 需要安装哪些软件?
  5. mysql 迁移后无法启动_Mysql数据迁移后启动出错_MySQL
  6. redis相对于mysql有什么劣势
  7. C++中-运算符与.运算符的具体使用
  8. java通过smtp发送电子邮件
  9. 使用web.py在BAE建立自已的电影网站
  10. 关于echar彩色柱状图颜色配置问题
  11. Android 智能手机程序使用历史记录查询
  12. MDI和MDIX模式配置linux,当交换机不支持MDI/MDIX时,交换机(无级连端口)间级连采用的线缆为...
  13. mybatis框架xml中trim中的prefix与suffix等标签的作用
  14. I210 网卡设定 force link mode 并关闭 EEE mode
  15. 瑞芯微RK3328硬件设计指南
  16. 【002】SPARC V8 体系结构第一章介绍
  17. js(JavaScript)操作字符串的方法
  18. cad渐变线怎么画_CAD中怎么填充距离渐变的线条???
  19. 软考系统分析师倒计时第0天
  20. 3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据

热门文章

  1. 服务器系统宏碁,Acer AC100:不可小看的超小型桌面服务器
  2. Android仿微信调用第三方地图应用导航(高德、百度、腾讯)
  3. 无线桥接后无法访问服务器,无线桥接后不能登录ip地址 桥接后副路由器进不去-192路由网...
  4. 1076:正常血压(C C++)
  5. 一套POS管理系统包括哪些
  6. Linux系统基础教程(2)
  7. 农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)
  8. 虚拟机 Win10 磁盘扩展 “文件系统的空间不足,无法...” VMware 15 C盘扩展 磁盘扩容 VMware Workstation 显示 提示
  9. nodejs require模块找不到的两种解决办法
  10. 关于PIC18F25K80串口收发问题