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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
InventoR
3 / 3 / 0
Регистрация: 26.10.2010
Сообщений: 41
#1

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

31.01.2014, 16:29. Просмотров 280. Ответов 8
Метки нет (Все метки)

Есть кусок связанного списка, только начал его делать, в тырнете много примеров как он реализован на структурах, в одних случаях структура вне класса, в других внутри класса, но задание дали реализовать связанный список классами. Проблема в том что не получилось реализовать класса ноды внутри класса 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++
ребят,нужна помощь. короче дело в том,что нужно &quot;то есть тебе нужно поменять местами ссылки друг на друга.. то есть когда ты считываешь...

Связанный список - C++
Не могу обратиться к методу класса Node хотя они выраженны как public: void addNode(int d); void printList(); #include&lt;iostream&gt; ...

Связанный список. - C++
Компилятор ругается на строку 169 In member function `virtual Node* HeadNode::Insert(Data*)': 169 argument of type...

Связанный список - C++
Всем доброго время суток, написать программу демонстрации связанного списка, где PART - (ДЕТАЛЬ) содержит номер детали и остальную...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
БНТУ ФИТР
215 / 155 / 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
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
31.01.2014, 16:42     И снова связанный список #4
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
зачем класс Node вам нужно делать обобщенным?
Гы.
А как же узнать значение поля элемента списка?
C++
1
2
        LinkedList<Type> *first;
        LinkedList<Type> *last;
См. выше.
kventin_zhuk
БНТУ ФИТР
215 / 155 / 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
БНТУ ФИТР
215 / 155 / 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++
Доброго времени суток. Пытаюсь посчитать количество значений в циклическом списке. Но всегда получается на 1 значение меньше. Или я должен...

Однонаправленный связанный список - C++
вот задание Однонаправленный связанный список Тип информационной части узла списка-char 1. Определение структуры информационной...

Создать связанный список - 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     И снова связанный список
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru