★C++实现双向链表的基础操作(类的实现)
#include<iostream> #include<cassert> using namespace std; typedef int DataType; class double_link_list { //定义双向链表类,包括了双向的前驱和后继指针,以及对象的初始化 public: friend class ListNode; double_link_list(DataType x = 0) :_data(x) ,_next(NULL) ,_prev(NULL) {} private: double_link_list* _prev; double_link_list* _next; DataType _data; }; class ListNode { public: //注意上一类中的friend关键字,友元函数,否则该类无法访问其类的private成员 ListNode() //构造函数 :_head(NULL) ,_tail(NULL) { } ~ListNode()//析构函数 { Clear();//清除函数 } ListNode(const ListNode& list) //拷贝构造函数 { double_link_list *cur = list._head; while (cur) { PushBack(cur->_data); } } ListNode operator = (ListNode list) //赋值运算符重载函数 { double_link_list *cur = list._head; while (cur) { PushBack(cur->_data); } } public: //尾插 void PushBack(const DataType& x); //尾删 void PopBack(); //头插 void PushFront(const DataType& x); //头删 void PopFront(); //指定位置插入节点 void Insert(double_link_list* pos, const DataType& x); //查找节点函数 double_link_list* Find(const DataType& x); //删除节点函数 void Erase(const DataType& x); //逆置链表函数 void Reverse(); //输出函数 void Print(); private: void Clear() { while (_head) { double_link_list* cur = _head; _head = _head->_next; delete cur; } } double_link_list *_head; double_link_list *_tail; }; //尾插 void ListNode::PushBack(const DataType&x) //注意域作用符的添加,否则只得在类体中定义 { if (_head == NULL) { _tail = _head = new double_link_list(x); _head->_next = NULL; _head->_prev = NULL; } else { _tail->_next = new double_link_list(x); _tail->_next->_prev = _tail; _tail = _tail->_next; } } //头插 void ListNode::PushFront(const DataType&x) { double_link_list* cur = new double_link_list(x); if (_head == NULL) { _tail = _head = cur; } else { cur->_next = _head; cur->_next->_prev = cur; _head = cur; } } //尾删 void ListNode::PopBack() { if (_tail) { double_link_list *cur = _tail; _tail = _tail->_prev; _tail->_next = NULL; delete cur; } } //头删 void ListNode::PopFront() { if (_head) { double_link_list *cur = _head; _head = _head->_next; _head->_prev = NULL; delete cur; } } //指定位置插入节点 void ListNode::Insert(double_link_list* pos, const DataType& x) { assert(_head); double_link_list *cur = _head; while (cur) { if (cur == pos) { if (cur == _tail) { PushBack(x); } else { double_link_list *tmp = new double_link_list(x); tmp->_next = cur->_next; tmp->_prev = cur; tmp->_next->_prev = tmp; cur->_next = tmp; } return; } cur = cur->_next; } } //查找指定节点 double_link_list* ListNode::Find(const DataType& x) { double_link_list* cur = _head; while (cur) { if (cur->_data == x) return cur; cur = cur->_next; } return NULL; } //删除某一节点 void ListNode::Erase(const DataType &x) { double_link_list *cur = _head; while (cur) { if (cur->_data == x) { double_link_list* tmp = cur; cur->_prev->_next = cur->_next; cur->_next->_prev = cur->_prev; cur = cur->_next; delete tmp; } } } //逆置双向链表 void ListNode::Reverse() { std::swap(_head, _tail); double_link_list* cur = _head; while (cur) { std::swap(cur->_next, cur->_prev); cur = cur->_next; } } //输出双向链表 void ListNode::Print() { double_link_list* cur = _head; while (cur) { cout << cur->_data << "->"; cur = cur->_next; } cout << "NULL" << endl; }
时间: 2024-10-06 00:40:23