2017-04-26 71 views
-1

,所以我寫在那裏用戶填寫與整數兩個相連列出了PROGRAMM,現在我需要創建一個用於創建與第一和第二值,第三鏈接列表的功能列表沒有重複。 這裏是代碼,我現在:功能合併兩個單鏈表,形成第三個

#include <iostream> 
#include <stdlib.h> 
using namespace std; 

struct node 
{ 
    int info; 
    node *next; 
    node (int i, node *n=NULL) 
    { 
     info = i; 
     next = n; 
    } 
    ~node() 
    { 
     cout <<"NODE CONTAINING \"" << info << "\" WAS DELETED!" << endl; 
    } 
}; 
struct list 
{ 
    node* startList1, *lastList1, *startList2, *lastList2; 
    int menuOption; 
    int nodeCount1=0, nodeCount2=0; 


    list() { 
     startList1 = NULL; 
     startList2 = NULL; 

    } 


    void addList1(node *p) 
    { 
     int n; 
     cout << "PLEASE INPUT VALUE WHICH YOU WANT IN THE NODE:"; 
     cin >> n; 
     p = new node(n); 
     nodeCount1++; 
     if(startList1==NULL) 
     { 
      startList1 = lastList1 = p; 
     } 
     else 
     { 
      lastList1->next = p; 
      lastList1 = p; 
     } 
    } 

    void printList1(node *pr) 
    { 
     node *pr; 
     for (pr=startList1; pr!=NULL; pr=pr->next) 
     { 
      cout << pr->info << endl; 
     } 
    } 



    void addList2(node *q) 
    { 
     int n; 
     cout << "PLEASE INPUT VALUE WHICH YOU WANT IN THE NODE:"; 
     cin >> n; 
     q = new node(n); 
     nodeCount2++; 
     if(startList2==NULL) 
     { 
      startList2 = lastList2 = q; 
     } 
     else 
     { 
      lastList2->next = q; 
      lastList2 = q; 
     } 
    } 
    void printList2(node *pr) 
    { 
     for (pr=startList2; pr!=NULL; pr=pr->next) 
     { 
      cout << pr->info << endl; 
     } 
    } 

    // this just prints first and second lists to show what is inside.. 
    void printBoth(node *pr, node *qr) 
    { 
     cout << "Elements of the first list:" << endl; 
     for (pr=startList1; pr!=NULL; pr=pr->next) 
     { 
      cout << pr->info << endl; 
     } 
     cout << "Elements of the second list:" << endl; 
     for (pr=startList2; pr!=NULL; pr=pr->next) 
     { 
      cout << pr->info << endl; 
     } 
    } 


    void printMenu() 
    { 
     cout << "MENU" << endl; 
     cout << "(1) ADD ELEMENT LIST1." << endl; 
     cout << "(2) PRINT LIST1" << endl; 
     cout << "(3) ADD ELEMENT LIST2" << endl; 
     cout << "(4) PRINT LIST2" << endl; 
     cout << "(5) PRINT BOTH LISTS" << endl; 
    cout << "(6) USE MERGE FUNCTION" << endl; 
     cout << "(7) TO EXIT" << endl; 

     cin >> menuOption; 
     system ("cls"); 
    }; 


    void dragons() 
    { 

     node *temp1 = startList1; 
     node *temp2 = startList2; 
     while(temp1) 
     { 
      temp1 = startList1->next; 
      delete startList1; 
      startList1=temp1; 
     } 
     while(temp2) 
     { 
      temp2 = startList2->next; 
      delete startList2; 
      startList2=temp2; 
     } 
    };  

}; 

int main() 
{ 
    struct node *p = NULL, *q = NULL; 

    list s; 
    s.printMenu(); 
    node* list1; 
    node* list2; 
    node* sorting; 
    while(s.menuOption!=7) 
    { 
     switch (s.menuOption) 
     { 
      case 1: s.addList1(list1); 
        break; 
      case 2: s.printList1(list1); 
        break; 
      case 3: s.addList2(list2); 
        break; 
      case 4: s.printList2(list2); 
        break; 
      case 5:s.printBoth(list1, list2); 
        break; 
      case 6:s.merge(); 
        break; 
      default: cout << "SOMETHING WENT WRONG!!!!" << endl; 
        break; 
     } 
     system ("pause"); 
     system ("cls"); 
     s.printMenu(); 
    } 
    s.dragons(); 
    return 0; 
} 

所以現在用戶可以輸入元素兩份名單,看看他們,但我怎樣才能創建一個函數,將合併這些名單沒有重複的值?例如: List1 = 1,2,3,6,8; List2 = 2,4,5,7,8;

合併列表= 1,2,3,4,5,7,8; (可以是任何實際的順序,沒關係)

任何意見將不勝感激!謝謝!

+0

如果您無法從中檢索數據,鏈接列表有什麼用處?請注意,您的整個'struct list'無法從'main'中添加數據,或者無法從'main'開始迭代。這將是獲得「merge()」正常工作的第一步。 – PaulMcKenzie

+0

對不起,我是新來的C++語言,我不太明白你在說什麼。我應該怎麼做才能「從主要數據中添加數據或從主要數據開始迭代」? –

+0

