Реализация очереди со связанными списками в C - PullRequest
3 голосов
/ 16 февраля 2011

Ниже приведена реализация моей очереди, которая имеет функции постановки в очередь и удаления из очереди.По какой-то причине он падает без подсказок (где он падает), так как код работает на 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 ]

4 голосов
/ 16 февраля 2011

Когда вы очищаете очередь, вы не устанавливаете tailElement в NULL.В следующий раз при постановке в очередь headElement останется нулевым, и вы получите доступ к удаленному tailElement, который может аварийно завершить работу.Если этого не произойдет, при выходе из очереди вы получите доступ к headElement-> next, что приведет к краху.

...
headElement=headElement->next;
if (!headElement)
    tailElement=NULL;
Frame = delnode->Phone;
...
0 голосов
/ 16 февраля 2011

Когда вы удаляете элемент , вы должны проверить, является ли head-> next == NULL или нет. Поскольку, если это правда, вы должны установить tail в NULL как это должен быть последний узел в связанном списке. Надеюсь, что это заставит вашу программу работать.

...