Это мой main.c:
int main()
{
Queue* list = initialize();
if (!isEmpty(list))
{
fprintf(stderr, "Error!\n");
}
enqueue(list, 10);
enqueue(list, 20);
display(list); // Output: 10 -> 20 -> nil
if (front(list) != 10)
{
fprintf(stderr, "Error!\n");
}
if (back(list) != 20)
{
fprintf(stderr, "Error!\n");
}
enqueue(list, 30);
display(list); // Output: 10 -> 20 -> 30 -> nil
int len = length(list);
if (len == 3)
{
fprintf(stdout, "Number of elements in Queue: %d.\n", len);
}
else
{
fprintf(stderr, "Error!\n");
}
dequeue(list);
display(list); // Output: 20 -> 30 -> nil
if (front(list) != 20)
{
fprintf(stderr, "Error!\n");
}
if (back(list) != 30)
{
fprintf(stderr, "Error!\n");
}
len = length(list);
if (len == 2)
{
fprintf(stdout, "Number of elements in Queue: %d.\n", len);
}
else
{
fprintf(stderr, "Error!\n");
}
empty(list);
display(list); // Output: Queue is empty.
free(list);
return 0;
}
Это моя очередь.c:
Queue* initialize()
{
Queue* q = (Queue*)malloc(sizeof(Queue));
q->front = q->back = NULL;
return q;
}
struct Node* newNode(int item)
{
Node* temp = (Node*)malloc(sizeof(Node));
if (temp != NULL)
{
temp->value = item;
temp->next = NULL;
return temp;
}
}
int enqueue(Queue* q, int item)
{
Node *temp = newNode(item);
temp->value = item;
if (q->front == NULL)
q->front = temp;
else
q->back->next = temp;
q->back = temp;
q->back->next = q->front;
return item;
}
int dequeue(Queue *q)
{
Node *temp = q->front;
printf("\nRemoving %d", temp->value);
q->front = q->front->next;
if (q->front == NULL)
q->back = NULL;
int item = temp->value;
free(temp);
return item;
}
Queue* display(Queue *q)
{
Node *temp;
temp=q->front;
if (temp==NULL)
printf("\n The queue is empty");
else
{
printf("\n");
while(temp != q->back)
{
printf("%d -> ",temp->value);
temp=temp->next;
}
printf("%d -> nil",temp->value);
}
return q;
}
int front(Queue *q)
{
if ((q->front != NULL) && (q->back != NULL))
return (q->front->value);
else
return -1;
}
int back(Queue *q)
{
if ((q->front != NULL) && (q->back != NULL))
return (q->back->value);
else
return -1;
}
bool isEmpty(Queue *q)
{
if ((q->front == NULL) || (q->back == NULL))
return -1;
else
return 0;
}
void empty(Queue *q)
{
q->front = NULL;
q->back = NULL;
}
int length(Queue *q)
{
int count=0;
if (q->front!=NULL){
Node *temp = q->front;
while(temp->next != NULL)
{
count++;
temp = temp -> next;
}
}
return count;
}
Вывод должен выглядеть так:
10 -> 20 -> nil 10 -> 20 -> 30 -> nil Number of elements in Queue: 3. 20 -> 30 -> nil Number of elements in Queue: 2. Queue is empty.
Мой вывод:
10 -> 20 -> nil 10 -> 20 -> 30 -> nil
И здесь он продолжает работать вечно, пока я не завершу его вручную. Я понятия не имею, почему, может кто-нибудь помочь с этим, пожалуйста? Моя функция длины может быть неправильной, но я не знаю, является ли это причиной ошибки и как ее исправить. Кроме того, main.c исправлен, я ничего не могу в нем изменить. Спасибо, что помогаете и читаете все это.
Сейчас самое подходящее время научиться использовать отладчик для пошагового выполнения кода, оператор за оператором, при этом отслеживая переменные и их значения.
У вас круговая очередь. В какой момент вы подумали, что while(temp->next != NULL)
когда-либо будет ложным?
Когда вы enqueue
, вы создаете круговой список с этим утверждением
q->back->next = q->front;
Вам не нужно устанавливать q->back->next
, это должно быть и уже есть null
, потому что newNode()
устанавливает его в `null'.
Поскольку
print()
работает, аlength()
нет, в чем разница между обходом списка в этих двух функциях? Пожалуйста, проверьте свой код, чтобы увидеть, где ошибка.