С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

31.01.2014, 16:29. Просмотров 309. Ответов 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;
Может также кто-то обьяснит почему лучше не обьеденять это все в одном классе?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 16:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос И снова связанный список (C++):

Связанный список. Создать, записать в связный список последовательность слов,обозначающих месяцы года,заданных пользователем - C++
Создать связанный список.Кроме информационных полей он должен обязательно содержать указатели на предыдущий и следующий за ним...

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

Связанный список - C++
Доброе утро есть ли у кого пример Связанного списка. И чем он вообще отличаетьсяот массива кроме того , что связанный список динамичен.

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

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

Связанный список - C++
ребят,нужна помощь. короче дело в том,что нужно &quot;то есть тебе нужно поменять местами ссылки друг на друга.. то есть когда ты считываешь...

8
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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();
};
0
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();
};
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
31.01.2014, 16:42 #4
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
зачем класс Node вам нужно делать обобщенным?
Гы.
А как же узнать значение поля элемента списка?
C++
1
2
        LinkedList<Type> *first;
        LinkedList<Type> *last;
См. выше.
2
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
31.01.2014, 16:53 #5
Ilot, недосмотрел Да там точно node нужны
0
InventoR
3 / 3 / 0
Регистрация: 26.10.2010
Сообщений: 41
31.01.2014, 16:54  [ТС] #6
Ilot, может я туплю, но в вашем первом посте не вижу разницы между тем что было у меня и приведенной вырезкой кода у вас.
0
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 в класс списка поместить.
1
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;

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

извините если не правильно говорю, опыта еще очень мало и только учусь.
0
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;
}
0
02.02.2014, 00:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2014, 00:40
Привет! Вот еще темы с ответами:

Связанный двусторонний список - C++
Решил написать свой двусторонний список и совершенно внезапно столкнулся с проблеммой отчистки. Итак вот класс элемента списка и его...

Создать связанный список - C++
Если создать структуру я могу, то со связными списками совсем беда.

Циклический связанный список - C++
Доброго времени суток. Пытаюсь посчитать количество значений в циклическом списке. Но всегда получается на 1 значение меньше. Или я должен...

Связанный список (ООП) - C++
Ребят , помогите с лабой пожалуйста. Вот задание : Створити динамічний клас University, що базується на зв’язному списку, де кожний...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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