使用C中的链接列表实现队列实现

时间:2011-02-16 20:12:06

标签: c queue linked-list android-ndk

下面是我的队列的实现,它具有从队列中排队和出队的功能。由于某些原因,它崩溃时没有线索(崩溃的地方),因为代码在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;
}

2 个答案:

答案 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,因为它必须是链表中的最后一个节点。希望这会使你的程序运行。