双向链表

来源:互联网 发布:矩阵奇异值分解算法 编辑:程序博客网 时间:2024/05/22 06:57
/*双向链表*/#include <iostream>using namespace std;template <class T>class node{public:node(){next = prev = NULL;//保证每一个新节点前后指针都为NULL;}T data;node* next;node* prev;};template<class T>class list{private:node<T>* last_node;node<T>* temp_node;public:node<T>* head_node;list()//构造函数;{head_node = last_node = temp_node = NULL;}void add_back(T x);//在链表最后添加元素;void add_front(T x);//可代替单向链表中的head_insert()函数,在链表前面添加元素;void print_front();//从头开始打印链表;void print_back();//从尾开始打印链表;node<T>* find_front(T x);//从头开始寻找元素;node<T>* find_back(T x);//从尾开始寻找元素.....呃,感觉和find_front()差不多;void del(T x);//删除元素;void insert(T x, T y, node<T>*p);//任意位置添加元素;};template <class T> void list<T>::add_back(T x)//链表后面添加元素,测试通过{temp_node = new node<T>();temp_node->data = x;if (head_node == NULL){temp_node->next = temp_node->prev = NULL;head_node = last_node = temp_node;}else{temp_node->prev = last_node;last_node->next = temp_node;last_node = temp_node;last_node->next = NULL;}}template <class T> void list<T>::add_front(T x)//链表前面添加元素,测试通过{temp_node = new node<T>();temp_node->data = x;if (last_node == NULL){temp_node->next = temp_node->prev = NULL;head_node = last_node = temp_node;}else{head_node->prev = temp_node;temp_node->next = head_node;head_node = temp_node;head_node->prev = NULL;}}template<class T> void list<T>::print_front()//通过{temp_node = head_node;while (temp_node != NULL)//包括空链表情况{cout << temp_node->data << ' ';temp_node = temp_node->next;}cout << endl;}template<class T> void list<T>::print_back()//通过{temp_node = last_node;while (temp_node != NULL)//包括空链表情况{cout << temp_node->data << ' ';temp_node = temp_node->prev;}cout << endl;}template<class T> node<T>* list<T>::find_front(T x)//和下面的back一样,存在元素可以正确返回,但如果链表不存在的元素不能返回NULL;{temp_node = head_node;while (temp_node->data != x && temp_node != NULL){temp_node = temp_node->next;}return temp_node;//没有则返回NULL;}template<class T> node<T>* list<T>::find_back(T x){temp_node = last_node;while (temp_node->data != x && temp_node != NULL){temp_node = temp_node->prev;}return temp_node;//没有则返回NULL;}template <class T> void list<T>::insert(T x, T y, node<T>*p)//测试通过,Insert()函数;{temp_node = p;//这里为头结点;if (temp_node == NULL) return;//1空链表 if (temp_node->next == NULL && temp_node->data != x) return;//递归到最后一个节点还是没找到a;if (temp_node->data == x){if (p == last_node){add_back(y);return;}node<T>*temp = new node<T>();temp->data = y;temp->next = p->next;temp->prev = p;p->next->prev = temp;p->next = temp;}insert(x, y, temp_node->next);}template<class T> void list<T>::del(T x)//del函数  测试通过{node<T>*node = head_node;if (node == NULL) return;if (node->data == x)//如果要删除的节点为头节点;{if (head_node == last_node)//链表只有一个节点;{head_node = last_node = NULL;delete node;return;}head_node = node->next;head_node->prev = NULL;//头节点前面为NULL;delete node;return;}while (node != NULL && node->data != x){node = node->next;}if (node == NULL) return;//找不到为x的节点;if (node == last_node){last_node = node->prev;delete node;last_node->next = NULL;return;}else{node->next->prev = node->prev;node->prev->next = node->next;delete node;return;}}int main(){std::ios::sync_with_stdio(false);int a, b;list<int> test;cin >> a;while (a != -1){test.add_back(a);cin >> a;}test.print_front();test.print_back();cin >> a;test.del(a);test.print_front();test.print_back();return 0;}

0 0
原创粉丝点击