Очередь в C действует странно после ввода всех элементов

Я определяю свою очередь так:

struct Node
 {
 int Data;
 struct Node* next;
 }*rear, *front;

int pop()
{
 struct Node *temp, *var=rear;
 int data = var->Data;
 if(var==rear)
 {
 rear = rear->next;
 free(var);
 }
 else{
 printf("\nQueue Empty");
 }
 return data;
}

void push(int value)
{
 struct Node *temp;
 temp=(struct Node *)malloc(sizeof(struct Node));
 temp->Data=value;
 if (front == NULL)
 {
 front=temp;
 front->next=NULL;
 rear=front;
 }
 else
 {
 front->next=temp;
 front=temp;
 front->next=NULL;
 }
}

Когда я выхожу из последнего элемента в очереди, я не могу нажать больше элементов.

Результаты:

1. Push to Queue
2. Pop from Queue
3. Display Data of Queue
4. Exit

5. Empty Choose Option: 1

Enter a ******** to push into Queue: 10
Calling push with 10, temp at 8061420. push done: front = 8061420, rear = 8061420
Elements are as: 10

Choose Option: 1

Enter a ******** to push into Queue: 20
Calling push with 20, temp at 8061430. push done: front = 8061420, rear = 8061430
Elements are as: 20

Choose Option: 2
Elements are as: 20

Choose Option:
1 ответ

Начиная с самого начала, если вы не устанавливаете front и rear где-то в NULL, то ничто из этого не работает правильно.

Затем давайте посмотрим на push():

Когда список пуст, вы устанавливаете front и rear равную temp. Это хорошо. Когда есть front вы устанавливаете front->next= temp ; Это не хорошо, если вы уже добавили что-то еще в список. Идея должна состоять в том, чтобы использовать rear чтобы всегда указывать на последнюю добавленную в списке и всегда добавлять в конец rear.

Итак, вы должны сделать:

void push(int value)
{
 struct Node * temp= (struct Node *) malloc( sizeof( struct Node)) ;
 temp-> Data= value ;
 temp-> next= NULL ;
 fprintf(stderr, "Calling push with %d, temp at %lx.\n", value, temp) ;

 if ( rear) { rear-> next= temp ; rear= temp ; }
 else { front= rear= temp ; }

 fprintf(stderr, "push done: front = %lx, rear = %lx\n", (long) front, (long) rear) ;
}

Аналогично, у вас есть вещи немного назад pop(). Вы смотрите rear и также проверяете rear->next. rear->next всегда должна быть NULL. Вместо этого, просто взять первое прочь front. Хуже того, хотя вы считаете, что вы стоите rear даже проверяя, что он пуст. Это будет делать плохие вещи. Поэтому сначала проверяйте указатель на то, что он действителен, а затем прочитайте его значение:

int pop()
{
 int retval= -1 ;
 if ( front )
 {
 struct Node * temp= front ;
 front= front-> next ;
 if ( ! front ) { rear= front ; }
 retval= temp-> Data ;
 free( temp) ;
 }
 return retval ;
}

Это должно заставить вас работать. }

licensed under cc by-sa 3.0 with attribution.