双链表
双链表
#include<iostream> using namespace std; template<typename T> struct DblNode { T data; //数据域,用来存放数据元素 DblNode<T>* prior; //前驱指针 DblNode<T>* next; //后继指针 }; template<typename T> class DblLinkList { public: DblLinkList(); //构造函数 ~DblLinkList(){} //析构函数 public: bool ListInsert(int i, const T& e); //在第i个位置插入指定元素e bool ListDelete(int i); //删除第i个位置的元素 bool GetElem(int i, T& e); //获得第i个位置的元素值 int LocateElem(const T& e); //按元素值查找其在单链表中第一次出现的位置 void DispList(); //输出双链表中所有元素 int ListLength(); //获取双链表的长度 bool Empty(); //判断双链表是否为空 void ReverseList(); //翻转双链表 bool InsertPriorNode(DblNode<T>*pcurr, const T& e); //在pcurr的前面插入一个节点,节点值为e bool DeleteNode(DblNode<T>* pdel); private: DblNode<T>* m_head; //头指针(指向链表第一个节点的指针,如果链表有头节点,则指向头结点) int m_length; }; template<typename T> DblLinkList<T>::DblLinkList() { m_head = new DblNode<T>; //先创建一个头结点 m_head->next = nullptr; m_head->prior = nullptr; m_length = 0; } template<typename T> bool DblLinkList<T>::ListInsert(int i, const T& e) { //判断插入位置i是否合法,i的合法值应该是从1到m_length + 1之间 if(i < 1 || i > (m_length + 1)) { cout << "元素 " << e << " 插入的位置" << i << " 不合适,合法的位置是1到" << m_length + 1 << " 之间" <<endl; return false; } DblNode<T>* p_curr = m_head; //for循环用于找到第i - 1 个节点 for(int j = 0; j < (i - 1); ++j) //j从0开始,表示p_curr刚开始指向的是第0个节点(头结点) { p_curr = p_curr->next; } DblNode<T> *node = new DblNode<T>; node->data = e; node->next = p_curr->next; node->prior = p_curr; if(p_curr->next != nullptr) { p_curr->next->prior = node; } p_curr->next = node; cout << "成功在位置为 " << i << " 处插入元素 " << e << endl; m_length++; //实际表长加一 return true; } template<typename T> bool DblLinkList<T>::ListDelete(int i) { if(m_length < 1) { cout << "当前单链表为空,不能删除任何数据" <<endl; return false; } if(i < 1 || i > m_length) { cout << "删除位置 " << i << " 不合法,合法的位置是1到 " << m_length <<"之间" <<endl; return false; } DblNode<T> *p_curr = m_head; //for循环用于找到i - 1个节点 for(int j = 0; j < (i - 1); ++j) { p_curr = p_curr->next; } DblNode<T> *p_willdel = p_curr->next; //p_willdel指向带删除的节点 if(p_willdel->next != nullptr) p_willdel->next->prior = p_curr; p_curr->next = p_willdel->next; cout << "成功删除位置为 " << i << " 的元素,该元素的值为 " << p_willdel->data <<endl; m_length--; //实际表长-1 delete p_willdel; p_willdel->next = p_willdel->prior = nullptr; return true; } template<typename T> void DblLinkList<T>::DispList() { DblNode<T> *p = m_head->next; while(p != nullptr) { cout << p->data << " "; p = p->next; } cout << endl; } template<typename T> bool DblLinkList<T>::GetElem(int i, T& e) { if(m_length < 1) { cout << "当前单链表为空,不能获取任何数据" <<endl; return false; } if(i < 1 || i > m_length) { cout << "获取位置 " << i << " 不合法,合法的位置是1到 " << m_length <<"之间" <<endl; return false; } DblNode<T>* p_curr = m_head; for(int j = 0; j < i; ++j) { p_curr = p_curr->next; } e = p_curr->data; cout << "成功获取 " << i << " 的元素,该元素的值为 " << e << endl; return true; } template<typename T> int DblLinkList<T>::LocateElem(const T& e) { DblNode<T>* p_curr = m_head; for(int i = 1; i <= m_length; ++i) { if((p_curr->next->data) == e) { cout << "值为 " << e << " 的元素在单链表中第一次出现的位置为 " << i <<endl; return i; } p_curr = p_curr->next; } cout << "值为 " << e << " 的元素在单链表中没有找到 " << endl; return -1; //返回-1表示查找失败 } int main() { DblLinkList<int> DBobj; DBobj.ListInsert(1,1); DBobj.ListInsert(1,2); DBobj.ListInsert(1,3); DBobj.DispList(); DBobj.ListDelete(1); DBobj.DispList(); return 0; }
欢迎大家指出博文中的错误哦。

浙公网安备 33010602011771号