C++實現多組數據合並輸出


  思路

    假設有多組數據,每一組都是按從小到大的順序輸入的,設計如下數據結構

    前面一列是每一組數據的首部,后面是真正的數據,首部的定義為:

    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 }

 

 

 

  運行結果:

  如果有什么錯誤歡迎大家指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM