Я вижу несколько проблем с вашим кодом ...
Сначала вы не проверяете, что ваш аргумент queue
не NULL
.Тогда вы не включили определение empty()
, но, вероятно, тестирование того, что queue-> head равно NULL, должно сказать, что список пуст.Здесь вы разыменовываете его перед тестированием, это действительный указатель, очень опасный.
Во-вторых, вы неверно используете некоторые данные, которые не используются должным образом.Когда вы делаете привязку data = (queue->head)->next;
, вы теряете указатель на выделенную память, вы, вероятно, захотите сделать strncpy()
здесь, например, strncpy(data, queue->head->data, strMax)
.После этого вы можете раскомментировать свой free()
.Функция, вызывающая вашу очередь один, должна будет free()
эту строку позже, когда она больше не используется.Почему бы не выделить свой data
только тогда, когда вы уверены, что список не пуст?Если вы не хотите этого делать, вам нужно free()
, чтобы эта память не была заменена.
См. Код ниже.
queueNode* find_before_tail(stringQueue* queue)
{
queueNode* node = NULL;
if (!queue || !queue->head)
return NULL;
node = queue->head;
while (node->next != queue->tail && node->next)
node = node->next;
return node;
}
char * dequeue(stringQueue *queue) {
char *data = NULL;
queueNode* to_queue = NULL;
if(!queue || !queue->head) {
/* Nothing to dequeue here... */
return NULL;
}
data = malloc(strMax * sizeof(char));
if (!data) {
printf("Error with malloc()...\n");
return NULL;
}
/* Only one element */
if(!(queue->head)->next == queue->head) {
strncpy(data, queue->head->data, strMax);
free(queue->head);
queue->head = NULL;
queue->tail = NULL;
}
else {
strncpy(data, queue->tail->data, strMax);
to_dequeue = queue->tail;
queue->head = queue->head->next;
queue->tail = find_before_tail(queue);
if (!queue->tail)
return NULL;
queue->tail->next = NULL;
free(to_dequeue);
}
data[strMax - 1] = 0;
return data;
}
Возможно, есть некоторые другие проблемы состальная часть вашего кода, судя по этому, но, надеюсь, это даст вам некоторую основу.
РЕДАКТИРОВАТЬ С ВАШИМ КОДОМ ОЧЕРЕДИ
Здесь вы опять не проверяете возвращаемое значениеmalloc()
.Вот версия с нециклическим связанным списком (я также обновил функцию dequeue()
выше для работы с этим).
int enqueue(stringQueue *queue, char *item)
{
queueNode * newNode = NULL;
if (!queue || !item)
return EINVAL;
newNode = malloc(sizeof(queueNode));
if (!newNode) {
perror("malloc()");
return errno;
}
strncpy(newNode->data, item, strMax);
newNode->data[strMax - 1] = 0;
if (!queue->head) {
/* Element is queue and tail */
queue->tail = newNode;
}
newNode->next = queue->head;
queue->head = newNode;
return 0; /* Everything was fine */
}
Я не тестировал код, но он должен быть очень похожк этому.В этом сценарии, когда у вас есть только один элемент, this_element->next
равен NULL
и не указывает на себя.