2017-02-13 4 views
0

Мне нужно создать связанный список, который работает с шаблоном, чтобы он мог получить данные любого типа. Эта часть кажется достаточно простой, но по какой-то причине я подернул свой код всеми возможными способами, и мое понимание всего шаблона просто не кажется достаточным.C++ Я не могу заставить шаблоны работать в связанном списке по какой-то причине, я уверен, что это простая ошибка, но я просто не получаю ее

"LinkedList.h"

#ifndef LINKED_LIST_H 
#define LINKED_LIST_H 
using namespace std; 

template <class N> 
class list{ 
private: 

template <class N> 
struct node{ 

N data; 
node* next; 

}; 
    node<N>* head; 
    node<N>* curr; 
    node<N>* temp; 
    node<N>* tail; 

public: 
    list(); 
    void AddNode(N addData); 
    void DeleteNode(N delData); 
    void PrintList(); 

}; 

template <class N> 
list<N>::list(){ 
    head = NULL; 
    curr = NULL; 
    temp = NULL; 
    tail = NULL; 

} 

template <class N> 
void list<N>::AddNode(N addData){ 
    node<N>* n = new node; 
    n->next=NULL; 
    n->data = addData; 

    if (head != NULL){ 
     curr = head; 
     while (curr->next != NULL){ 
      curr = curr->next; 
     } 
     curr->next = n; 
    } 
    else { 
     head = n; 
    } 
} 

template <class N> 
void list<N>::DeleteNode(N delData){ 
    node<N>* delPtr = NULL; 
    temp = head; 
    curr = head; 
    while (curr != NULL && curr->data != delData) { 
     temp = curr; 
     curr = curr->next; 
    } 
    if (curr == NULL){ 
     cout << delData << " Was not in the list." << endl; 
     delete delPtr; 
    } 
    else { 
     delPtr = curr; 
     curr = curr->next; 
     temp->next = curr; 
     if (delPtr == head){ 
      head = head->next; 
      temp = NULL; 
     } 
     delete delPtr; 
     cout << "The value " << delData << " was deleted." << endl; 
    } 

} 

template <class N> 
void list<N>::PrintList(){ 
    curr = head; 
    while (curr != NULL) { 
     cout << curr->data << endl; 
     curr = curr->next; 
    } 
} 

#endif 

и главное, просто чтобы проверить, если функции действительно работают.

#include <iostream> 
#include <cstdlib> 

#include "LinkedList.h" 


int main(){ 
    list<int> a; 
    a.AddNode(3); 


    a.PrintList(); 

    system("pause"); 

    return 0; 
} 

Но они не делают, я получаю 17 ошибок, и все они являются только синтаксические ошибки, которые не имеют никакого смысла, как ; missing before < in line 1 и так. Не могли бы вы сказать мне, что я делаю неправильно? Я знаю, что это должно быть что-то простое, чего я не вижу, потому что я новичок в этом, но это так расстраивает!

+0

Когда вы получите кучу ошибок подобных тем, что вы говорите (пожалуйста, вы можете включать фактические ошибки? скопировать-вставить как текст?), всегда смотрите на * first * error. Перейдите в строку, указанную этой ошибкой, похоже ли, что в этой строке есть проблема? Нет? Затем перейдите к * предыдущей * (непустой, без комментариев) строке (которая не сообщается в сообщениях об ошибках) и посмотрите, что вы там делаете. Если предыдущая строка является «# include», вы проверяете, в какой конец включен загоранный файл. –

+0

В 'AddNode' строка' node * n = new node; 'использует' node 'в одном месте, а просто' node' в другом месте. –

ответ

0

Я пробую ваш код, и я получаю только «шаблон тени», который можно решить, перемещая объявление узла за пределами объявления связанного списка. Затем в списке :: AddNode (N) вы должны исправить свое объявление n.

Я был в состоянии скомпилировать его, но я не тестировал ваш код в глубину.

#ifndef LINKED_LIST_H 
#define LINKED_LIST_H 
using namespace std; 

template <class N> 
struct node{ 

N data; 
node* next; 

}; 

template <class N> 
class list{ 
private: 


    node<N>* head; 
    node<N>* curr; 
    node<N>* temp; 
    node<N>* tail; 

public: 
    list(); 
    void AddNode(N addData); 
    void DeleteNode(N delData); 
    void PrintList(); 

}; 

template <class N> 
list<N>::list(){ 
    head = NULL; 
    curr = NULL; 
    temp = NULL; 
    tail = NULL; 

} 

template <class N> 
void list<N>::AddNode(N addData){ 
    node<N>* n = new node<N>; // previously: node<N>* n = new node; 
    n->next=NULL; 
    n->data = addData; 

    if (head != NULL){ 
     curr = head; 
     while (curr->next != NULL){ 
      curr = curr->next; 
     } 
     curr->next = n; 
    } 
    else { 
     head = n; 
    } 
} 

template <class N> 
void list<N>::DeleteNode(N delData){ 
    node<N>* delPtr = NULL; 
    temp = head; 
    curr = head; 
    while (curr != NULL && curr->data != delData) { 
     temp = curr; 
     curr = curr->next; 
    } 
    if (curr == NULL){ 
     cout << delData << " Was not in the list." << endl; 
     delete delPtr; 
    } 
    else { 
     delPtr = curr; 
     curr = curr->next; 
     temp->next = curr; 
     if (delPtr == head){ 
      head = head->next; 
      temp = NULL; 
     } 
     delete delPtr; 
     cout << "The value " << delData << " was deleted." << endl; 
    } 

} 

template <class N> 
void list<N>::PrintList(){ 
    curr = head; 
    while (curr != NULL) { 
     cout << curr->data << endl; 
     curr = curr->next; 
    } 
} 

#endif 

Тогда в main.cpp

#include <iostream> 
#include <cstdlib> 

#include "ll.hpp" 


int main(){ 
    list<int> a; 
    a.AddNode(3); 
    a.AddNode(5); 
    a.AddNode(1); 
    a.PrintList(); 
    a.DeleteNode(4); 
    a.PrintList(); 
    a.AddNode(10); 
    a.DeleteNode(3); 
    a.PrintList(); 

    //system("pause"); 

    return 0; 
} 

С выходом

3 
5 
1 
4 Was not in the list. 
3 
5 
1 
The value 3 was deleted. 
5 
1 
10 
Смежные вопросы