У меня есть структура с 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));
}