Согласованная ошибка сегментации при рекурсивном добавлении и создании нового узла в связанном списке C - PullRequest
0 голосов
/ 07 мая 2020

У меня есть структура с 2 полями (int и char*), и я должен создать список, содержащий узлы этого типа, проблема в том, что рекурсивные алгоритмы кажутся правильными, но каждый раз, когда я компилирую, он дает мне ошибку SIGSEGV из-за присваивания new_node-> data-> number = stud-> number, в частности, это приводит к data = {struct fields * | 0x0} NULL и next = {struct node * | 0x0} NULL. Любая помощь?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct fields{
    int number;
    char *name;
};

struct Node {
    struct fields *data;
    struct Node* next;
};

struct Node *newNode(struct fields* data);
struct Node* insertEnd(struct Node* head, struct fields* data);
struct Node* insertEnd(struct Node* head, struct fields* data);
void traverse(struct Node* head);
void init_fields (struct fields* stud);

// Allocates a new node with given data
struct Node *newNode(struct fields* data) {
    struct Node *new_node = malloc (1000*sizeof(*new_node));
    new_node->data->number = data->number;
    new_node->data->name = data->name;
    new_node->next = NULL;
    return new_node;
}

struct Node* insertEnd(struct Node* head, struct fields* data){

    if (head == NULL)
        return newNode(data);

    else
        head->next = insertEnd(head->next, data);
    return head;
}

void traverse(struct Node* head){
    if (head == NULL)
        return;

    printf("\n%d %s\n", head->data->number, head->data->name);
    traverse(head->next);
}

int main(){
    struct Node* head = NULL;
    struct fields* stud = malloc(1000* sizeof(*stud));
    init_fields (stud);
    if (stud == NULL){
        exit(EXIT_FAILURE);
    }

    printf("\nInsert number: ");
    scanf("%d", &stud->number);
    fflush(stdin);
    printf("\nInsert name: \n");
    scanf(" %[^\n]s", stud->name);
    head = insertEnd(head, stud);
    printf("\nInsert number: ");
    scanf("%d", &stud->number);
    fflush(stdin);
    printf("\nInsert name: \n");
    scanf(" %[^\n]s", stud->name);
    head = insertEnd(head, stud);
    traverse(head);
}
void init_fields (struct fields* stud){
    stud->number = 0;
    stud->name = malloc(50*sizeof(char));
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Здесь:

struct Node *new_node = malloc (1000*sizeof(*new_node));

вы выделяете память только для new_node. А как насчет этого поля?

struct fields *data;

Его нужно как-то инициализировать.

0 голосов
/ 07 мая 2020

Вам необходимо выделить data

struct Node *newNode(struct fields* data) {
    struct Node *new_node = malloc (1000*sizeof(*new_node));
    new_node->data = malloc(sizeof(*new_node->data));
    new_node->data->number = data->number;
    new_node->data->name = data->name;
    new_node->next = NULL;
    return new_node;
}

В будущем вы сможете узнать, где именно возникла проблема, используя gdb или lldb. Он укажет вам на точную линию, и проблема станет очевидной оттуда.

...