Итак, я пытался реализовать структуру данных очереди в C, но я продолжаю получать эту ошибку: ошибка сегментации (сбрасывание ядра). Я думаю, что это исходит из моего метода в очереди. Может кто-то помочь мне решить эту проблему ...Почему я получаю ошибку сегментации (ядро сбрасывается) в моей очереди C?
Это мой queue.c файл
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
void createQueue(LinkedList* list)
{
list = (LinkedList*)calloc(1, sizeof(LinkedList));
}
int isEmpty(LinkedList* list)
{
int empty = 0;
if(list->head == NULL)
{
empty = 1;
}
return empty;
}
void enqueue(LinkedList* list, Person p)
{
LinkedListNode* newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode));
newNode->data = p;
if (isEmpty(list))
{
list->head = list->tail = newNode;
} else
{
LinkedListNode* first = list->head;
first->previous = newNode;
newNode->next = list->head;
list->head = newNode;
}
list->count ++;
}
Person dequeue(LinkedList* list)
{
LinkedListNode* temp;
temp = list->tail;
list->tail = list->tail->previous;
list->count --;
return temp->data;
}
void viewQueue(LinkedList* list)
{
LinkedListNode* current;
current = list->head;
while (current != NULL)
{
printf("Name: %s Birthdate: %s\n", current->data.name, current->data.birthdate);
current = current->next;
}
printf("\nPeople: %d\n", list->count);
}
И это мой файл заголовка ...
#ifndef LINKED_LIST
#define LINKED_LIST
#define FALSE 0
#define TRUE !FALSE
typedef struct{
char name[20];
char birthdate[10];
} Person;
typedef struct LinkedListNode{
Person data;
struct LinkedListNode* next;
struct LinkedListNode* previous;
} LinkedListNode;
typedef struct{
LinkedListNode* head;
LinkedListNode* tail;
int count;
} LinkedList;
void createQueue(LinkedList* list);
int isEmpty(LinkedList* list);
void enqueue(LinkedList* list, Person p);
Person dequeue(LinkedList* list);
void viewQueue(LinkedList* list);
#endif
У меня также есть этот метод, чтобы проверить моя очередь. Когда я запускаю его, я получаю ошибку сегментации. Что не так с моей программой?
#include <stdio.h>
#include "queue.h"
int main(void)
{
LinkedList* list;
createQueue(list);
Person p1 = {"J Cole", "28/01/1985"};
Person p2 = {"Kendrick Lamar", "19/01/1994"};
Person p3 = {"Slim Shady", "17/10/1972"};
Person p4 = {"Tupac Shakur", "12/09/1971"};
enqueue(list, p1);
enqueue(list, p2);
enqueue(list, p3);
enqueue(list, p4);
viewQueue(list);
return 0;
}
«Я думаю, что это исходит из моего метода в очереди». Разве ваша отладка не говорит вам точно? Отладчик сделает это за несколько секунд. – kaylum
опубликованный код не компилируется. При компиляции всегда включайте все предупреждения, затем устанавливайте эти предупреждения. Эти два предупреждения особенно важны: 1) параметр «список» установлен, но не используется [-Wunused-but set-parameter] в функции 'createQueue()' 2) предупреждающий «список» используется неинициализированным в этой функции [-Униминиаризованный] в функции: 'main()' Таким образом, опубликованный код не выполняет чисто компиляцию (и это серьезные предупреждения). Примечание: при желании изменить, где указатель указывает, из вызываемой функции, указатель должен быть передан как '' createQueue (& list) 'и эта функция должна быть слишком изменена – user3629249
при вызове любой из функций выделения памяти« кучи »(malloc, calloc, realloc). 1) не выдавать возвращаемое значение, оно имеет тип:' void * ', поэтому может быть присвоено значение любой другой указатель 2) Всегда проверяйте (! = NULL) возвращаемое значение, чтобы гарантировать успешную операцию. – user3629249