#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);
}
OUTPUT:
0 2 5 46 7 55
链表的开头是零的原因是什么?我该如何解决?我不想打印零。
如果您在我的代码中看到一些错误,请告诉我。我是编码的新手。
在main
中,您分配一个未初始化的Node
实例并将指针存储在head
中。您永远不会分配该节点的head->data
,因此该值是不确定的。同样适用于head->next
。当在add
和display
中读取这些值时,程序的行为是不确定的。
我该如何解决?
首先,在head
中初始化main
以避免未定义的行为:
Node *head = new Node();
// ^^ these are important
然后你可以做以下事情之一:
a)使用display(head->next);
而不是display(head);
跳过第一个节点
b)将head
初始化为您想要的第一个值
head->data = ar[0];
for(int i=1; i<5;i++)
// ...
c)重新设计API,不要求用户单独分配第一个节点。在雷米的回答中有关于此的更多细节。
您的代码有几个问题:
head
节点时,您没有为其data
成员分配任何值,因此它包含一个在您的情况下恰好为0的随机值。你也没有初始化它的next
成员,这意味着add()
和display()
将无法正常工作。add()
中,如果head
为NULL,则没有节点添加到列表中(您不更新调用者的Node*
变量以指向新节点),并且泄漏分配的newNode
。main()
退出时,您正在泄漏所有已分配的节点。试试这个:
#include <iostream>
struct Node {
int data;
Node* next;
Node(int value) : data(value), next(0) {}
};
void add(Node* &head, int n) {
Node **newNode = &head;
while (*newNode) {
newNode = &((*newNode)->next);
}
*newNode = new Node(n);
}
void display(Node *head) {
Node *cur = head;
while (cur) {
std::cout << cur->data << " ";
cur = cur->next;
}
std::cout << std::endl;
std::cout << std::endl;
}
void clear(Node* &head) {
Node *cur = head;
head = NULL;
while (cur) {
Node *next = cur->next;
delete cur;
cur = next;
}
}
int main()
{
Node *head = NULL;
int ar[] = {2, 5, 46, 7, 55};
for(int i = 0; i < 5; ++i){
add(head, ar[i]);
}
display(head);
clear(head);
return 0;
}
然后,当你开始工作时,把它扔掉,然后使用STL的std::list
容器代替:
#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;
}