程序地带

数据结构---双向链表


双向链表的三个重要组成部分: 1.数据域 2.前指针域 3.后指针域


基本操作: 1.初始化列表 2.前插法 3.后插法 4.任意位置插入 5.删除元素 感想:与单链表的区别的就是多了一个前指针.其他的没有太大的变化 1.初始化:


typedef struct DBLink {
int date;
struct DBLink* prew;
struct DBLink* next;
}DBLinkList, DBLinkNode;
bool Dbinit_Link(DBLinkList*& L) {
//初始化
L = new DBLinkList;
if (!L) return false;
L->date = -1;
L->next = NULL;
L->prew = NULL;
return true;
}

2.前插法: 如果是没有元素,那么就使头结点指向新节点 新节点的前指针指向头结点 如果已经有了其他的元素了,那么就使新元素的尾指针指,向头节点原来指向的节点,让头节点指向新节点 再是原来的第二个节点的头节点指向新节点,新节点的前指针指向头节点 在这里插入图片描述


bool DbLinkInserct_front(DBLinkList*& L, DBLinkNode* s) {
if (!L || !s) return false;
if (L->next == NULL) {
L->next = s;
s->prew = L;
s->next = NULL;
}
else {
s->next = L->next;
L->next = s;
s->next->prew = s;
s->prew = L;
}
return true;
}

3.后插法


bool DbLinkInserct_back(DBLinkList*& L, DBLinkNode* s) {
if (!L || !s) return false;
DBLinkNode* p;
p = L;
while (p->next != NULL) {
p = p->next;
}
p->next = s;
s->prew = p;
s->next = NULL;
return true;
}

4.任意插入:


bool DbLinkInserct(DBLinkList*& L, int index, DBLinkNode* s) {
if (!L || !s) return false;
int i = 0;
DBLinkList* p = L;
while (p && i < index) {
p = p->next;
i++;
}
if (!p) return false;
p->prew->next = s;
s->next = p;
s->prew = p->prew;
p->prew = s;
return true;
}

5.删除元素:


bool DbLinkDelete(DBLinkList*& L, int index) {
if (!L) return false;
int i = 1;
DBLinkList* p = L->next;
DBLinkNode* q = NULL;
while (p && i < index) {
p = p->next;
i++;
}
p->prew->next = p->next;
if (p->next)
p->next->prew = p->prew;
delete p;
return true;
}

全部源代码;


