C++ 什么';链表开头为零的原因是什么?C++; #包括 使用名称空间std; 结构节点{ int数据; 节点*下一步; }; void add(结构节点*head,int n){ Node*newNode=新节点; newNode->data=n; newNode->next=NULL; 节点*cur=头部; while(cur){ 如果(当前->下一步==NULL){ cur->next=newNode; 返回; } cur=cur->next; } } 无效显示(结构节点*头部){ 节点*列表=头; while(列表){ 下一步是收集数据; } cout
您的代码有几个问题:C++ 什么';链表开头为零的原因是什么?C++; #包括 使用名称空间std; 结构节点{ int数据; 节点*下一步; }; void add(结构节点*head,int n){ Node*newNode=新节点; newNode->data=n; newNode->next=NULL; 节点*cur=头部; while(cur){ 如果(当前->下一步==NULL){ cur->next=newNode; 返回; } cur=cur->next; } } 无效显示(结构节点*头部){ 节点*列表=头; while(列表){ 下一步是收集数据; } cout,c++,linked-list,output,nodes,C++,Linked List,Output,Nodes,您的代码有几个问题: 分配head节点时,您没有为其数据成员分配任何值,因此在您的情况下,它持有一个碰巧为0的随机值。并且您也没有初始化其下一个成员,这意味着添加()和显示()将无法正常工作 在add()中,如果head为NULL,则不会将任何节点添加到列表中(您不会将调用方的节点*变量更新为指向新节点),并且泄漏分配的新节点 从main()退出时,您正在泄漏所有分配的节点 请尝试以下方法: #include <iostream> using namespace std;
head
节点时,您没有为其数据
成员分配任何值,因此在您的情况下,它持有一个碰巧为0的随机值。并且您也没有初始化其下一个
成员,这意味着添加()
和显示()
将无法正常工作add()
中,如果head
为NULL,则不会将任何节点添加到列表中(您不会将调用方的节点*
变量更新为指向新节点),并且泄漏分配的新节点
main()
退出时,您正在泄漏所有分配的节点#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
void add(struct Node *head, int n) {
Node *newNode = new Node;
newNode->data = n;
newNode->next = NULL;
Node *cur = head;
while(cur) {
if(cur->next == NULL) {
cur->next = newNode;
return;
}
cur = cur->next;
}
}
void display(struct Node *head) {
Node *list = head;
while(list) {
cout << list->data << " ";
list = list->next;
}
cout << endl;
cout << endl;
}
int main()
{
struct Node *newHead;
struct Node *head = new Node;
int ar[]={2,5,46,7,55};
for(int i=0; i<5;i++){
add(head,ar[i]);
}
display(head);
}
在
main
中,分配Node
的未初始化实例,并将指针存储在head
中。您从不分配该节点的head->data
,因此该值是不确定的。对于head->next
,同样适用。当在add
和display
中读取这些值时程序未定义
我怎样才能修好它 首先,在
main
中初始化head
,以避免未定义的行为:
#include <iostream>
#include <list>
void display(const std::list<int> &mylist) {
for(std::list<int>::const_iterator iter = mylist.begin(); iter != mylist.end(); ++iter) {
std::cout << *iter << " ";
}
std::cout << std::endl;
std::cout << std::endl;
}
int main()
{
std::list<int> mylist;
int ar[] = {2, 5, 46, 7, 55};
for(int i = 0; i < 5; ++i){
mylist.push_back(ar[i]);
}
/* or:
int ar[] = {2, 5, 46, 7, 55};
std::list<int> mylist(ar, ar+5);
*/
display(mylist);
return 0;
}
然后你可以做以下一件事:
a) 使用display(head->next);
而不是display(head);
b) 将头
初始化为所需的第一个值
Node *head = new Node();
// ^^ these are important
head->data=ar[0];
对于(int i=1;i<代码>头<代码>也有一个单位化值。在将<代码>结构> <代码>命名为C++类型时,不需要指定<代码>结构>代码>。你的老师似乎被困在了90年代。你应该用一本好的C++书来补充这门课。噢,对头脑来说,另一个间接的水平是不是更容易让它通过引用?@ SCOHE01:当使用函数参数时,引用仍然是间接的。大多数编译器实现引用。不管怎样,我还是使用了指针。但是不管怎样,我更新了我的示例。
Node *head = new Node();
// ^^ these are important
head->data = ar[0];
for(int i=1; i<5;i++)
// ...