Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;节点和链表语法_C++_Data Structures - Fatal编程技术网

C++ C++;节点和链表语法

C++ C++;节点和链表语法,c++,data-structures,C++,Data Structures,我对这个代码有问题。我对C++很陌生,但是大部分都已经很容易理解了。我尝试过制作一个简单的链表数据结构,但是,它打印的是垃圾,而不是列表中的值。我的问题是,让它显示地址的语法哪里出错了 输出: class Node { public: int data; Node *next; Node(int data) { data = data; next = NULL; }; }; class LinkedList { N

我对这个代码有问题。我对C++很陌生,但是大部分都已经很容易理解了。我尝试过制作一个简单的链表数据结构,但是,它打印的是垃圾,而不是列表中的值。我的问题是,让它显示地址的语法哪里出错了

输出:

class Node
{
  public:
    int data;
    Node *next;

    Node(int data)
    {
      data = data;
      next = NULL;
    };
};

class LinkedList
{

    Node *first;
    Node *last;
    int count;

public:
    LinkedList()//constructor for the LinkedList
    {
        //initialization 
        first = NULL;
        last = NULL;
        count = 0;
    };
    void AddItem(int data)
    {
        Node *newItem = new Node(data);

        if(first == NULL)
        {
          first = newItem;
          last = newItem;
        }
        else
        {
          Node *traversal = first;
          while(traversal->next != NULL)
          {
              traversal = traversal->next;
          }
          traversal->next = newItem;
          last = traversal->next;
        }
        count++;
    }

    void DisplayList()
    {
        cout<<endl;
        Node *traversal = first;
        while(traversal->next != NULL)
        {
            cout<<"["<<traversal->data<<"] ";
            traversal = traversal->next;

            if(traversal == NULL)
            {
                break;
            }
        }
    }
    bool isEmpty()
    {
        if(count < 1)
        {
            cout<<"List is empty";
            return true;
        }
        else
        {
            cout<<"List is not empty";
            return false;
        }
    }
};

int main()
{
cout <<"Linked Lists demo"<<endl;


LinkedList collection;
collection.AddItem(1);
collection.AddItem(3);
collection.AddItem(5);
collection.AddItem(7);
collection.AddItem(9);
collection.AddItem(11);
collection.isEmpty();
collection.DisplayList();
cin.get();
类节点
{
公众:
int数据;
节点*下一步;
节点(int数据)
{
数据=数据;
next=NULL;
};
};
类链接列表
{
节点*第一;
节点*最后;
整数计数;
公众:
LinkedList()//LinkedList的构造函数
{
//初始化
第一个=空;
last=NULL;
计数=0;
};
无效附加项(整型数据)
{
节点*newItem=新节点(数据);
if(first==NULL)
{
第一个=新项目;
最后一个=新项目;
}
其他的
{
节点*遍历=第一;
while(遍历->下一步!=NULL)
{
遍历=遍历->下一步;
}
遍历->下一步=新建项;
最后=遍历->下一步;
}
计数++;
}
void DisplayList()
{
库特
或者重命名输入参数,使其具有不同的名称:

Node(int value)
{
    data = value;
    next = NULL;
};
此外,由于列表中有一个
最后一个
成员,因此可以大大简化
AddItem()
实现,根本不需要遍历列表(如果列表中有很多项,这将需要很长时间):


它正在打印垃圾值而不是地址,在您的AddItem方法中,您没有更新节点的数据。添加这一行它将起作用

newItem->data=data
你也可以使用

Node(int data)
{
  Node::data = data;
  next = NULL;
};

要初始化
数据
,它是
节点
类的成员变量。

您已经得到了一些答案,但它们似乎都给出了相同的(错误的)建议

您应该使用成员初始化列表,而不是将
data=data;
更改为类似
this->data=data;
的内容:

Node (int data) : data(data), next(nullptr) {}
就我个人而言,我可能会进一步修改,以允许为节点指定“下一个”元素:

Node(int data, Node *next=nullptr) : data(data), next(next) {}
在ctor的主体中,只有参数使用裸名称可见,因此
data=data;
只是将参数的值赋回自身。在成员初始值设定项列表中,编译器更聪明(可以说)并且“知道”which
data
就是which,因此即使它们具有相同的名称,这也会将参数
data
中的值分配给成员
data
(同样,也会分配给
next

顺便说一句:虽然一开始有一个空主体的ctor看起来有点奇怪,但是你应该习惯它。我猜我写的大多数ctor都有空主体


另一个(或多或少无关):我还将在
LinkedList
类中定义
节点
类(并可能将其设置为
私有
).LinkedList本身之外的任何东西都不需要了解
节点
类。

请尝试调试并设置断点,以便在运行时检查各种分配。您的成员变量名看起来像普通的变量名,因此您陷入了一个非常常见的陷阱。一个常见的惯例是在成员变量前面加上m_u,例如m_数据。用你的代码试试这个,然后检查节点的构造函数
,但它们似乎都给出了相同的结果(不好)建议
。没错。我很内疚。+1我选择了第一个响应作为答案,因为它解决了我的问题。但是,您的解决方案也同样有效,语法也更容易查看。谢谢。或者更好的做法是,遵循日益普遍的在成员前面加上“m_”前缀的做法,例如“m_data”(同样,s_代表静态,g_代表全局)@kfsone:这当然不算更好,据我所知,这主要是在MFC中很常见的,而且(谢天谢地)随着MFC的高级替代品的出现而逐渐消失。@JerryCoffin您想到的是匈牙利符号;成员变量前缀(或后缀)不是匈牙利符号(既不是应用程序也不是系统)。The[mgs]_前缀(如果有什么区别的话)很流行,尽管其他流行的替代方法,例如“mData”、“data”和“data”。如果没有这样的区别,您必须更有意识地对变量阴影进行编码,例如使用“this->member”随处可见或重命名函数参数名称。匈牙利语是关于给你现代IDE现在给你的信息;前缀基本上是一种名称空间形式。@kfsone:我一点也不考虑HN。MFC对成员使用
m*
,诸如此类,这很糟糕。前缀是一种疾病。如果你需要(甚至想要)一个<代码> My或 Gy跟踪成员变量或全局变量,这是一个相当可靠的指示,表明代码是混乱的。在C++的灰色区域中,通常很难避免一个不是某人“混乱”的解决方案。这里的问题源于C++允许的阴影;它允许
静态inti;静态线程\u局部inti;结构Foo{inti;Foo(inti):i(i){this->i=i;for(inti=0;ii;++i){}
。我曾经使用过一些非常复杂的系统,看到了一些非常复杂的问题的非常优雅的实现,并且不得不在新年的星期六凌晨4点修复它们,我将坚持编写QA返回的代码,这些代码中的特性/功能问题与语言引起的错误有关。
Node(int data)
{
  Node::data = data;
  next = NULL;
};
Node (int data) : data(data), next(nullptr) {}
Node(int data, Node *next=nullptr) : data(data), next(next) {}