【问题标题】:Queue implementation with linked lists in CC中链表的队列实现
【发布时间】:2011-06-28 15:21:16
【问题描述】:

下面是我的队列的实现,它具有从队列中入队和出队的功能。由于某种原因,它在没有任何线索的情况下崩溃(它在哪里崩溃),因为代码在 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;
}

【问题讨论】:

  • dequeue_phone 和 enqueue_phone 从不同的线程调用,同步使用 qLast,如果小于 1,则不会出队。我怀疑问题出在 dequeue_phone 上。如果有人发现此代码有问题,请告诉我。

标签: c queue linked-list android-ndk


【解决方案1】:

你要删除元素时你必须检查是否head->next==NULL。如果这是真的那么你必须设置tail NULL 因为这必须是链表中的最后一个节点。希望这将使您的程序运行。

【讨论】:

    【解决方案2】:

    当您清空队列时,您不会将 tailElement 设置为 NULL。下次您入队时,headElement 将保持为 null,您将访问已删除的 tailElement,可能 崩溃。如果没有,当你出队时,你访问 headElement->next,这崩溃。

    ...
    headElement=headElement->next;
    if (!headElement)
        tailElement=NULL;
    Frame = delnode->Phone;
    ...
    

    【讨论】:

    • 我正要说同样的话,但会根据原作者在您的帖子之后的评论添加代码(即使已修复)也不是线程安全的。例如。在出队时将队列设置回空的行为不是原子的,因此可能与将新节点排队到被认为不为空的队列中的行为重叠。作者最好使用互斥锁来确保一次只有一个线程访问与队列有关的任何内容。
    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 2020-04-17
    • 1970-01-01
    • 2018-05-17
    • 2021-07-24
    • 1970-01-01
    • 2018-05-16
    • 2021-10-19
    相关资源
    最近更新 更多