链表的开头是什么原因是什么? C ++

问题描述 投票:0回答:2
#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

链表的开头是零的原因是什么?我该如何解决?我不想打印零。

如果您在我的代码中看到一些错误,请告诉我。我是编码的新手。

c++ linked-list output nodes
2个回答
1
投票

main中,您分配一个未初始化的Node实例并将指针存储在head中。您永远不会分配该节点的head->data,因此该值是不确定的。同样适用于head->next。当在adddisplay中读取这些值时,程序的行为是不确定的。


我该如何解决?

首先,在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,不要求用户单独分配第一个节点。在雷米的回答中有关于此的更多细节。


0
投票

您的代码有几个问题:

  1. 当您分配head节点时,您没有为其data成员分配任何值,因此它包含一个在您的情况下恰好为0的随机值。你也没有初始化它的next成员,这意味着add()display()将无法正常工作。
  2. add()中,如果head为NULL,则没有节点添加到列表中(您不更新调用者的Node*变量以指向新节点),并且泄漏分配的newNode
  3. 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.