数据结构-双向循环链表

来源:互联网 发布:淘宝付费推广技巧 编辑:程序博客网 时间:2024/05/18 02:16

数据结构-双向循环链表:

长相:


#include <iostream>using namespace std;template <typename T>struct DoubleList{T data;struct DoubleList<T>* front;struct DoubleList<T>* tail;struct DoubleList<T>* CreateList(){//要内存 struct DoubleList<T>* List = new DoubleList<T>; //很容易犯错//描述最初状态List->front = List->tail = List;return List;}struct DoubleList<T>* CreateNode(T data){//要内存 struct DoubleList<T>* Node = new DoubleList<T>; //很容易犯错//描述最初状态//方便连接Node->front = Node->tail = NULL;Node->data = data;return Node;}void InsertHeadOrTail(struct DoubleList<T>* List, T data){//首先创建插入的结点struct DoubleList<T>* Node = CreateNode(data);struct DoubleList<T>* p = List;while (p->tail != List){p = p->tail;}//看图写作文List->front = Node;Node->tail = List;Node->front = p;p->tail = Node;}bool IsEmptyList(struct DoubleList<T>* List){return List->tail == List;  //1表示空}void PrintList(struct DoubleList<T>* List){if (IsEmptyList(List)){cout << "表为空,无法打印" << endl;return;}struct DoubleList<T>* p = List->tail;while (p->front != List->front)//面试题: 如何判链表是否循环{cout << p->data << "\t";p = p->tail;}cout << endl;}void InsertNodeAppoin(struct DoubleList<T>* List, T data, T item){struct DoubleList<T>* Node = CreateNode(data);struct DoubleList<T>* p = List;struct DoubleList<T>* q = List->tail;while (q->data != item){p = q;q = p->tail;if (p->tail == List){cout << "未找到指定位置" << endl;return;}}p->tail = Node;Node->front = p;Node->tail = q;q->front = Node;}void DeleteListTail(DoubleList<T>* List){if (IsEmptyList(List)){cout << "链表为空无法删除" << endl;return;}DoubleList<T>* p = List;DoubleList<T>* q = List->tail;while (q->tail != List){p = q;q = p->tail;}List->front =p;p->tail = List;delete q;}void DeleteListAppoin(DoubleList<T>* List, T item){if (IsEmptyList(List)){cout << "链表为空无法删除" << endl;return;}DoubleList<T>* p = List;DoubleList<T>* q = List->tail;while (q->data != item){p = q;q = p->tail;if (p->tail == List){cout << "未找到指定位置" << endl;return;}}p->tail = q->tail;q->tail->front = p;delete q;}};int main(){struct DoubleList<int> myList;DoubleList<int> * List=myList.CreateList();myList.InsertHeadOrTail(List, 1);myList.InsertHeadOrTail(List, 2);myList.InsertHeadOrTail(List, 3);myList.InsertHeadOrTail(List, 5);myList.InsertNodeAppoin(List, 4,5);myList.PrintList(List);cout << "尾删除" << endl;myList.DeleteListTail(List);myList.PrintList(List);cout << "指定位置删除" << endl;myList.DeleteListAppoin(List, 2);myList.PrintList(List);system("pause");return 0;}