【问题标题】:Searching a queue in C在 C 中搜索队列
【发布时间】:2016-04-06 08:01:04
【问题描述】:

假设我有这个结构:

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 )并将其从队列中删除。我已经初始化了 r0LhPtr 和 r0LtPtr ( head 和 tail队列的指针)在 main 中为 NULL。 谢谢!

【问题讨论】:

  • 你试过什么?构建这样一个功能的特定部分是否您不了解?
  • 我尝试了一种使用先前、当前和临时指针的方法,我在链表上使用过,但它不起作用,反而会崩溃。我的链表只有一个头指针,但这个队列有一个头和一个尾,我不确定如何去做。
  • 我相信您应该编辑您的问题以添加这些详细信息(可能还有一些示例),而不是将它们添加为 cmets。

标签: c queue


【解决方案1】:

首先你应该调整你的函数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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多