2017-02-06 83 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总是会触发它,所以我评论了这一行,尽管这并没有解决问题。 Good StateBad State

+2

寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者无益。请参阅:[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

查看'node',不管它是首先还是下一个'list'。 – macroland

+0

您确定关于节点 temp =(* end)在Add_Back? – MegaStupidMonkeys

回答

0

在我的第一个评论中,似乎begin方法中的局部变量正在创建问题。请检查我的代码如下。我已经注释掉在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; 
}