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

时间:2017-12-21 21:02:59

标签: c++ linked-list output nodes

cmake_minimum_required( VERSION 3.8 )

set( CMAKE_C_FLAGS_DEBUG "" CACHE STRING "" )       
set( CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "" )
set( CMAKE_C_FLAGS_RELEASE "" CACHE STRING "" )
set( CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "" )

project(hello)

set( SOURCE_FILES
    hello.c foo.c )

add_executable( hello
    ${SOURCE_FILES} )


set_source_files_properties( foo.c 
    PROPERTIES
    COMPILE_FLAGS "-O3 -DNDEBUG" )

set_source_files_properties( hello.c 
    PROPERTIES
    COMPILE_FLAGS -O0 )

输出:

  

0 2 5 46 7 55

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

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

2 个答案:

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

答案 1 :(得分:0)

您的代码存在一些问题:

  1. 分配head节点时,您没有为其data成员分配任何值,因此它保存发生的随机值为0在你的情况下。您也没有初始化其next成员,这意味着add()display()将无法正常运作。

  2. add()
  3. ,如果head为空,则不会向列表中添加任何节点(您不必将调用者的Node*变量更新为指向新节点),并泄漏分配的newNode

  4. 退出main()时,您正在泄漏所有已分配的节点。

  5. 请改为尝试:

    #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;
    }