относительно:
int dequeueLast(QUEUE *q)
{
int data;
int savedData;
QUEUE *tmpQ = (QUEUE*)calloc(1, sizeof(QUEUE));
initQueue(tmpQ);
while ((q->head) != (q->tail))
{
data = dequeue(q);
enqueue(tmpQ, data);
}
savedData = q->tail->data;
FREE(q);
while (!empty(*tmpQ))
enqueue(q, dequeue(tmpQ));
FREE(tmpQ);
free(tmpQ);
return savedData;
}
Большая часть этой функции не выполняет то, что вам нужно.
И возвращаемое значение присваивается локальной переменной в main()
, но не используется.
Предложить:
void dequeueLast(QUEUE *q)
{
NODE *current == q->head;
NODE *previous = q->tail;
while( current->next )
{
previous = current;
current = current->next;
}
if( previous )
{
previous->next = NULL;
free( current );
q->tail = previous;
}
}
Существует несколько причин для предлагаемых изменений, включая удаление всех ненужных очередей и снятие очереди каждого из существующих узлов в очереди и тот факт, чтозначение данных в последнем узле в очереди фактически не используется.
также, с небольшим переупорядочением порядка функций, все прототипы могут быть удалены
также, в функции: PrintfQueue()
НЕ создавайте полностью новую очередь, просто пройдите по очереди, как:
void PrintQueue(QUEUE *q)
{
NODE *current = q->head;
while ( current->next )
{
printf(" %d ", current->data);
current = current->next;
}
}
, и все вызовы PrintQueue()
должны быть:
PrintQueue( queue );
, поскольку queue
уже является указателем, и гораздо лучше передать указатель на структуру, а не полную структуру
OT: относительно:
scanf_s("%d", &num);
, когдавызов любого из семейства функций scanf()
,всегда проверяйте возвращаемое значение (а не значения параметров), чтобы убедиться, что операция прошла успешно, IE
if( scanf_s("%d", &num) != 1 )
{
fprintf( stderr, "scanf_s to input a number failed" );
}
В опубликованном коде есть еще много проблем, но вышеприведенное должно направить вас в правильном направлении