SIGSEV в односвязном списке - PullRequest
2 голосов
/ 01 апреля 2020

Я пишу код для поворота односвязного списка против часовой стрелки на число K узлов. Я написал следующий код. Например, для связанного списка ввода: 1,2,3,4,5,6,7,8 функция поворота Node *rotate(Node *head, int k){} возвращает указатель заголовка на связанный список 5,6,7,8,1,2,3,4. Я написал следующий код. В этом коде, если я вызываю print(head) внутри функции поворота, то это дает правильный вывод, но как только он возвращает указатель головы на main, он либо выдает SIGSEV, либо выдает 1,2,3,4.

#include <iostream>
using namespace std;
class List {
public:
    int data;
    List *next;
    explicit List(int element) : data(element), next(nullptr){}
};

List *insert() {
    int n, i, value;
    List *temp = nullptr, *head = nullptr;
    cin >> n;
    for(i = 0; i < n; ++i) {
        cin >> value;
        if(i == 0) {
            head = new List(value);
            temp = head;
            continue;
        } else {
            temp ->next = new List(value);
            temp = temp->next;
        }
    }
    return head;
}
void print(List *start) {
    while(start != nullptr) {
        cout << start ->data << " ";
        start = start->next;
    }
}

List* rotate(List* head, int k) {
    List *traverse = head, *temp = head;
    List *kth, *end;
    int i = 0;
    while(i < k - 1) {
        traverse = traverse ->next;
        ++i;
    }
    kth = traverse;
    while(traverse->next != nullptr) {
        traverse = traverse->next;
    }
    end = traverse;
    head = kth->next;
    kth->next = nullptr;
    end->next = temp;
    print(head);
    return head;
}

int main() {
    int k;
    List *head = insert();
    cin >> k;
    print(head);
    cout << endl;
    rotate(head, k);
    print(head);
    return 0;
}

PS: мне разрешено изменять только функцию поворота.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...