我是C ++中的类和对象的新手。我不明白为什么未创建链接列表。它只是提示第一个值,然后崩溃。我无法弄清楚问题出在哪里,并且已经浪费了太多时间。最终决定获得一些帮助。感谢您的时间。
#include <iostream>
using namespace std;
class Node{
private:
int data;
Node* next;
Node* previous;
public:
Node(int value){
data = value;
next = NULL;
previous = NULL;
}
void setValue(int value)
{
data = value;
}
int getValue()
{
return data;
}
Node* getNext()
{
return next;
}
void setNext(Node* address)
{
next = address;
}
Node* getPrevious(){
return previous;
}
void setPrevious(Node* address){
previous = address;
}
};
class LinkedList{
private:
Node* head;
Node* tail;
public:
LinkedList(){
Node* head = NULL;
Node* tail = NULL;
}
void createLinklist(){
int n;
cout << "Enter the number of nodes = ";
cin >> n;
for(int i=0;i<n;i++)
{
int value;
cout << "Enter the value at " << i <<"=";
cin >> value;
Node* node = new Node(value);
if(head == NULL)
{
head = node;
tail = node;
}
else{
insertAtEnd(node,tail);
}
}
}
void insertAtEnd(Node* newNode,Node* lastNode)
{
lastNode->setNext(newNode);
newNode->setPrevious(lastNode);
newNode->setNext(NULL);
tail = newNode;
}
void display(){
Node* start = head;
while(start!=NULL)
{
cout << "Address=" << start << endl;
cout << "value = " << start->getValue() << endl;
cout << "Next = " << start->getNext() << endl;
start = start->getNext();
}
}
};
int main(){
LinkedList newLink;
newLink.createLinklist();
newLink.display();
}
答案 0 :(得分:2)
在
LinkedList(){
Node* head = NULL;
Node* tail = NULL;
}
Node* head = NULL;
告诉编译器创建一个名为head
的新自动变量,该变量是指向Node
的指针,并将此新变量设置为NULL
。这个新的head
shadows LinkedList::head
,将其替换为构造函数的其余部分。结果是head
一个仅存在于构造函数主体中的变量,它获得了LinkedList::head
专用的初始化(实际上是赋值)。
这意味着当您进入
if(head == NULL)
在createLinklist
中,LinkedList::head
可能不是NULL
,而是指向深蓝色的边界,因此程序执行
insertAtEnd(node,tail);
和LinkedList::tail
的命运与LinkedList::head
相同,并且可能指向您无法安全书写的地方。该程序可能会在此时崩溃,但是它可能会覆盖其他重要内容,并导致该程序稍后崩溃,从而隐藏了错误的真实位置。
LinkedList(){
head = NULL;
tail = NULL;
}
分配NULL to
头and
尾巴。一种更惯用的方法是使用Member Initializer List
LinkedList(): head(NULL), tail(NULL)
{
// does nothing.
}
一个好的警告级别的编译器会警告您
Node* head = NULL;
没有任何用处。永远不要忽略编译器警告。编译器警告表示,尽管您的程序在语法上可能是正确的,但它可能没有按照您的意愿执行。警告是您防范逻辑错误的第一道防线。始终尝试理解并解决编译器告诉您的内容。这样可以节省您以后的调试时间。
答案 1 :(得分:1)
问题是您的构造函数:
class LinkedList{
private:
Node* head;
Node* tail;
public:
LinkedList(){
Node* head = NULL;
Node* tail = NULL;
}
在构造函数中,您将两个LOCAL变量声明为NULL,而不是类中的变量。这意味着该类指向任何地方,但很可能不是NULL。
建议:学习C ++ 11或更高版本。
基本上C ++ 11允许您执行以下操作:
class LinkedList{
private:
Node* head = nullptr;
Node* tail = nullptr;
尽管您可以添加以下内容,但您并不需要构造函数,
LinkedList() = default;
如果要使用默认值。
答案 2 :(得分:0)
将代码更改为
LinkedList(){
head = NULL;
tail = NULL;
}
因为您已经定义了head
和tail
。