2014-09-22 96 views
-2

我是新的C++中的數據結構,我試圖用模板做雙向鏈表。我見過的所有例子都只針對模板節點的1個元素,所以我試圖將2個元素放在列表中的模板節點中,但我不知道該怎麼做,無論如何,我試圖製作清單。在雙向鏈表中的節點模板中插入兩個元素

下面的代碼:

#include<iostream> 
#include<cstring> 

using namespace std; 

template<class T> 

// node class 
class node 
{ 
public: 
    node(); 
    node(T); 
    ~node(); 

    node *next; 
    T data[2]; 

    void borra_todo(); 
    void print(); 
}; 

// by defect 
template<typename T> 
node<T>::node() 
{ 
    data[0] = NULL; 
    data[1] = NULL; 
    next = NULL; 
} 

// by parameter 
template<typename T> 
node<T>::node(T data_) 
{ 
    data[0] = data_[0]; 
    data[1] = data_[1]; 
    next = NULL; 
} 

// delete nodes 
template<typename T> 
void node<T>::borra_todo() 
{ 
    if (next) 
    next->borra_todo(); 

    delete this; 
} 

// node printing 
template<typename T> 
void node<T>::print() 
{ 
    cout << data[0] << " " << data[1] << "->"; 
} 

template<typename T> 
node<T>::~node() {} 

// list 

template <class T> 
class list 
{ 
private: 
     node<T> *m_head; 
     int m_num_nodes; 

public: 
     list(); 
     ~list(); 

     void add_head(T); 
     void add_end(T); 
     void add_sort(T); 
     void fill(char r[30], char n[30]); 
     void search(T); 
     void del_by_data(T); 
     void print(); 
}; 

template<typename T> 
list<T>::list() 
{ 
    m_num_nodes = 0; 
    m_head = NULL; 
} 

//add in the beginning 
template<typename T> 
void list<T>::add_head(T data_) 
{ 
    node<T> *new_node = new node<T>(data_); 
    node<T> *temp = m_head; 

    if (!m_head) 
    { 
     m_head = new_node; 
    } 
    else 
    { 
     new_node->next = m_head; 
     m_head = new_node; 

     while (temp) 
     { 
       temp = temp->next; 
     } 
    } 
    m_num_nodes++; 
} 

// add to the last 
template<typename T> 
void list<T>::add_end(T data_) 
{ 
    node<T> *new_node = new node<T> (data_); 
    node<T> *temp = m_head; 

    if (!m_head) 
    { 
     m_head = new_node; 
    } 
    else 
    { 
     while (temp->next != NULL) 
     { 
       temp = temp->next; 
     } 
     temp->next = new_node; 
    } 
    m_num_nodes++; 
} 

// it is supposed that sorts items in the list ... 
template<typename T> 
void list<T>::add_sort(T data_) 
{ 
    node<T> *new_node = new node<T> (data_); 
    node<T> *temp = m_head; 

    if (!m_head) 
    { 
     m_head = new_node; 
    } 
    else 
    { 
     for (int i =0; i <= 1; i++) 
     { 

      if (m_head->data[0] > data_[i]) 
      { 
       new_node->next = m_head; 
       m_head = new_node; 
      } 
      else 
      { 
       while ((temp->next != NULL) && (temp->next->data[0] < data_[i])) 
       { 
         temp = temp->next; 
       } 
       new_node->next = temp->next; 
       temp->next = new_node; 
      } 
     } 
    m_num_nodes++; 
    } 
} 

// sort adding ... 
template<typename T> 
void list<T>::fill(char rfc[30]) 
{ 
    char temprfc[30]; 
    char tempnombre[30]; 

    temprfc = "DUDE010101R0"; 
    tempnombre = "Dude"; 

    add_sort(temprfc, tempnombre); 
    temprfc = "AUDE010101R1"; 
    tempnombre = "Commander"; 
    add_sort(temprfc, tempnombre); 
} 

