#ifndef LIST_H_ #define LIST_H_ struct Node { int data; Node *next; Node *pre; Node(int d){ data = d; } }; class List { public: List(); List(int *arr, int size); //根据数组构造链表 ~List(); Node *getHead(){ return head; } void setHead(Node *newHead){ head = newHead; tail = newHead; } void display(); //从头显示链表 void display(int); //从尾显示链表 Node *find(const int num); //寻找元素num,返回对应结点,没找到返回NULL void transfer(Node *position, Node *first, Node *last); //将结点[first,last)之间的元素移动到position节点之前,注意是前开后闭 void merge(List &list); //两个递增的链表合并成一个递增的链表 void reverse(); //反转链表 void swap(List &list); //交换链表 void sort(); //排序 private: Node *head; Node *tail; }; #endif
#include "list.h" #include <iostream> using namespace std; List::List() { head = new Node(0); //哨兵节点 tail = head; head->next = tail; tail->pre = head; tail->next = head; head->pre = tail; } List::List(int *arr, int size) { tail = new Node(0); head = tail; head->pre = tail; tail->next = head; if (size == 0) return; Node *p = NULL, *f = tail; for (int i = 0; i < size; i++) { Node *temp = new Node(arr[i]); if (i == 0) head->next = temp; else { p->next = temp; p->pre = f; f = p; } p = temp; } p->next = tail; p->pre = f; tail->pre=p; } List::~List() { while (head != tail) { Node *p = head->next; delete head; head = p; } delete head; } void List::display() { Node *p = head->next; while (p != tail) { cout << p->data << " "; p = p->next; } cout << endl; } void List::display(int) { Node *p = tail->pre; while (p != tail) { cout << p->data << " "; p = p->pre; } cout << endl; } Node *List::find(int num) { Node *p = head->next; while (p != tail) { if (p->data == num) return p; p = p->next; } return NULL; } void List::transfer(Node *position, Node *first, Node *last) { if (position != last) { last->pre->next = position; //(1) position->pre->next = first; //(2) first->pre->next = last; //(3) //此处不能这样:first->pre=position->pre;如果这样,first原来的pre就丢了,所以不需有个temp Node *temp = position->pre; //(4) position->pre = last->pre; //(5) last->pre = first->pre; //(6) first->pre = temp; //(7) } } void List::merge(List &list) { Node *tail2 = list.getHead(); Node *p1 = head->next, *p2 = tail2->next; while (p1 != tail && p2 != tail2) { if (p2->data < p1->data) { Node *n = p2; n = n->next; transfer(p1, p2, n); p2 = n; } else p1 = p1->next; } if (p2 != tail2) transfer(p1, p2, tail2); } void List::reverse() { Node *p = head->next; while (p->next != tail) transfer(p, tail->pre, tail); } void List::swap(List &list) { Node *temp = head; head = list.getHead(); tail = list.getHead(); list.setHead(temp); } void List::sort() { List carry; List counter[64]; int fill = 0; while (head->next != tail) { carry.transfer(carry.getHead()->next, head->next, head->next->next); int i = 0; while (i < fill && counter[i].getHead()->next != counter[i].getHead()) { counter[i].merge(carry); carry.swap(counter[i++]); } carry.swap(counter[i]); if (i == fill) ++fill; } for (int i = 1; i < fill; i++) counter[i].merge(counter[i-1]); swap(counter[fill - 1]); }
#include <iostream> #include "list.h" using namespace std; int main() { int arr[] = {1,3,5,7,9}; List myList1(arr,5); int arr2[] = { 2, 4, 6, 8 ,10}; List myList2(arr2,5); myList1.transfer(myList1.find(1),myList2.find(2),myList2.getHead()); //myList1.merge(myList2); //myList1.display(); //myList1.reverse(); myList1.sort(); myList1.display(); return 0; }