c ++链接列表内存错误

时间:2017-02-06 05:34:10

标签: c++ pointers linked-list

对于作业,我必须建立这个。我似乎无法看到我做错了什么。当我试图运行这个代码时,我一直看到我的链表存储它的指针' s起始位置在中间指向垃圾。我不知道Visual Studio是否只是在欺骗我,或者我是否错过了在某个地方指定指针。 这是我用来运行代码的主要类

#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的代码,我把它命名为List:

#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 State Bad State

1 个答案:

答案 0 :(得分:0)

在我的第一次审核中,似乎begin方法中的局部变量正在创建问题。请检查下面的代码。我已经注释掉了在begin方法中创建的临时变量,而是使用了指针start。这应该可以解决问题。

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;
}