2014-09-22 97 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