思路
假設有多組數據,每一組都是按從小到大的順序輸入的,設計如下數據結構
前面一列是每一組數據的首部,后面是真正的數據,首部的定義為:
struct head { Node* next; head* down; head* up; };
數據部分的定義為:
struct Node { int data; Node* next; };
1.我們稱左上角為根,左下角為尾,根的前指針(up)和尾的后指針(down)為NULL,next指向數據,那么在輸出的時候,只需要遍歷第二列選出最小的數據即可,在輸出該結點之后將該節點刪除,並更新該數據結構。
2.定義兩個指針p和q,分別用來遍歷和指向最小數據。
a.如果q(指向最小數據的指針)指到了根,並且p->next->next=NULL,則表示根所在的一行已經輸出完畢,需要更新根,於是判斷根的下指針是否也為NULL,如果是,表示已經結束,如果不是則將下一行首部設置為根。
b.如果p->next->next不等於NULL,則只需要將p的next指向p的next的next即p->next = p->next->next。
c.如果q指向除根以外的首部,並且,后面有多的數據,則p->next = p->next->next,如果沒有多余數據表示這一行已經全部輸出,刪除p和p->next指向的空間,並將p的上一行的首部的下指針指向p的下一行的首部,下一行的上指針指向p的上一行首部。
3.輸出的時候只需要當前數據與前一個輸出的數據不同即可。
代碼:
1 namespace SORT { 2 using namespace std; 3 struct Node {//數據結點 4 int data; 5 Node* next; 6 }; 7 struct head {//頭結點 8 Node* next; 9 head* down; 10 head* up; 11 }; 12 void Create(Node*& root) { 13 int tmp; 14 if (root == NULL) { 15 cin >> tmp; 16 if (tmp == -1)//輸入-1是結束該行輸入 17 return; 18 root = new Node; 19 root->data = tmp; 20 root->next = NULL; 21 Create(root->next); 22 } 23 return; 24 } 25 void Destory(head*& root) { 26 head* p = root;//循環遍歷指針 27 head* q = root->down;//每次都指向最小 28 Node* tmp = NULL; 29 int num = 0;//保存前一次輸出的值 30 while (p != NULL && q != NULL) 31 { 32 while (p != NULL) { 33 if (p->next->data < q->next->data) { 34 q = p; 35 p = p->down; 36 } 37 else { 38 p = p->down; 39 } 40 } 41 if (q->next->data != num) { 42 cout << q->next->data << " "; 43 num = q->next->data; 44 } 45 if (q->up == NULL) { 46 if (q->next->next == NULL) { 47 p = root; 48 if (root->down == NULL) { 49 delete root->next; 50 delete root; 51 return; 52 } 53 root->down->up = NULL; 54 root = root->down; 55 delete p->next; 56 delete p; 57 p = q = root; 58 } 59 else { 60 tmp = q->next; 61 q->next = q->next->next; 62 delete tmp; 63 tmp = NULL; 64 p = q = root; 65 } 66 }//if 67 else { 68 if (q->next->next == NULL) { 69 q->up->down = q->down; 70 if (q->down == NULL) { 71 q->up->down = NULL; 72 delete q->next; 73 delete q; 74 } 75 else { 76 q->down->up = q->up; 77 delete q->next; 78 delete q; 79 } 80 p = q = root; 81 } 82 else { 83 tmp = q->next; 84 q->next = q->next->next; 85 delete tmp; 86 tmp = NULL; 87 p = q = root; 88 }//else 89 }//else 90 }//while 91 } 92 void CreateHead(int n) {//n表示有幾行數據 93 head* root = new head; 94 root->down = NULL; 95 root->up = NULL; 96 root->next = NULL; 97 Create(root->next);//第一行單獨創建 98 head* p = root; 99 for (int i = 1; i < n; i++) 100 { 101 head* N = new head; 102 N->down = NULL; 103 N->next = NULL; 104 N->up = p; 105 p->down = N; 106 p = N; 107 Create(p->next); 108 } 109 Destory(root); 110 } 111 }
調用:
1 int main() { 2 int num; 3 std::cin >> num; 4 SORT::CreateHead(num); 5 }
運行結果:
如果有什么錯誤歡迎大家指正。