#include<Windows.h>
#include<iostream>
using namespace std;
typedef struct DBLink {
int date;
struct DBLink* prew;
struct DBLink* next;
}DBLinkList, DBLinkNode;
bool Dbinit_Link(DBLinkList*& L) {
//初始化
L = new DBLinkList;
if (!L) return false;
L->date = -1;
L->next = NULL;
L->prew = NULL;
return true;
}
bool DbLinkInserct_front(DBLinkList*& L, DBLinkNode* s) {
if (!L || !s) return false;
if (L->next == NULL) {
L->next = s;
s->prew = L;
s->next = NULL;
}
else {
s->next = L->next;
L->next = s;
s->next->prew = s;
s->prew = L;
}
return true;
}
bool DbLinkInserct_back(DBLinkList*& L, DBLinkNode* s) {
if (!L || !s) return false;
DBLinkNode* p;
p = L;
while (p->next != NULL) {
p = p->next;
}
p->next = s;
s->prew = p;
s->next = NULL;
return true;
}
bool DBLink_print(DBLinkList*& L) {
DBLinkNode* p = NULL;
p = L->next;
while (p) {
cout << p->date << " ";
p = p->next;
}
cout << endl;
return 0;
}
bool DbLinkInserct(DBLinkList*& L, int index, DBLinkNode* s) {
if (!L || !s) return false;
int i = 0;
DBLinkList* p = L;
while (p && i < index) {
p = p->next;
i++;
}
if (!p) return false;
p->prew->next = s;
s->next = p;
s->prew = p->prew;
p->prew = s;
return true;
}
bool DbLinkDelete(DBLinkList*& L, int index) {
if (!L) return false;
int i = 1;
DBLinkList* p = L->next;
DBLinkNode* q = NULL;
while (p && i < index) {
p = p->next;
i++;
}
p->prew->next = p->next;
if (p->next)
p->next->prew = p->prew;
delete p;
return true;
}
void DBLink_Destroy(DBLinkList*& L) {
DBLinkNode* p = L;
cout << "销毁链表!" << endl;
while (L) {
L = L->next;
delete p;
p = L;
}
}
int main() {
DBLinkList* L;
DBLinkNode* s;
int n;
Dbinit_Link(L);
//1.前插法
cout << "输入要前插入的数据个数:" << endl;
cin >> n;
while (n) {
s = new DBLinkNode;
cout << "请输入要插入的数据:";
cin >> s->date;
if (DbLinkInserct_front(L, s)) {
cout << "插入成功!" << endl;
}
else {
cout << "插入失败!" << endl;
}
n--;
}
//2.输出
DBLink_print(L);
/*x
//3.后插法
cout << "输入要后插入的数据个数:" << endl;
cin >> n;
while (n) {
s = new DBLinkNode;
cout << "请输入要插入的数据:";
cin >> s->date;
if (DbLinkInserct_back(L, s)) {
cout << "插入成功!" << endl;
}
else {
cout << "插入失败!" << endl;
}
n--;
}
DBLink_print(L);
*/
//4.任意位置插入
int pos;
cout << "要插入的个数:";
cin >> n;
while (n) {
s = new DBLinkNode;
cout << "输入要插入的位置和元素:";
cin >> pos >> s->date;
if (DbLinkInserct(L, pos, s)) {
cout << "插入成功!" << endl;
DBLink_print(L);
}
else {
cout << "插入失败!" << endl;
}
n--;
}
//5.删除元素
cout << "输入要删除的元素的位置:";
cin >> n;
if (DbLinkDelete(L, n)) {
cout << "删除成功!" << endl;
}
else {
cout << "删除失败!" << endl;
}
DBLink_print(L);
DBLink_Destroy(L);
system("pause");
return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49324123/article/details/111246244

随机推荐

怎么彻底重装清空电脑_新手怎么重装电脑系统

给电脑重装系统可以说是现在每个电脑用户必须掌握的一项技能。但是,新手用户来说给电脑重装系统可却是一道难题。该怎么办呢?别着急,有小编在呢,下面小...

weixin_39658474 阅读(188)

电脑有摄像头吗_酷应用:让手机充当PC摄像头

对于PC用户而言,视频聊天已成为网络生活的重要部分,但这要借助摄像头才能实现。尽管笔记本、一体电脑等PC集成了摄像头,但大多数机型集成摄像头像素并不高...

weixin_39703926 阅读(297)

数据库语句进阶

数据库语句进阶

数据库原始表user_info表格school表格语句1、Groupby(分组)1.1、作用:将查询到的结果进行分组1.2、语法格式:SELEC...

原来是多呀多啊 阅读(911)

美国政府发布关键海事行业的网络安全规划

美国政府发布关键海事行业的网络安全规划

 聚焦源代码安全,网罗国内外最新资讯!编译:奇安信代码卫士团队美国政府发布了关于关键海事行业的威胁缓解和安全防护的规划,提到了应优先处理的任务清...

奇安信代码卫士 阅读(975)

类的信息包含哪些信息

1.类的class对象也就是类的入口信息2.类中的方法3.static修饰的静态变量和常量4.类的全路径```...

佐杰 阅读(459)

unbunt16.04修改源地址

#阿里云源debhttp://mirrors.aliyun.com/ubuntu/xenialmainrestricteduniversemultiversedebhttp://mirrors.ali...

朝阳科技大学 阅读(250)