ошибка сегментации 11 связанный список

Мой класс выполняет симуляцию проблемы Иосифа, реализуя круговой односвязный список. Мой код компилируется, но когда он запускается, я получаю ошибку сегментации: 11 после того, как список был построен. Моя отладка до сих пор привела меня к пониманию того, что ошибка возникает, когда программа входит в последний цикл while основной функции. Я думаю, что это как-то связано с тем, как я использую первый-> следующий, но я не уверен. Любая помощь будет потрясающей, спасибо. Я пишу на C ++, если это не было очевидно.

#include <iostream>
#include <string>
using namespace std;/*
* Node structure used by the linked list.
*/
struct Node {
// The name stored in this node.
string name;

// A pointer to the next node in the list.
Node * next;
};

/*
* Build the linked list
*/

class LinkedList {
private:
//pointer to the head of the list
Node *head;

public:
// constructor for LinkedList
LinkedList(){
head = NULL;
}

/*
* Add the given value to the list, making it the head.
*/
void insert(string name){// Remember where old head was
Node *oldHead = head;

// allocate a new node in memory
head = new Node;

// set new node's fields
head->name = name;
head->next = oldHead;
}

/*
* Remove the item on the top of the stack, returning nothing.
*/
void remove() {
// Remember what the new head will be
Node* newSecond = head->next->next;

// Deallocate the head from memory
delete head->next;
// Set the head to the new head
head->next = newSecond;
}
/*
* Shifts the head forward one node.
*/
void cycle(){

head = head->next;
}

Node* getHead(){
return head;
}

// This is the opposite of a constructor - a destructor! You (almost)
// never need these in Java, but in C++ they are essential because
// you have to clean up memory by yourself. In particular, we need to
// empty out the stack.
~LinkedList() {
// While there's a head node still left, remove the head node.
while (head != NULL) {
remove();
}
}
};int main(){
//create the circular linked list
LinkedList circle;

int people;
cin >> people;
string soldier;
Node* first = circle.getHead();

//Insert all the names
for(int i = 0; i < people; i++){
cin >> soldier;
circle.insert(soldier);
}

//begin the killing
while(first->next != NULL){
circle.cycle();
cout << " killed " << endl;
Node* temp = first->next->next;
circle.remove();
first->next = temp;
}
}

2

Решение

Несколько проблем в этом коде. Во-первых, это:

Node* newSecond = head->next->next;

Если head->next NULL, тогда вы получите разыменование указателя NULL. Что приводит к краху.

Однако действительная причина этого конкретного сбоя заключается в следующем:

while(first->next != NULL)

является разыменованием нулевого указателя. В начале main() у тебя есть:

Node* first = circle.getHead();

circle пуст в этот момент, так first назначается NULL. И он остается пустым до того момента, когда вы разыменовываете его в своем while заявление. Таким образом, вы получите крах.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]