链接列表中的头节点

时间:2016-04-07 08:36:24

标签: c++ data-structures

以下天真代码实现了一个链表,而不打印main函数中的所有元素,一切都会好的。但是,LinkedList::printll函数将触发设置错误(Gcc 5.3.0),问题与我认为的头节点的适当处理有关...

那么,有没有办法让这段代码能够最少修改printll函数?

#include <iostream>

using namespace std;

struct Node{
  int value;
  Node* next;
};

struct LinkedList{
  Node* head= NULL ; 
  void append(int);
  void printll();
};

void LinkedList::append(int data){
  Node* cur = head;
  Node* tmp = new Node;
  tmp->value = data;
  tmp->next = NULL;

    if(!cur){
        cur = tmp;                       // cur-> head
    }
    else{
       while(cur->next != NULL){
       cur = cur->next;
       }
       cur->next = tmp;
    }
    std::cout<<cur->value<<std::endl;    // cur-> temp
  delete tmp;                            // comment out
}

void LinkedList::printll(){ 
     Node* cur = head;
        while(cur->next != NULL){        //
        std::cout<<cur->value<<std::endl;
        cur = cur->next;
        }
}


int main(){
  LinkedList LL;
  LL.append(5);
  LL.append(6);
  LL.append(7);
  LL.printll();  // --without this, the program is fine
  return 0;
} 

2 个答案:

答案 0 :(得分:3)

append中有一些错误:

if(!cur){
    cur = tmp;
}

这仅分配给本地副本。我假设你在这里设置head,所以这样做:head = tmp;。请注意,在这种情况下,您无法打印cur,因为您尚未设置它。您可以打印tmp->value

然后:

delete tmp;

您刚刚创建并将其分配到位 - 为什么要删除它?你知道仍然有一个指向它的指针。当你完成清单时,只有delete来清理清单(你现在根本不做清理)。

除此之外,您的printll不会打印最后一个元素 - 考虑它什么时候停止:

A -> B -> C -> NULL

它将在节点C上停止,但永远不会打印C的值。你可以直接替换:

while(cur->next != NULL){

while(cur != nullptr){

(另外,我不喜欢endl)。

See here for these changes running

#include <iostream>

struct Node{
    int value;
    Node* next;
};

struct LinkedList{
    Node* head = nullptr ; 
    void append(int);
    void printll();
};

void LinkedList::append(int data){
    Node* cur = head;
    Node* tmp = new Node;
    tmp->value = data;
    tmp->next = nullptr;

    if(!cur){
        head = tmp;
    }
    else{
        while(cur->next != nullptr){
            cur = cur->next;
        }
        cur->next = tmp;
    }
}

void LinkedList::printll(){ 
    Node* cur = head;
    while(cur != nullptr){
        std::cout << cur->value << '\n';
        cur = cur->next;
    }
}


int main(){
    LinkedList LL;
    LL.append(5);
    LL.append(6);
    LL.append(7);
    LL.printll();
}

答案 1 :(得分:0)

1.你不能

delete tmp;

因为tmp是一个指针,当你运行delete tmp时,你删除了该对象。

2.打印功能应该是这样的:

void LinkedList::printll(){
     Node* cur = head;
        while(cur->next != NULL){        // -> problems is here
        std::cout<<cur->value<<std::endl;
        cur = cur->next;
        }
        std::cout<<cur->value<<std::endl;
}