我是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();
}
在
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
headand
tail`。更惯用的方法是使用Member Initializer List
LinkedList(): head(NULL), tail(NULL)
{
// does nothing.
}
出现警告级别的好编译器会警告你
Node* head = NULL;
没有做任何有用的事情。永远不要忽略编译器警告。编译器警告意味着虽然您的程序在语法上可能正确,但它可能不会执行您希望它执行的操作。警告是您抵御逻辑错误的第一道防线。始终尝试理解并解决编译器告诉您的内容。它可以节省您以后的调试时间。
问题是你的构造函数:
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;
如果你想使用默认的。
将您的代码更改为
LinkedList(){
head = NULL;
tail = NULL;
}
因为你已经定义了head
和tail
。