使用C++实现双链表
使用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++实现双链表相关推荐
- Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)
列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.列表有多种实现方法,如单链表.双链表等. 在 Go 语言中,将列表使用 container/list 包来实现,内部 ...
- 利用“哨兵”“实现双链表
利用"哨兵""实现双链表 下面的代码用一个"哨兵"实现双链表,感觉很简洁,中间也有点绕,暂时实现,供学习之用 static Node list_han ...
- 一级指针和二级指以及(void**)在双链表中的应用
因为函数参数是按值传递的,所以要想改变变量,必须传递地址. 二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**. (void**)&必须是本质上就是指针变量的地址才可以做这 ...
- 结构体的两种声明方式:堆上和栈上以及在双链表的应用
在看<算法精解:C语言描述>的双链表chtbl和redis的双链表adlist.c发现代码思路基本是一致的. 但是,对于链表的初始化却不一样 1.<算法精解:C语言描述>风格 ...
- 【数据结构】双链表的应用
1.设计一个算法,在双链表中值为y的结点前面插入一个值为x的新结点,即使得值为x的新结点成为值为y的结点的前驱结点. 2.设计一个算法,将一个双链表改建成一个循环双链表. #include <s ...
- 【数据结构】双链表的实现(C语言)
双链表中的结点包括3个域,一个是存放数据信息的info域,另两个是指阵域,这里用llink和rlink表示,llink指向它的前驱结点,rlink指向它的后继结点. 双链表要掌握以下基本操作: 1.创 ...
- 链表问题2——在双链表中删除倒数第K个节点
题目 实现一个函数,可以删除双链表中倒数第K个节点. 要求 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 思路 双链表的思路与前一篇文章单链表的思路基本一致,注意last指针 ...
- 建立循环双链表(尾插法)
该方法是将节点插入在当前循环双链表的表尾上,为此增加一个尾指针r ,并始终指向当前链表的尾节点,最后让r->next 指向头结点.头结点的prior 指向尾节点. 注意:这里头结点,尾节点 要相 ...
- 建立循环双链表(头插法)
该方法从一个空表开始,读取数组a中元素,生成新节点,将读取的数据存在该节点的数据域中,然后将该新节点插入到当前节点的表头上,直到结束为止. 双链表的存储结构: typedef strcut DLink ...
- 双链表(删除节点操作)
在双链表中删除第i个节点算法如下: 首先要会: 双链表的存储结构定义: typedef struct DLinkList{int data;DLinkList * prior;DLinkList * ...
最新文章
- 161. Leetcode 55. 跳跃游戏 (贪心算法-贪心区间)
- 一个配件、一块面料,制造企业流水线因为AI变了新模样(人工智能应用案例)
- 访问修饰符(C# 编程指南)
- python安装完后还需要装什么_初学 Python 需要安装哪些软件?
- mysql 迁移后无法启动_Mysql数据迁移后启动出错_MySQL
- redis相对于mysql有什么劣势
- C++中-运算符与.运算符的具体使用
- java通过smtp发送电子邮件
- 使用web.py在BAE建立自已的电影网站
- 关于echar彩色柱状图颜色配置问题
- Android 智能手机程序使用历史记录查询
- MDI和MDIX模式配置linux,当交换机不支持MDI/MDIX时,交换机(无级连端口)间级连采用的线缆为...
- mybatis框架xml中trim中的prefix与suffix等标签的作用
- I210 网卡设定 force link mode 并关闭 EEE mode
- 瑞芯微RK3328硬件设计指南
- 【002】SPARC V8 体系结构第一章介绍
- js(JavaScript)操作字符串的方法
- cad渐变线怎么画_CAD中怎么填充距离渐变的线条???
- 软考系统分析师倒计时第0天
- 3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据
热门文章
- 服务器系统宏碁,Acer AC100:不可小看的超小型桌面服务器
- Android仿微信调用第三方地图应用导航(高德、百度、腾讯)
- 无线桥接后无法访问服务器,无线桥接后不能登录ip地址 桥接后副路由器进不去-192路由网...
- 1076:正常血压(C C++)
- 一套POS管理系统包括哪些
- Linux系统基础教程(2)
- 农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)
- 虚拟机 Win10 磁盘扩展 “文件系统的空间不足,无法...” VMware 15 C盘扩展 磁盘扩容 VMware Workstation 显示 提示
- nodejs require模块找不到的两种解决办法
- 关于PIC18F25K80串口收发问题