在 C 中搜索队列

Searching a queue in C

假设我有这个结构:

struct Runway0Landing{

    char fdetails[10];
    int ArrivalTimeHours;
    int ArrivalTimeMins;
    int MinsToLand;
    int MinsForFuel;
    int passengers;
    int WaitingTime;
    struct Runway0Landing *nextPtr;

};

typedef struct Runway0Landing RunZeroLand;
typedef RunZeroLand *RunZeroLandPtr;

这个函数将值添加到队列;

void AddToRunway0L(RunZeroLandPtr *r0LhPtr,RunZeroLandPtr *r0LtPtr,char fdetails[],int ArrivalTimeHours,int ArrivalTimeMins,int MinsForFuel,int passengers)
{
    RunZeroLandPtr newPtr;
    int WaitingTime=0;

    newPtr=malloc(sizeof(RunZeroLand));

    if( newPtr!=NULL)
    {
        strncpy(newPtr->fdetails,fdetails,sizeof(RunZeroLand));
        newPtr->ArrivalTimeHours=ArrivalTimeHours;
        newPtr->ArrivalTimeMins=ArrivalTimeMins;
        newPtr->MinsForFuel=MinsForFuel;
        newPtr->passengers=passengers;
        newPtr->WaitingTime=0;
        newPtr->nextPtr=NULL;


        if( isEmptyL0(*r0LhPtr))
        {
            *r0LhPtr=newPtr;
        }

        else
        {
            (*r0LtPtr)->nextPtr=newPtr;
        }

            *r0LtPtr=newPtr;
        }




}

我试过这种方法,但程序崩溃了:

void RemoveFromQueue(RunZeroLandPtr *r0LhPtr,int MinsForFuel)
{
    r0LhPtr previousPtr;
    r0LhPtr currentPtr;
    r0LhPtr tempPtr;

    char plane[10];
    int passengers;
    int ArrivalTimeHours;
    int ArrivalTimeMins;
    int MinsForFuel;

    strcpy(plane,(*r0LhPtr)->fdetails);

    passengers=(*r0LhPtr)->passengers;
    ArrivalTimeHours=(*r0LhPtr)->ArrivalTimeHours;
    ArrivalTimeMins=(*r0LhPtr)->ArrivalTimeMins;






    if(MinsForFuel == (*r0LhPtr)->MinsForFuel)
    {
        tempPtr=*r0LhPtr;
        *r0LhPtr=(*r0LhPtr)->nextPtr;
        free(tempPtr);





    }
    else
    {
        previousPtr=*r0LhPtr;
        currentPtr=(*r0LhPtr)->nextPtr;

        while(currentPtr!=NULL && currentPtr->MinsForFuel != MinsForFuel)
        {
            previousPtr=currentPtr;
            currentPtr=currentPtr->nextPtr;

        }

        if(currentPtr!=NULL)
        {
            tempPtr=currentPtr;
            previousPtr->nextPtr=currentPtr->nextPtr;
            free(tempPtr);



    }




}

我需要一个函数来检查队列中所有节点的特定标准(即:检查 MinsForFuel 是否等于 0)并将其从 queue.I 已初始化的 r0LhPtr 中删除和 r0LtPtr(队列的头指针和尾指针)在 main 中为 NULL。 谢谢!

首先你应该调整你的函数AddToRunway0L:

    if( isEmptyL0(*r0LhPtr) )
    {
        // list is empty => head and tail point to the same and only element
        *r0LhPtr = *r0LtPtr = newPtr;
    }

    else
    {
        // append new element at tail, new element is new tail
        (*r0LtPtr)->nextPtr = newPtr;
        *r0LtPtr = newPtr;
    }

如果您从列表中删除一个元素,您必须首先测试头元素是否是您要删除的元素。如果不是,则必须迭代直到下一个元素是要删除的元素。

void RemoveFromQueue(RunZeroLandPtr *r0LhPtr, RunZeroLandPtr *r0LtPtr, int MinsForFuel)
{
    RunZeroLandPtr tempPtr;
    RunZeroLandPtr currentPtr;

    if ( isEmptyL0(*r0LhPtr) )
        return;

    if (MinsForFuel == (*r0LhPtr)->MinsForFuel)
    {
        // head element will be removed
        tempPtr = *r0LhPtr;
        *r0LhPtr = (*r0LhPtr)->nextPtr;
        if ( *r0LtPtr == tempPtr ) //  there was only one element
            *r0LtPtr = *r0LhPtr;
        free( tempPtr );
        return;  
    }    

    currentPtr = *r0LhPtr;  
    while ( currentPtr->nextPtr != NULL && MinsForFuel != currentPtr->nextPtr->MinsForFuel )
    {
        currentPtr = currentPtr->nextPtr;
    }

    if ( currentPtr->nextPtr != NULL )
    {
        //  the next element is the element you want to remove
        tempPtr = currentPtr->nextPtr;
        currentPtr->nextPtr = currentPtr->nextPtr->nextPtr ;
        if ( *r0LtPtr == tempPtr ) //  the removed elemtent is tail
            *r0LtPtr = currentPtr;
        free( tempPtr );
    }
    return;
}