C++实现双向链表

博主因同学coding遇麻烦,有空时用C++实现了双向链表。代码带有注释,虽未详细说明指针指向,但表示仔细琢磨可理解,若一天不行就花一周时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++实现双向链表

今天同学在coding的时候遇到点小麻烦,然后晚上回来的时候敲好有时间,顺便实现了一番,指针,指针,听大佬说是C语言的精髓(悄悄话)
是女装就直接上代码,少啰嗦

代码略带点注释,具体指针是怎么指向,仔细琢磨基本可以搞定,一天不行,盘他一个星期

#ifndef _DOUBLE_LIST_HPP_

#include <iostream>
using namespace std;

//结点  
typedef struct node
{
	struct node* next;
	struct node* pre;
	int data;
}Node;


class DoubleList
{
private:
	//双向链表的第一个节点(是有数据的,就是课本上的无头结点链表)
	Node* head;
	
	//表长
	int _size;


public:

	//无头结点的链表
	DoubleList(int headData)
	{
		head = new Node;
		head->pre = NULL;
		head->next = NULL;
		head->data = headData;
		
		_size = 1;
	}

	~DoubleList()
	{
		delete head;
		head = NULL;
	}

	//从头部开始打印输出
	void print()
	{
		if (!empty())
		{
			Node* tmp = head;
			while (tmp)
			{
				cout << tmp->data << endl;
				tmp = tmp->next;
			}
		}
	}

	//从尾部开始打印输出
	void rprint()
	{
		if (!empty())
		{
			//遍历到表尾
			Node* tmp = head;
			while (tmp->next)
			{
				tmp = tmp->next;
			}

			//反向遍历
			while (tmp)
			{
				cout << tmp->data << endl;
				tmp = tmp->pre;
			}
		}
	}

	//尾插法
	bool insertEnd(int data)
	{
		Node* tmp = head;
		while (tmp->next)
		{
			tmp = tmp->next;
		}

		//insert
		Node* _node = new Node;
		_node->data = data;
		_node->next = NULL;
		tmp->next = _node;
		_node->pre = tmp;

		++_size;
		return false;
	}

	//头插法
	bool insertBegin(int data)
	{
		Node* tmp = head;
		//insert
		Node* _node = new Node;
		_node->data = data;
		_node->pre = NULL;
		_node->next = tmp;
		head = _node;	
		
		++_size;
		return false;
	}

	//删除某个元素
	bool Delete(int data)
	{
		Node* tmp = findElement(data);
		if (!tmp)
		{
			cout << data << "不存在" << endl;
			return false;
		}

		if (tmp->next == NULL)
		{	
			deleteEnd();
		}
		else if (tmp->pre == NULL)
		{
			deleteBegin();		
		}
		else
		{
			Node* tmpNext = tmp->next;
			tmp->pre->next = tmpNext;
			tmpNext->pre = tmp->pre;
					
		}

		--_size;
		close(tmp);
		return true;
	}

	//删除头元素
	bool deleteBegin()
	{
		Node* tmp = head;
		Node* t = tmp->next;
		t->pre = NULL;
		head = t;

		--_size;
		close(tmp);		
		return false;
	}

	//删除尾元素
	bool deleteEnd()
	{
		Node* tmp = head;
		while (tmp->next)
		{
			tmp = tmp->next;
		}

		Node* t = tmp;
		t->pre->next = NULL;
		
		--_size;
		close(tmp);
		return false;
	}

	//查找某元素是否在里面
	bool find(int data)
	{
		Node tmp = *head;

		while (tmp.next)
		{
			if (tmp.data == data)
			{
				return true;
			}
			tmp = *tmp.next;
		}

		return false;
	}

	//直接获取表长
	int size()
	{
		return _size;
	}

	//清空链表
	void clear()
	{
		Node* tmp = head->next;
		
		while (tmp)
		{
			--_size;
			close(head);
			head = tmp;
			tmp = tmp->next;
		}

		--_size;
		head->next = NULL;
		head->pre  = NULL;
		head->data = 0;
		//close(head);
		//close(head);
	}

	//判断是否为空
	bool empty()
	{
		return _size >= 0 ? false: true;
	}
	
	//取头元素
	int font()
	{
		return head->data;
	}

	//取尾元素
	int back()
	{
		Node tmp = *head;
		while (tmp.next)
		{
			tmp = *tmp.next;
		}

		return tmp.data;
	}

private:

	//查找元素结点
	Node* findElement(int data)
	{
		Node* tmp = head;

		while (tmp)
		{
			if (tmp->data == data)
			{
				return tmp;
			}
			tmp = tmp->next;
		}

		return NULL;
	}

	//释放某结点内存
	void close(Node* node)
	{
		delete node;
		node = NULL;
	}

};


int main()
{
	cout << "双向链表" << endl;
	DoubleList* dlist = new DoubleList(1);
	for (int i = 2; i <= 5; i++)
	{
		//表头插入
		dlist->insertEnd(i);
	}


///////////////////////////////////
	//测试


	cout << "-------------------" << endl;
	dlist->print();

	/*if (dlist->find(4))
	{
		cout << "yes" << endl;
	}
	else {
		cout << "no" << endl;
	}*/

	cout<<dlist->font()<<endl;
	cout << dlist->back() << endl;


	//打印输出
	/*cout << "-------------------" << endl;
	dlist->print();
	cout << "-------------------" << endl;
	dlist->rprint();
	cout << "size=" << dlist->size()<<"   "<<dlist->length() << endl;
*/
	//表尾
	//dlist->insertEnd(5);

	//删除中间、开头、结尾都可以
	//dlist->Delete(3);

	//删除开头
	/*dlist->deleteBegin();
	dlist->deleteBegin();
	dlist->deleteBegin();*/

	//删除结尾
	/*dlist->deleteEnd();
	dlist->deleteEnd();
	dlist->deleteEnd();
	*/

	/*cout << "-------------------" << endl;
	dlist->print();
	cout << "size=" << dlist->size() << "   "  << endl;
	dlist->clear();
	cout << "size=" << dlist->size() << "   "  << endl;
	cout << "-------------------" << endl;
	dlist->print();*/


	cin.get();
	return 0;
}


#endif // !_DOUBLE_LIST_HPP_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值