2017-02-06 6 views
0

Для задания мне нужно это построить. Я просто не могу понять, что я делаю неправильно. Когда я пытаюсь запустить этот код, я продолжаю видеть указатель, который мой связанный список хранит в его исходном местоположении, и указывает на мусор прямо посередине. Я не знаю, только ли Visual Studio просто ошеломляет меня, или если мне не хватает назначения указателя где-нибудь. Это основной класс я использую, чтобы запустить мой кодC++ Связанный список Ошибка памяти

#include "stdafx.h" 
#include "Iterator.h" 
#include "Node.h" 
#include "List.h" 
#include <iostream> 


int main() 
{ 


int input = 0; 
List<double> salaryList; 
std::cin >> input; 

Node<double> tim(7.0, nullptr); 
Node<double> sim(input, nullptr); 
Node<double> jim(7.5, nullptr); 

salaryList.Add_back(&jim); 
salaryList.Add_back(&tim); 
salaryList.Insert_front(&sim); 

Iterator<double> checkSalaries=salaryList.begin(); 
//std::cout << "printing all elements in Iterator" << std::endl; 
while (checkSalaries.Is_item()){ 
    double x = (*checkSalaries).value; 
    std::cout << x << std::endl; 
    checkSalaries++; 
} 
system("PAUSE"); 
return 0; 
} 

Это код для LinkedList, я просто назвал его список:

#include "Iterator.h" 
#include "Node.h" 
template <class t> 
class List 
{ 
private: 
Node<t>* start=nullptr; 
Node<t>* end=nullptr; 
int size = 0; 
public: 
List() { 
    start = nullptr; 
    end = nullptr; 
} 
~List() { 

    } 
void Insert_front(Node<t> * input) { 

    if (start != nullptr) 
    { 
     input->setPoint(start); 
     start = input; 

     size++; 
    } 
    else { 
     start = input; 
    } 
    if (start->point != nullptr && end == nullptr) { 
     end = start->point; 

     size++; 
    } 
} 
void Add_back(Node<t> * input) { 
    if (end != nullptr) { 
     Node<t> temp = (*end); 
     temp.setPoint(input); 
     end = input; 

    } 
    else { 
     if (start != nullptr) { 
      start->point=input; 
      end = input; 
     } 
     else { 
      start = input; 
     } 
     size++; 
    } 
} 
Iterator<t> begin() const 
{ 
    Node<t> tempNode = *start; 
    Iterator<t> temp(&tempNode); 
    return temp; 
} 
void Remove_all() 
    { 
     List<Node<t>> temp; 
     start = temp.start; 
     end = temp.end; 
     size = 0; 
    } 


int Size() const { 
    return size; 
} 
}; 

Это код узла:

template <class T> 
class Node { 

public: 
T value; 
Node<T> * point; 
Node(T first, Node<T> * second) 
{ 
    value = first; 
    point = second; 
} 
Node() 
{ 
    value = NULL; 
    point = nullptr; 
} 
void setPoint(Node<T> * input) { 
    point = input; 
} 
}; 

Я собираюсь включить здесь два изображения: первое - это то, что похоже на то, что перед тем, как оно сойдет с ума, а следующее - это то, что происходит сразу после этого, кажется, происходит довольно случайным образом, но я обнаружил, что использование cout всегда вызывает его, поэтому я прокомментировал эту строку, хотя это не решило проблему. Bad State

+2

Вопросы, требующие помощи по отладке («почему этот код не работает?») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Глядя на «узел», не следует ли это управлять, будь то первый или следующий «список». – macroland

+0

Вы уверены, что Node temp = (* end) в Add_Back? – MegaStupidMonkeys

ответ

0

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

Iterator<t> begin() const 
{ 
    // Node<t> tempNode = *start; <-- A local variable is used here 
    // Iterator<t> temp(&tempNode); <-- address of local variable passed to iterator. 
    Iterator<t> temp(start); 
    return temp; 
} 
Смежные вопросы