下面是我的队列的实现,它具有从队列中排队和出队的功能。由于某些原因,它崩溃时没有线索(崩溃的地方),因为代码在android上运行。我怀疑我的队列代码。如果你们有任何线索,我的代码有什么问题,请给我一个想法。
感谢您的帮助。
这是我的C代码:
int qLast = 0;
typedef struct phoneSt PhoneStructure;
typedef struct{
PhoneStructure Phone;
struct phoneQ *next;
}phoneQ;
phoneQ *headElement = NULL; /* front pointer in queue*/
phoneQ *tailElement = NULL; /* rear pointer in queue */
void enqueue_Phone(PhoneStructure Frame)
{
phoneQ *newnode; /* New node to be inserted */
newnode=(phoneQ*)av_malloc(sizeof(phoneQ));
newnode->next=NULL;
newnode->Phone=Frame;
qLast++;
if(headElement==NULL && tailElement==NULL)
{
headElement=newnode;
tailElement=newnode;
}
else
{
tailElement->next=newnode;
tailElement=newnode;
}
__android_log_print(ANDROID_LOG_DEBUG, "myphone.c", "Queue is having %d element", qLast);
}
PhoneStructure dequeue_Phone()
{
phoneQ *delnode; /* Node to be deleted */
PhoneStructure Frame;
__android_log_write(ANDROID_LOG_DEBUG, "myplayer.c", "In dequeue_Phone");
if(headElement==NULL && tailElement==NULL){
__android_log_write(ANDROID_LOG_ERROR, "myphone.c", "Queue is empty to delete any element");
}
else
{
__android_log_write(ANDROID_LOG_DEBUG, "myphone.c", "In dequeue queue is not empty");
delnode=headElement;
headElement=headElement->next;
Frame = delnode->Phone;
av_free(delnode);
qLast--;
}
__android_log_print(ANDROID_LOG_DEBUG, "myphone.c", "In dequeue_Phone returning remaining %d",qLast);
return Frame;
}
答案 0 :(得分:4)
清空队列时,不要将tailElement设置为NULL。下次入队时,headElement将保持为null,您将访问可能崩溃的已删除tailElement。如果没有,当您出列时,您将访问headElement-> next,将崩溃。
...
headElement=headElement->next;
if (!headElement)
tailElement=NULL;
Frame = delnode->Phone;
...
答案 1 :(得分:0)
你要删除元素时,你必须检查 head-> next == NULL 是否。如果这是真的那么你必须设置尾部为NULL,因为它必须是链表中的最后一个节点。希望这会使你的程序运行。