// print list 
template<typename T> 
void list<T>::print() 
{ 
    node<T> *temp = m_head; 
    if (!m_head) 
    { 
     cout << "List is empty" << endl; 
    } 
    else 
    { 
     while (temp) 
     { 
      temp->print(); 
      if (!temp->next) 
       cout << "NULL\n"; 

      temp = temp->next; 
     } 
    } 
    cout << endl; 
} 

// search the list 
template<typename T> 
void list<T>::search(T data_) 
{ 
    node<T> *temp=m_head; 
    int cont=1; 
    int cont2=0; 

    while(temp) 
    { 
     if(strcmp(temp->data,data_[0])) 
     { 
      cout<<"Element found " << temp->data; 
      cout << " in position: " << cont << endl; 
      cont2++; 
     } 
     temp=temp->next; 
     cont++; 
    } 
    if(cont2==0) 
    { 
     cout << "Element not found"<<endl; 
    } 
} 

// ... delete by data 
template<typename T> 
void list<T>::del_by_data(T data_) 
{ 
    node<T> *temp = m_head; 
    node<T> *temp1 = m_head->next; 

    int cont =0; 
    if (m_head->data == data_) 
    { 
     m_head = temp->next; 
    } 
    else 
    { 
     while (temp1) 
     { 
      if (temp1->data == data_) 
      { 
       node<T> *aux_node = temp1; 
       temp->next = temp1->next; 
       delete aux_node; 
       cont++; 
       m_num_nodes--; 
      } 
      temp = temp->next; 
      temp1 = temp1->next; 
     } 
    } 
    if (cont == 0) 
    { 
     cout << "No data" << endl; 
    } 
} 

// destroy the constructor 
template<typename T> 
list<T>::~list() {} 

int main() 
{ 
    list<char> list1; 

    char element1[30]; 
    char element2[30]; 

    int dim, choice, pos; 

    do{ 
      cout << "Select a choice.\n"; 
      cout << "1. Print list\n"; 
      cout << "2. Delete an element of the list\n"; 
      cout << "3. Search an element of the list\n"; 
      cout << "4. Exit\n"; 
      cin >> choice; 

      switch(choice) 
      { 
       case 1: 
       { 
        cout << "Printing list:\n"; 
        list1.fill("1","2"); 
        list1.print(); 
        break; 
       } 

       case 2: 
       { 
        cout << "Element to delete: "; 
        cin >> element1; 
        list1.search(element1); 
        element1 = ""; 
        break; 
       } 

       case 3: 
       { 
        cout << "Element to search: "; 
        cin >> element1; 
        list1.search(element1); 
        element1 = ""; 
        break; 
       } 
      } 
    }while(choice != 4); 



    return 0; 
} 

的代碼無法編譯,它標誌着一樣的錯誤:

「的錯誤:原型爲‘無效目錄::填充(字符*)’不匹配'list' void list :: fill(char rfc [30]) ^ t3b.cpp:79:8:error:candidate is:void list :: fill(char *,char *) void fill (char r [30],char n [30]);「

關於如何解決它的任何想法?或者有關如何使用模板將2個元素放入節點的想法?

在此先感謝。

+0

「list :: fill()」的聲明(原型)與其相應的定義不匹配。具體來說,你聲明'fill()'帶兩個參數,但用一個參數定義它。 – 2014-09-22 22:58:15

+0

一個雙向鏈表有2個指針,可能標記爲next和previous。你的努力有一個指針。 – 2014-09-22 23:03:04

+0

在節點中有2個項目是微不足道的。也許你打算確定兩個元素和下一個和之前的元素之間的關係?你的問題是什麼? – 2014-09-22 23:04:28

回答

1

老兄,你應該真的嘗試在發佈之前將錯誤分離一點點。這是500行代碼,我不得不將它複製並粘貼到編輯器中,然後才能看到它。

當你聲明填充時,它有兩個參數,當你定義它時,它有一個參數。此外,我會避免使用字符陣列的原因很多,而使用std::string

+0

哦,謝謝你的建議..我會做到這一點。 – 2014-09-22 23:06:04