Форум программистов, компьютерный форум CyberForum.ru

И снова связанный список - C++

Восстановить пароль Регистрация
 
InventoR
3 / 3 / 0
Регистрация: 26.10.2010
Сообщений: 41
31.01.2014, 16:29     И снова связанный список #1
Есть кусок связанного списка, только начал его делать, в тырнете много примеров как он реализован на структурах, в одних случаях структура вне класса, в других внутри класса, но задание дали реализовать связанный список классами. Проблема в том что не получилось реализовать класса ноды внутри класса LinkedList, хотя ведь по идее всего 2 свойства, это data и указатель на *next элемент.
Пока это все выглядит вот так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <string>
 
template <class Type>
class Node {
    public:
        Type data;
        Node<Type> *next;
};
 
template <class Type>
class LinkedList {
    private:
        LinkedList<Type> *first;
        LinkedList<Type> *last;
 
    public:
        LinkedList();
        LinkedList(Type data);
        void Add(Type value);
        void Print();
        void Pointer();
};
 
template <class Type>
LinkedList<Type>::LinkedList() {
    first = NULL;
}
 
template <class Type>
void LinkedList<Type>::Add(Type value) {
    Node<Type> *temp = new Node<Type>();
    std::cout << "First, pointer: " << first << std::endl;
    std::cout << "Last, pointer: " << last << std::endl;
    std::cout << "Add, pointer temp: " << temp << std::endl;
    temp->data = value;
    temp->next = NULL;
    first = temp;
}
 
template <class Type>
void LinkedList<Type>::Print() {
 
 
}
При компиляции получаю:
In file included from LinkedListMain.cpp:3:0:
LinkedList.cpp: In instantiation of «void LinkedList<Type>::Add(Type) [with Type = int]»:
LinkedListMain.cpp:15:13: required from here
LinkedList.cpp:38:2: ошибка: cannot convert «Node<int>*» to «LinkedList<int>*» in assignment
Тут присваиваю указателю first класса, указатель на новую Node списка.

Направте на путь истинный, и может кто-то покажет решение если базовый класс будет такого вида:

C++ (Qt)
1
2
3
4
5
6
class LinkedList {
    private:
        Type data;
        Node<Type> *next;
        LinkedList<Type> *first;
        LinkedList<Type> *last;
Может также кто-то обьяснит почему лучше не обьеденять это все в одном классе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 16:29     И снова связанный список
Посмотрите здесь:

C++ Связанный список.
C++ Связанный список
Связанный список C++
Связанный список C++
C++ Связанный список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
31.01.2014, 16:36     И снова связанный список #2
Ну так вы чего хотели temp указатель на Node<Type>, а first указатель на LinkedList<Type>. И вы их присваиваете один другому:
C++
1
    first = temp;
Переделайте список вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class Type>
class LinkedList {
    private:
        Node<Type> *first;
        Node<Type> *last;
 
    public:
        LinkedList();
        LinkedList(Type data);
        void Add(Type value);
        void Print();
        void Pointer();
};
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
31.01.2014, 16:39     И снова связанный список #3
InventoR, зачем класс Node вам нужно делать обобщенным?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class Type>
class LinkedList 
{
    private:
        class Node 
        {
        public:
            Type data;
            Node *next;
        };
 
        LinkedList<Type> *first;
        LinkedList<Type> *last;
 