您構建了一個鏈表類,並且沒有辦法從'list'結構之外的列表中讀取數據。其次,你的'addList1'和'addList2'函數不會改變傳入的參數。你發送的未初始化指針指向'addList1'和'addList2',並且在返回這些函數時它們將保持未初始化狀態。如果你想證明,在調用你的'add ...()'函數之前,將'list1'和'list2'設置爲'nullptr'。這些函數被調用後,你會看到它們仍然是'nullptr'。所以,當你使用'list1'和'list2'時,你的整個'main'都會有bug。 – PaulMcKenzie

回答

0

這裏是你的代碼的一個版本,但使用STL列表容器提供的鏈表,這提供了自己的功能,將實現你想要的。此代碼僅用於演示,並未針對效率進行優化,僅顯示了合併兩個列表中唯一元素的一種可能方法。 (爲此,列表要求對其元素進行排序,並且您需要爲列表中的節點提供「小於」和「等於」的謂詞。) (它確實需要時間來學習一些STL容器和功能,但很多人會推薦這樣做,而不是試圖創建自己的基於原始鏈接指針從頭列表。)

希望這有助於,或者是感興趣的。

#include <iostream> 
#include <stdlib.h> 
#include <list> 

struct node 
{ 
    int info; 
    node (int i) 
    { 
     info = i; 
    } 
    ~node() 
    { 
     //std::cout <<"NODE CONTAINING \"" << info << "\" WAS DELETED!" << std::endl; 
    } 
}; 

bool nodeLess(node n1, node n2) 
{ 
    return n1.info < n2.info; 
} 

bool nodeEqual(node n1, node n2) 
{ 
    return n1.info == n2.info; 
} 

struct mylist 
{ 
    int menuOption; 

    std::list<node> list1; 
    std::list<node> list2; 

    void addList(std::list<node>& l) 
    { 
     int x; 
     std::cout << "PLEASE INPUT VALUE WHICH YOU WANT IN THE NODE: "; 
     std::cin >> x; 
     node n(x); 
     l.push_back(n); 
    } 

    void printList(const std::list<node>& l) 
    { 
     for (std::list<node>::const_iterator it = l.cbegin(); it != l.cend(); ++it) 
     { 
      std::cout << it->info << std::endl; 
     } 
    } 

    void addList1() { addList(list1); } 
    void addList2() { addList(list2); } 

    void printList1() { printList(list1); } 
    void printList2() { printList(list2); } 

    // this just prints first and second lists to show what is inside.. 
    void printBoth() 
    { 
     std::cout << "Elements of the first list:" << std::endl; 
     printList1(); 
     std::cout << "Elements of the second list:" << std::endl; 
     printList2(); 
    } 

    void simpleMerge() 
    { 
     std::list<node> merged; 
     merged.insert(merged.end(), list1.begin(), list1.end()); 
     merged.insert(merged.end(), list2.begin(), list2.end()); 
     std::cout << "CONTENTS OF LIST1 THEN LIST2: " << std::endl; 
     printList(merged); 
    } 

    void uniqueSortMerge() 
    { 
     std::list<node> sorted1(list1.begin(), list1.end()); 
     std::list<node> sorted2(list2.begin(), list2.end()); 
     sorted1.sort(nodeLess); 
     sorted2.sort(nodeLess); 
     sorted1.unique(nodeEqual); 
     sorted2.unique(nodeEqual); 
     std::list<node> merged; 
     std::merge(sorted1.begin(), sorted1.end(), 
        sorted2.begin(), sorted2.end(), 
        std::back_inserter(merged), 
        nodeLess); 
     std::cout << "UNIQUE CONTENTS OF LIST1 AND LIST2 SORTED AND MERGED: " << std::endl; 
     printList(merged); 
    } 

    void printMenu() 
    { 
     std::cout << "MENU" << std::endl; 
     std::cout << "(1) ADD ELEMENT LIST1." << std::endl; 
     std::cout << "(2) PRINT LIST1" << std::endl; 
     std::cout << "(3) ADD ELEMENT LIST2" << std::endl; 
     std::cout << "(4) PRINT LIST2" << std::endl; 
     std::cout << "(5) PRINT BOTH LISTS" << std::endl; 
     std::cout << "(6) USE SIMPLE MERGE FUNCTION" << std::endl; 
     std::cout << "(7) USE UNIQUE, SORT AND MERGE FUNCTION" << std::endl; 
     std::cout << "(8) TO EXIT" << std::endl; 

     std::cin >> menuOption; 
     system ("cls"); 
    }; 


    void dragons() 
    { 
     list1.clear(); 
     list2.clear(); 
    }; 
}; 

int main() 
{ 
    mylist s; 

    do 
    { 
     s.printMenu(); 
     switch (s.menuOption) 
     { 
      case 1: 
       s.addList1(); 
       break; 
      case 2: 
       s.printList1(); 
       break; 
      case 3: 
       s.addList2(); 
       break; 
      case 4: 
       s.printList2(); 
       break; 
      case 5: 
       s.printBoth(); 
       break; 
      case 6: 
       s.simpleMerge(); 
       break; 
      case 7: 
       s.uniqueSortMerge(); 
       break; 
      case 8: 
       break; 
      default: 
       std::cout << "SOMETHING WENT WRONG!!!!" << std::endl; 
       break; 
     } 
     system ("pause"); 
     system ("cls"); 
    } while(s.menuOption != 8); 

    s.dragons(); 
    return 0; 
}