33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
1

Динамическое выделение памяти для элемента списка

28.07.2018, 16:13. Показов 4552. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть задача - реализовать односвязный список в виде класса. Все вроде бы работает, но возник вопрос. Есть функция push_back, добавляющая узел в конец списка:

C++
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
template <typename T>
class List
{
  public:
    List();
    ~List();
    void push_back(T data);
 
  private:
 
    template <typename>
    class Node
    {
      public:
 
        Node(T data, Node *pNext = NULL)
        {
            data_ = data;
            pNext_ = pNext;
        }
 
        Node *pNext_;
        T data_;
    };
 
    int size_;
    Node<T> *head_;
};
 
 
template <typename T>
List<T>:: List()
{
    size_ = 0;
    head_ = NULL;
}
 
 
template <typename T>
void List<T>:: push_back(T data)
{
    if(head_ == NULL) // Если головной элемент указывает на NULL
        head_ = new Node<T>(data); // Создаем головной узел
    else
    {
        Node<T> *temp = this->head_;
 
        while(temp->pNext_ != NULL) // Идем по списку до тех пор, пока не дойдем до последнего
            temp = temp->pNext_;
 
        temp->pNext_ = new Node<T>(data); // Создаем новый узел в конце списка
    }
 
    size_++;
}
Почему нам обязательно нужно выделять память именно так ?:
C++
1
temp->pNext_ = new Node<T>(data); // Создаем новый узел в конце списка
Почему нельзя, грубо говоря, войти внутрь указателя на следующий элемент, и создать узел, например вот так:

C++
1
2
3
while(temp != NULL) 
            temp = temp->pNext_;
    temp = new Node<T>(data);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2018, 16:13
Ответы с готовыми решениями:

Динамическое выделение памяти для структур
Добрый день. Есть следующие структуры: typedef struct __attribute__((aligned(16))) {...

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

Динамическое выделение памяти для массива
Кто может помочь решить задачу. Для заданного двумерного массива из n строк и m столбцов вывести...

Динамическое выделение памяти для строки
Подскажите, пожалуйста , почему в данной программе появляются ошибки в строке return Vector(v1.x...

9
603 / 403 / 212
Регистрация: 30.04.2017
Сообщений: 743
28.07.2018, 16:50 2
в первом случае указатель будет просто заменен на новый элемент, это не повлияет на сам список
во втором случае, когда ты получаешь доступ к указателю через элемент списка - можно его изменить

Пояснение: первый случай это
C++
1
2
3
while(temp != NULL) 
            temp = temp->pNext_;
    temp = new Node<T>(data);
Миниатюры
Динамическое выделение памяти для элемента списка  
0
33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
28.07.2018, 16:54  [ТС] 3
Да, вот только при таком случае:

C++
1
2
3
while(temp != NULL) 
            temp = temp->pNext_;
    temp = new Node<T>(data);
Программа не работает и выдает ошибку
0
603 / 403 / 212
Регистрация: 30.04.2017
Сообщений: 743
28.07.2018, 16:58 4
Цитата Сообщение от JesD Посмотреть сообщение
Программа не работает и выдает ошибку
По идее ошибку выдавать не должно - просто будет терятся элемент и добавления в конец списка происходить не будет
приведи полный код c main()
0
33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
28.07.2018, 17:36  [ТС] 5
Цитата Сообщение от Ovederax Посмотреть сообщение
во втором случае, когда ты получаешь доступ к указателю через элемент списка - можно его изменить
Я не могу понять, почему так происходит ?
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
28.07.2018, 19:14 6
C++
1
2
3
while(temp != NULL) 
            temp = temp->pNext_;
    temp = new Node<T>(data);
Так temp будет копией pNext и его изменение не изменит pNext.
0
33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
28.07.2018, 20:00  [ТС] 7
Цитата Сообщение от Croessmah Посмотреть сообщение
Так temp будет копией pNext и его изменение не изменит pNext.
То есть получается, что в таком случае temp будет просто указывать на ту же самую область памяти, что и pNext, и узел создастся для temp, а не для pNext ?
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
28.07.2018, 22:25 8
Croessmah, я конечно уже сонный, но разве присвоив NULL temp`у (цикл то пока не NULL) мы вообще сможем выделить в него память?
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
28.07.2018, 23:43 9
Лучший ответ Сообщение было отмечено JesD как решение

Решение

Цитата Сообщение от SuperKir Посмотреть сообщение
я конечно уже сонный, но разве присвоив NULL temp`у (цикл то пока не NULL) мы вообще сможем выделить в него память?
то есть код
C++
1
2
int * temp = nullptr;
temp = new int(10);
ошибочен?
Цитата Сообщение от JesD Посмотреть сообщение
что в таком случае temp будет просто указывать на ту же самую область памяти, что и pNext
угу.
Цитата Сообщение от JesD Посмотреть сообщение
и узел создастся для temp, а не для pNext ?
Указатель - это просто переменная, содержащая значение некоего адреса.
Вы выделите память и перепишите значение, содержащееся в temp.
C++
1
2
3
4
5
6
int x = 10;
int y = x;
y = 20;//x никак не поменяется от этого. С указателями такая же история.
int p1 = nullptr;
int p2 = p1;//скопировали значение адреса из p1 в p2
p2 = new int(10);//переписали значение адреса, содержащийся в p2. p1 не пострадал. :)
Как вариант, можно сделать как-то так:
C++
1
2
3
4
5
6
7
8
9
10
template <typename T>
void List<T>:: push_back(T data)
{
    Node<T> ** pnode = &head_;
    while (*pnode) {
        pnode = &((*pnode)->pNext_);
    }
    *pnode = new Node<T>(data);
    ++size_;
}
Код не проверял, плюс клавиатура заедает, так что могут быть ошибки.
0
SuperKir
29.07.2018, 00:02     Динамическое выделение памяти для элемента списка
  #10

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
ошибочен?
Да, затупил я :-[

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2018, 00:02

Динамическое выделение памяти для двумерного массива
нужна помощь вот тело программы, не могу сделать динамическое выделение памяти для первого...

Для чего нужно динамическое выделение памяти
Расскажите пожалуйста про динамическое выделение памяти в примерах если можно.Зачем оно...

Динамическое выделение памяти для Вектора ( не STL)
привет Ребят, Задание таково, прога читает слова из файла и в зависимости от выбора опций...

Динамическое выделение памяти для структуры в функции
Объясните не могу понять. На С++ пишу совсем недавно. Суть вопроса, при первом запуске программы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru