Проблема с односвязным списком

303
17 февраля 2018, 22:51

Вобщем, есть вопросик. Делаю односвязный список. Естественно, это класс и структура. Вообщем видел другие, функцию добавления элемента, пишут через new Item, я же просто объявляю Item. Вроде бы по отладке все пашет, но когда вызываю функцию вывода, значения поинтеров firstItem и lastItem теряются... Может кто сможет помочь? Вроде бы при обычном объявлении должна тоже выделяться память (Item itm;)

List.h

#pragma once 

class List
{
    struct Item {
        int number;
        Item * next;
    };
    int countAll;
    Item * firstItem = NULL;
    Item * lastItem = NULL;
public:
    void AddLast(int);
    void RemoveLast();
    void ShowAllElements();
    void showItem(Item *);
    List();
    ~List();
};

list.cpp

 #include "stdafx.h"
#include "List.h"
#include <iostream>
using namespace std;
void List::AddLast(int n)
{
    Item itm = { n, NULL };
    /*itm->next = NULL;
    itm->number = n;*/
    if (firstItem == lastItem) {
        firstItem = &itm;
        lastItem = firstItem->next;
    }
    else {
        lastItem = &itm;
        lastItem->next = itm.next;
        lastItem = lastItem->next;
    }
}
void List::RemoveLast()
{
    Item * tmp;
    tmp = lastItem->next;
    delete lastItem;
    lastItem = tmp;
}
void List::ShowAllElements()
{
    Item *next = firstItem->next;
    Item *itm = firstItem;
    while (next) {
        showItem(itm);
        itm = itm->next;
        next = itm->next;
    }
}
void List::showItem(Item * itm) {
    cout << "there is number: " << itm->number << endl;
}
List::List()
{
    Item itm;
    this->firstItem = this->lastItem = &itm;
}

List::~List()
{
}

main

// OneRootList.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include "List.h"
#include <iostream>

using namespace std;
int main()
{
    List list;
    list.AddLast(1);
    list.AddLast(1);
    list.ShowAllElements();
}
Answer 1
void List::AddLast(int n)
{
    // создали ЛОКАЛЬНУЮ переменную 
    Item itm = { n, NULL };
    /* ... */
        // присвоили её адрес...
        firstItem = &itm;
    // а вот тут локальня переменная itm уничтожается, и
    // firstItem теперь указывает в никуда
}

Та же проблема и в конструкторе. И при этом ещё и в методе RemoveLast() вы применяете delete к памяти, которая вообще непонятно что из себя представляет.

Выводы:

  1. Новый элемент списка должен создаваться через new
  2. Предусмотреть корректное удаление созданных элементов в деструкторе.
READ ALSO
Как boost::filesystem::directory_entry::path() добавить в const char **

Как boost::filesystem::directory_entry::path() добавить в const char **

Доброе время сутокЕсть класс, у него есть член

284
Табуляция в консоле

Табуляция в консоле

Уже комп виснет от вкладок, а я никак не пойму, как сделать нормальную табуляцию в консолеКод для примера:

264
освобождение памяти с++

освобождение памяти с++

есть функция в ней я выделяю память под массив x, провожу вычисления, далее возвращаю

222
логическая ошибка в операторе функтора

логическая ошибка в операторе функтора

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

207