2016-09-30 2 views
1

Итак, я пытался реализовать структуру данных очереди в 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; 
} 
+1

«Я думаю, что это исходит из моего метода в очереди». Разве ваша отладка не говорит вам точно? Отладчик сделает это за несколько секунд. – kaylum

+0

опубликованный код не компилируется. При компиляции всегда включайте все предупреждения, затем устанавливайте эти предупреждения. Эти два предупреждения особенно важны: 1) параметр «список» установлен, но не используется [-Wunused-but set-parameter] в функции 'createQueue()' 2) предупреждающий «список» используется неинициализированным в этой функции [-Униминиаризованный] в функции: 'main()' Таким образом, опубликованный код не выполняет чисто компиляцию (и это серьезные предупреждения). Примечание: при желании изменить, где указатель указывает, из вызываемой функции, указатель должен быть передан как '' createQueue (& list) 'и эта функция должна быть слишком изменена – user3629249

+0

при вызове любой из функций выделения памяти« кучи »(malloc, calloc, realloc). 1) не выдавать возвращаемое значение, оно имеет тип:' void * ', поэтому может быть присвоено значение любой другой указатель 2) Всегда проверяйте (! = NULL) возвращаемое значение, чтобы гарантировать успешную операцию. – user3629249

ответ

2

При передаче значения (например, указатель) на подпрограмму, для того, чтобы рутина к установить это значение, вы должны передать его адрес. Таким образом, эта линия:

createQueue(list); 

должно быть:

createQueue(&list); 

, если вы хотите, чтобы createQueue установить значение переменной. Вам также необходимо:

void createQueue(LinkedList** list) 
{ 
    *list = (LinkedList*) calloc(1, sizeof(LinkedList)); 
} 

Не волнуйтесь - каждый программист C совершает эту ошибку в какой-то момент. Для получения дополнительной информации найдите «Передать по значению или ссылке» и «c указатель на указатель».

2

Передано значение Указателя. Вам нужно передать ссылку.

void createQueue(LinkedList** list) 
{ 
    *list = (LinkedList*)calloc(1, sizeof(LinkedList)); 
} 

И от главного

createQueue(&list); 
+1

Работал как шарм! Очень признателен... –