2014-09-22 4 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; 
} 

코드는 컴파일되지 않습니다, 그것은 같은 오류를 표시 void list :: fill (char *, char *) void fill (char *, char *) : void list :: fill (char rfc [30]) void list :: fill (char r [30], char n [30]); "

문제를 해결하는 방법에 대한 아이디어가 있으십니까? 또는 템플릿을 사용하여 노드에 두 요소를 넣는 방법에 대한 아이디어가 있습니까?

미리 감사드립니다.

+0

'list :: fill()'의 선언 (프로토 타입)이 해당 정의와 일치하지 않습니다. 구체적으로 말하면,'fill()'선언을 통해 두 개의 매개 변수를 취하지 만 하나의 매개 변수로 정의했습니다. –

+0

이중 연결 목록에는 2 개의 포인터가 있으며, 다음 및 이전 레이블이 붙어 있습니다. 당신의 노력은 하나의 포인터를 가지고 있습니다. –

+0

한 노드에 2 개의 항목이있는 것은 간단합니다. 아마도 두 요소와 다음 요소 및 이전 요소의 관계를 확인하려고했을 것입니다. 귀하의 질문은 무엇인가? –

답변

1

야, 정말로 게시하기 전에 오류를 조금씩 격리시켜야합니다. 이것은 500 줄의 코드입니다. 나는 그것을보기 전에 에디터에 복사하여 붙여 넣어야했습니다.

fill을 선언 할 때 두 개의 인수가 있는데, 정의 할 때 하나의 인수가 있습니다. 또한 여러 가지 이유 때문에 문자 배열을 사용하지 않고 대신 std::string을 사용합니다.

+0

오, 덕분에 .. 조언 해 줘. –

관련 문제