繁体   English   中英

链表:“node* head=new node”和“node* head”的区别

[英]Linked list: Difference between “node* head=new node” and “node* head”

我正在创建一个由用户输入的大小为 n 的链接列表。在这里,当我刚刚初始化标题时,输出是完美的,但是当我声明它时,输出附加了两个零。

对于 size=5 如果我写 node* head=new node; 输出是 432100,如果我只写 node* head 输出是 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;
}

您的两种情况都未定义。

在你以前的情况下,

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 现在指向一些未定义的值。

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
      |____|____|    |____|____|  

这是因为当您访问未指向有效内存的指针时,您的代码正在调用未定义的行为。 当您调用未定义的行为时,任何事情都可能发生,包括您的代码正常工作。

如果你没有在开始时设置指针,那么它的值是未定义的。

在前一种情况下,当您尝试读取您创建的第一个头内的值时,您访问的是无效指针。 因为你从不设置node* next;的值node* next; 然后它被设置为未定义的值,当它试图访问你的程序崩溃的值时。

一个简单的解决方法是添加一个设置值的构造函数

node() : data(0), next(nullptr){}

您的代码的另一个问题在这里

node* temp= new node;
temp=head;

您使用动态内存不必要地创建了一个节点,但您从不删除它。 将您的代码更改为此

node* temp = head;

如果你只需要声明node* head ,那么价值head是未定义的(“垃圾”),你应该避免使用它。

代码中的另一个问题是:

node* temp= new node;
temp=head;

通过设置temp = something然后temp = something else不确定您要做temp = something else 显然,第一个赋值没有用,因为它被第二个赋值覆盖了。 在这种特定情况下,它会导致您的程序内存泄漏,因为您“丢失”了动态分配的内存指针。

如果您使用此代码创建头部点头 -- node* head=new node; --那么你必须将头节点的初始值初始化为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);
}

只需在上面的代码中多加一行,它就会运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM