我正在创建一个由用户输入的大小为n的链接列表。当我刚刚初始化标题时,输出是完美的,但是当我声明它时,输出也会附加两个零。
size = 5如果我写node * head = new node;输出是432100,如果我只写节点*头输出是43210.为什么?
/* I am creating a link list of size n entered by user
* File: main.cpp
* Author: neha
*
* Created on February 2, 2014, 12:39 AM
*/
#include <cstdlib>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
/*
*
*/
using namespace std;
struct node{
int data;
node* next;
};
node* head=new node; //<--------------here
void PushFront(int value) //Inserting nodes at front of link list
{
node* newNode= new node;
newNode->data=value;
newNode->next=head;
head=newNode;
}
void Print() //printing the inserted nodes
{
node* temp= new node;
temp=head;
while(temp!=NULL)
{
cout<< temp->data;
temp=temp->next;
}
}
int main()
{
int size,i;
cout<<"Enter size of linked list"<<endl;//Asking user to enter the size of linklist
cin>>size;
for(i=0;i<size;i++)
{
PushFront(i);
}
Print();
return 0;
}
答案 0 :(得分:2)
您的案例都是未定义的。
在你以前的案例中,
node* head=new node
head指向一个新节点,其下一个未初始化。这意味着head->next = <Garbage>
。
_________
|DATA|NEXT|
head->|----|----|
|Junk|Junk|
|____|____|
After 1st Insert
_________ _________
|DATA|NEXT| |DATA|NEXT|
head->|----|----| |----|----|
| 0 |----|->|Junk|Junk|
|____|____| |____|____|
After nth Insert
_________ _________ _________
|DATA|NEXT| |DATA|NEXT| |DATA|NEXT|
head->|----|----| |----|----| |----|----|
| n |----|...>| 0 |----|->|Junk|Junk|
|____|____| |____|____| |____|____|
在你的第二个案例中
node* head;
现在指向一些未定义的值。
head->Junk
After nth Insert
_________ _________
|DATA|NEXT| |DATA|NEXT|
head->|----|----| |----|----|
| n |----|...>| 0 |----|->Junk
|____|____| |____|____|
两种情况都是相似的,除了在前一种情况下,它只是迭代到一个空白节点,之后行为变得不确定。
第二种情况,与前者类似,只是没有空白(未初始化)节点。
<强>解决方案强>
node* head=nullptr;
声明并初始化为nullptr
head->nullptr
After nth Insert
_________ _________
|DATA|NEXT| |DATA|NEXT|
head->|----|----| |----|----|
| n |----|...>| 0 |----|->nullptr
|____|____| |____|____|
答案 1 :(得分:1)
这是因为当您访问未指向有效内存的指针时,您的代码正在调用未定义的行为。当您调用未定义的行为时,任何事情都可能发生,包括您的代码正常工作。
如果未将指针设置在开头,则其值未定义。
在您之前的情况下,当您尝试读取您创建的第一个头部内的值时,您将访问无效指针。因为您从未设置node* next;
的值,所以它被设置为未定义的值,并且当它尝试访问您的程序崩溃的值时。
一个简单的解决方法是添加一个设置值
的构造函数node() : data(0), next(nullptr){}
您的代码的另一个问题是
node* temp= new node;
temp=head;
您不必要地使用动态内存创建节点,但您永远不会删除它。将您的代码更改为此
node* temp = head;
答案 2 :(得分:1)
如果你只声明node* head
,那么head
的值是未定义的(“垃圾”),你应该避免使用它。
代码中的另一个问题是:
node* temp= new node;
temp=head;
通过设置temp = something
然后temp = something else
来确定您要执行的操作。显然,第一个赋值是无用的,因为它被第二个赋值所覆盖。在这种特殊情况下,它会导致程序内存泄漏,因为您“丢失”了动态分配的内存指针。
答案 3 :(得分:0)
如果您要使用以下代码创建头点-节点*头=新节点; -然后您必须将head节点的初始值初始化为NULL,否则它将为零(0),即head = NULL;
int main()
{
head = NULL; // <<------Here
int size,i;
cout<<"Enter size of linked list"<<endl;
cin>>size;
for(i=0;i<size;i++)
{
PushFront(i);
}
只需在上面的代码中添加一行,它就会运行。