我这样定义队列:
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:
最佳答案
从头开始,如果您未在某处将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 ;
}
这应该使您操作。
}
关于c - 弹出所有元素后,C队列工作异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20580093/