C中的Enqueue操作中的无限循环

时间:2015-04-06 11:41:18

标签: c data-structures

我在队列中插入元素但是正在运行无限循环 // x是要输入的元素

 void enqueue(int x)
  {
   queue *ptr;
   ptr=(queue*)malloc(sizeof(queue));
   ptr->info=x;
   if(front==NULL&&rear==NULL)
   {
      front=rear=ptr;
      ptr->next=NULL;
   }
   else
   {
    rear->next=ptr;
    rear=ptr;
   }
 }

//显示打印元素的功能

  void show()
  {
  queue *ptr=front;
  while(ptr!=NULL)
    {
      printf("%d\n",ptr->info);
      ptr=ptr->next;
    }
  }

2 个答案:

答案 0 :(得分:1)

您需要添加ptr->next=NULL,在您的情况下将其设置在if循环中。它应该在两个条件下设置

 void enqueue(int x)
  {
   queue *ptr;
   ptr=malloc(sizeof(queue)); // As sourav mentioned you don't need to cast here
   ptr->info=x;
   ptr->next=NULL;
   if(front==NULL&&rear==NULL)
   {
      front=rear=ptr;
      //ptr->next=NULL;
   }
   else
   {
    rear->next=ptr;
    rear=ptr;
   }
 }

答案 1 :(得分:0)

您只是在一个案例中将ptr->next设置为NULL,您应该为两者(或if声明之外完成此操作):

void enqueue(int x) {
    queue *ptr = malloc (sizeof (*ptr));

    // should really check for NULL here first

    ptr->info = x;
    ptr->next = NULL;

    // If front is NULL, rear should be as well,
    // so only need check one.

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

你会注意到我修复过的其他几件事,特别是:

  • 删除malloc的返回值的转换,这可能很危险。
  • 尽可能缩短代码。
  • 删除head 尾指针等冗余检查。
  • 建议你检查所有可能失败的操作,特别是如果它们可能会导致像malloc这样的灾难性后果。