    public:
        LinkedList();
        LinkedList(Type data);
        void Add(Type value);
        void Print();
        void Pointer();
};
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
31.01.2014, 16:42     И снова связанный список #4
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
зачем класс Node вам нужно делать обобщенным?
Гы.
А как же узнать значение поля элемента списка?
C++
1
2
        LinkedList<Type> *first;
        LinkedList<Type> *last;
См. выше.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
31.01.2014, 16:53     И снова связанный список #5
Ilot, недосмотрел Да там точно node нужны
InventoR
3 / 3 / 0
Регистрация: 26.10.2010
Сообщений: 41
31.01.2014, 16:54  [ТС]     И снова связанный список #6
Ilot, может я туплю, но в вашем первом посте не вижу разницы между тем что было у меня и приведенной вырезкой кода у вас.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
31.01.2014, 17:09     И снова связанный список #7
InventoR,
C++
1
2
Node<Type> *first;
Node<Type> *last;
и
C++
1
2
LinkedList<Type> *first;
LinkedList<Type> *last;
+ можете класс Node в класс списка поместить.
InventoR
3 / 3 / 0
Регистрация: 26.10.2010
Сообщений: 41
31.01.2014, 17:22  [ТС]     И снова связанный список #8
Да, уже увидел. Вроде часть получилась.
Сейчас перезагрузил оператор = у Node, чтобы можно было присваивать.
Сейчас попробую если класс будет внутри.

Добавлено через 10 минут
Получилось вот так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class Type>
class LinkedList {
    private:
        class Node {
            public:
                Type data;
                Node *next;
        };      
        Node *first;
        Node *last;
        
    public:
        LinkedList();
        LinkedList(Type data);
        void Add(Type value);
        void Print();
        void Pointer();
};
Здесь не получается сделать вот так:
Node<Type> *first;
Node<Type> *last;

Потому что это не шаблонные классы, но мы ведь фактически создаем только указатели, по этому по идее не важно или не прав?

извините если не правильно говорю, опыта еще очень мало и только учусь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2014, 00:40     И снова связанный список
Еще ссылки по теме:

Связанный список. Создать, записать в связный список последовательность слов,обозначающих месяцы года,заданных пользователем C++
Создать связанный список C++
C++ Связанный список (ООП)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
InventoR
3 / 3 / 0
Регистрация: 26.10.2010
Сообщений: 41
02.02.2014, 00:40  [ТС]     И снова связанный список #9
В общем вдруг кому-то понадобится, код рабочий.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <string>
 
template <class Type>
class LinkedList {
    private:
        class Node {
            public:
                Type data;
                Node *next;
                Node() : next(NULL), data(0) {}
                Type Next() { return next; };
        };      
        Node *first;
        size_t size;
        
    public:
        LinkedList();
        LinkedList(Type data);
        int getSize() const;
        void Add(Type value);
        void Delete(Type value);
        void Print();
        void Pointer();
 
};
 
template <class Type>
LinkedList<Type>::LinkedList() {
    first = NULL;
    size = 0;
}
 
template <class Type>
void LinkedList<Type>::Add(Type addData) {
    Node *temp = new Node();
 
    temp->data = addData;
    if ( first == NULL ) {
        first = temp;
    } else {
        Node *cur = first;
        int count = 0;
 
        for ( ; cur->next != NULL ; cur = cur->next ) ;
 
        cur->next = temp;
    }
    size += 1;
}
 
template <class Type>
void LinkedList<Type>::Delete(Type delData) {
    Node *temp1 = first;
 
    if ( temp1 == NULL ) {
        std::cout << "The list is empty!" << std::endl;
    }
    
    if ( temp1->data == delData ) {
        first = temp1->next;
        delete temp1;
        size -= 1;
        return;
    }
 
    Node *temp2 = first;
 
    for ( ; temp1 != NULL ; temp1->next ) {
        if ( temp1->data == delData ) {
            temp2->next = temp1->next;
            delete temp1;
            size -= 1;
            return;
        }
 
        temp2 = temp1;
        temp1 = temp1->next;
    }
    
    std::cout << "Element: " << delData << " not found." << std::endl;
 
 
}
 
template <class Type>
void LinkedList<Type>::Print() {
    for ( Node *cur = first ; cur != NULL; cur = cur->next ) {
        std::cout << "NEXT: " << cur->next <<  " " << "Data: " << cur->data <<  std::endl;
    }
    std::cout << "Size: " << size << std::endl;
}
Yandex
Объявления
02.02.2014, 00:40     И снова связанный список
Ответ Создать тему
Опции темы

Текущее время: 23:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru