双链表

  相比单链表,双链表提供了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私聊!

 

posted @ 2022-02-14 16:49  帝皇の惊  阅读(78)  评论(0)    收藏  举报