双链表
相比单链表,双链表提供了prev指针,使得其在处理一些操作时更为简单。
前言:
1.这里的双链表使用C++实现
2.只完成了插入删除操作
思路:

如上图所示,next指向下一个,而prev指向前一个,只要适当调整指针指向,即可完成双链表
实现:
首先,需要定义表示节点的结构体:
struct node
{
string data;
node* next; //指向下一个元素
node* prev; //指向前一个元素
node() //构造函数,用于在创建新节点时自动初始化
{
data = "";
prev = NULL;
next = NULL;
}
};
这里我为了在字面上区分节点和链表的区别,使用了

接下来创建链表,实际上是创造了一个节点,将其作为头结点。
doubleLinkedList* createList()
{
node* list = new node(); //这种方式返回不会存在局部变量内存销毁的问题,因为它是new出来的
return list;
}
插入操作
void insert(node* position, string input)
{//position是插入的位置,input是插入数据的data
node* newNode = new node();
newNode->data = input; //先处理新创造的节点
newNode->next = position->next; //如果不对新节点优先处理,会造成找不到节点的清空,造成野指针
newNode->prev = position;
if (position->next != NULL) { //如果不进行判断,可能会对NULL操作而错误
position->next->prev = newNode;
position->next = newNode;
}
else {
position->next = newNode;
}
}
删除操作
void deleteElement(node* ele)
{
ele->prev->next = ele->next;
if (ele->next != NULL)
{
ele->next->prev = ele->prev;
}
else
{//ele->next为空时不需要做什么了
}
delete ele; //必须删除,否则长时间可能造成内存泄漏
}
查找操作
node* find(string input, doubleLinkedList* list)
{//与单链表差不多
doubleLinkedList* L = list;
while (L != NULL)
{
if (L->data == input)
{
return L;
}
else
{
L = L->next;
}
}
return NULL;
}
完整代码
#include <iostream>
#include <string>
using namespace std;
struct node
{
string data;
node* next; //指向下一个元素
node* prev; //指向前一个元素
node()
{
data = "";
prev = NULL;
next = NULL;
}
};
using doubleLinkedList = node;
void insert(node* position, string input)
{//position是插入的位置,input是插入数据的data
node* newNode = new node();
newNode->data = input; //先处理新创造的节点
newNode->next = position->next;
newNode->prev = position;
if (position->next != NULL) {
position->next->prev = newNode;
position->next = newNode;
}
else {
position->next = newNode;
}
}
void deleteElement(node* ele)
{
ele->prev->next = ele->next;
if (ele->next != NULL)
{
ele->next->prev = ele->prev;
}
else
{
}
delete ele;
}
node* find(string input, doubleLinkedList* list)
{
doubleLinkedList* L = list;
while (L != NULL)
{
if (L->data == input)
{
return L;
}
else
{
L = L->next;
}
}
return NULL;
}
doubleLinkedList* createList()
{
node* list = new node();
return list;
}
int main()
{
doubleLinkedList* list = createList();
while (true)
{
int j;
cin >> j;
if (j == 1)
{
string query, input;
cin >> input;
insert(list, input);
}
else
{
string query;
cin >> query;
deleteElement(find(query, list));
}
}
}
此代码已经本人VS调试测试,暂时没有发现什么问题
如果由不懂的或错误的,欢迎评论或加QQ私聊!

浙公网安备 33010602011771号