C++双向链表模板

作者: qiqi 分类: 数据结构 发布时间: 2026-05-23 20:15
#include <bits/stdc++.h>
using namespace std;

// 双向链表结点定义
struct Node
{
	int data;	// 数据域
	Node *prev;	// 前驱指针
	Node *next;	// 后继指针

	//构造函数
	Node(int x = 0): data(x), prev(nullptr), next(nullptr) {};
};

// 双向链表类
class DLinkList
{
	private:
		Node *head;  // 头结点,不存储有效数据
	public:
		DLinkList()	// 1.初始化链表
		{
			head = new Node();
			head->prev = nullptr;
			head->next = nullptr;
		}
		~DLinkList()// 析构释放内存
		{
			clear();
			delete head;
		}

		// ===================== 核心操作 =====================
		void createList(int arr[], int n);        // 头插法建表(原方法)
		void createListTail(int arr[], int n);    // 尾插法建表(新增)
		void insertAfter(Node *pos, int x);       // 指定节点后插入
		void insertBefore(Node *pos, int x);      // 指定节点前插入
		void delNode(Node *cur);                  // 删除指定节点
		Node *find(int x);                        // 查找值为x的节点
		void traverse();                          // 遍历输出
		int getLength();                          // 获取长度
		void clear();                             // 清空链表
		Node *getHead();                          // 获取头结点
};


void DLinkList::createList(int arr[], int n)
{
	this->clear();
	for (int i = 0; i < n; i++)
		insertAfter(head, arr[i]);
}

void DLinkList::createListTail(int arr[], int n)
{
	this->clear();
	Node *tail = head;
	for (int i = 0; i < n; i++)
	{
		insertAfter(tail, arr[i]);
		tail = tail->next;
	}
}

void DLinkList:: traverse()
{
	Node *p = head->next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

void DLinkList::clear()
{
	Node *p = head->next, *q;
	while (p)
	{
		q = p->next;
		delete p;
		p = q;
	}
	head->next = nullptr;
}

void DLinkList::insertAfter(Node *pos, int x)
{
	if (!pos)
		return;
	Node *newNode = new Node(x);
	newNode->next = pos->next;
	newNode->prev = pos;

	if (pos->next)
		pos->next->prev = newNode;
	pos->next = newNode;
}

void DLinkList::insertBefore(Node *pos, int x)
{
	if (!pos)
		return;
	insertAfter(pos->prev, x);
}

void DLinkList::delNode(Node *cur)
{
	if (!cur || cur == head)
		return;
	if (cur->prev)
		cur->prev->next = cur->next;
	if (cur->next)
		cur->next->prev = cur->prev;
	delete cur;
}

Node *DLinkList::find(int x)
{
	Node *p = head->next;
	while (p)
	{
		if (p->data == x)
			return p;
		p = p->next;
	}
	return nullptr;
}

int DLinkList::getLength()
{
	int len = 0;
	Node *p = head->next;
	while (p)
	{
		len++;
		p = p->next;
	}
	return len;
}

Node *DLinkList::getHead()
{
	return head;
}

int main()
{
	DLinkList list;
	int a[] = {1, 2, 3, 4, 5};
	int n = 5;
	//list.createList(a, n);
	list.createListTail(a, n);

	cout << "链表:";
	list.traverse();

	cout << "长度:";
	cout << list.getLength() << endl;

	Node *pos = list.find(3);
	list.insertAfter(pos, 9);
	list.insertBefore(pos, 8);

	cout << "插入后:";
	list.traverse();

	list.delNode(pos);
	cout << "删除后";
	list.traverse();

	list.clear();
	cout << "清空后长度:" << list.getLength() << endl;

	return 0;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

标签云