当我试图通过我的函数打印我的列表时,分段错误

时间:2013-04-24 04:28:10

标签: c++ linked-list

我知道这对c ++程序员来说可能是微不足道的,但我是一个努力解决这个问题的noobie。在我的主要内容中,如果我手动打印我的短列表(cout<< head->值等),它可以工作,但是当我使用我的打印功能时,我会遇到分段错误。我一直在尝试使用调试器,但是我对unix / c ++不是很擅长,而且我试图解决这个问题时感到很沮丧。

#include <iostream>
using namespace std;

class ListNode
{
    public:
    int value;
    ListNode* next;
};

void insertAtHead(ListNode** head, int value)
{
    ListNode *newNode = new ListNode;
    newNode->value = value;
    if(head == NULL)
    {
        *head = newNode;
        newNode->next = NULL;
    }
    else
    {
        newNode->next = *head;
        *head = newNode;
    }
}

void printList(ListNode* head)
{
    while(head != NULL)
    {
        cout << head->value << "->";
        head = head->next;
    }
}
//inserts after the node with given value
void insertAfterNode(ListNode** head,ListNode** newNode, int value)
{
    ListNode* current = *head;
    while(current != NULL && (current->value != value)) 
    {
            //cout << "Im Here";
            current = current->next;
            cout << current->value;
    }
    (*newNode)->next = current->next;
    current->next = *newNode;
}

int main()
{
    ListNode *head;
    insertAtHead(&head, 5);
    insertAtHead(&head, 10);
    ListNode* newNode = new ListNode;
    newNode->value = 8;
    newNode->next = NULL;
    insertAfterNode(&head,&newNode, 5);
printList(head);
}

3 个答案:

答案 0 :(得分:2)

检查功能中的此修改

void insertAtHead(ListNode** head, int value)
{
    ListNode *newNode = new ListNode;
    newNode->value = value;

    newNode->next = *head;
    *head = newNode;
}

void printList(const ListNode* head)
{
    while(head != NULL)
    {
        cout << head->value << "->";
        head = head->next;
    }
}

insertAtHead中,您正在使用双指针,因此比较应该是这样的。

在访问之前添加了检查*head是否为空的检查。如果null将新节点添加为head

void insertAfterNode(ListNode** head,ListNode** newNode, int value)
{
    ListNode* current = *head;
    if (current  != NULL)
    {
       while(current != NULL && (current->value != value)) 
       {
            //cout << "Im Here";
            current = current->next;
            cout << current->value;
       }
       (*newNode)->next = current->next;
       current->next = *newNode;
    }
    else
    {
      *head = *newNode;
    }
}

在使用前的主要初始信息head

int main()
{
    ListNode *head = NULL;
    insertAtHead(&head, 5);
    printList(head); // <== note: by-value, not by address or reference.

答案 1 :(得分:0)

您需要检查您尝试访问的下一个值是否为空,如下所示:

  void printList(ListNode* head)
    {
        if (head != NULL)
        {
            while(head->next != NULL)
            {
                cout << head->value << "->";
                head = head->next;
            }
        }
    }

答案 2 :(得分:0)

老兄,第一个答案是正确的

但我想再做一次修正

在节点

之后的函数插入中的while循环中

current!=NULL不正确,因为当且仅当列表中的最后一个节点与5的值匹配时,您的条件才为真

条件应该只是while(current->value!=value)

这样您就会到达值为5

的节点