在 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;
}
假设我有这个结构:
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;
}