我这样定义队列:

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 valueber 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 valueber 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:

最佳答案

从头开始,如果您未在某处将frontrear设置为NULL,则所有这些都无法正常工作。

然后让我们看一下push()

当列表为空时,将frontrear设置为等于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->nextrear->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 ;
}


这应该使您操作。
}

关于c - 弹出所有元素后,C队列工作异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20580093/

10-10 06:08