我知道这对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);
}
答案 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