C++ 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
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;
只是将参数的值赋回自身。在成员初始值设定项列表中,编译器更聪明(可以说)并且“知道”whichdata
就是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) {}