伙计我是排队的新手,发现很难理解它们是如何工作的。我所理解的是,队列Append
的项目和Serve
是第一个被附加的项目。
从下面的代码中,我理解的是每次添加Link
总是NULL
,这是正确的吗?而且Tail !=NULL
什么时候变为真?我很困惑,因为每次我们追加Tail
都设置为NULL
...
int item;
struct Node
{
int Data;
struct Node *Link;
};
typedef struct Node *QueuePointer;
void Append(QueuePointer &Head,QueuePointer &Tail, int Num)
{
QueuePointer NewNode;
NewNode= (QueuePointer)malloc(sizeof(struct Node));
NewNode->Data = Num;
NewNode->Link = NULL;
if(Tail == NULL)
{
Head = NewNode;
// printf("Queue is empty"); //checks if queue is empty
// printf("\n");
}
else
{
Tail->Link = NewNode;
}
Tail = NewNode;
printf("Inserted number %d \n", item); //checks if Appends into Queue working
}
void Serve(QueuePointer &Head, QueuePointer &Tail, int item)
{
QueuePointer Temp;
printf("Served ");
while(Head != NULL)
{
item = Head->Data;
Temp = Head;
Head = Head->Link;
if(Head == NULL)
{
Tail = NULL;
}
free(Temp);
printf("%d ", item); //prints out SERVED
}
}
int main()
{
QueuePointer Head, Tail;
Head = NULL;
Tail = NULL;
item = 1;
for (item = 1; item <= 4; item++)
{
// if(item%2==0)
// {
Append(Head, Tail, item); //Appends For Every Even Number Detected
// }
}
Serve(Head, Tail, item); //Calls out Serve Function, See LOOPING, please refer serve function
//****NOTE: the loop for Removing items is inside Serve Function
getch();
}
答案 0 :(得分:0)
您在Tail
和Tail->Link
之间感到困惑。在队列中,Tail->Link
始终为NULL
。但只有当队列为空时,Tail
才是NULL
。如果队列中至少有一个节点,则Tail
不是NULL
。
队列是FIFO结构(先进先出)。节点始终添加到队列的末尾,并且始终从队列的开头删除节点。因此,当您追加节点时,新节点将被添加到队列的末尾。因此,最近添加的节点将始终是队列的Tail
节点。 Tail->Link
,它指向下一个节点的指针始终为NULL
,因为它是队列中的最后一个节点,并且没有下一个节点。
Append()
中发生的事情是:
NULL
。Tail
节点为NULL
,则表示队列中没有节点。所以新节点将成为队列中唯一的节点;这意味着它将成为队列中的第一个节点;这意味着应该为这个新节点分配Head
指针。你的代码正好这样做。Tail
节点不是NULL
,则必须将新节点添加到现有队列的末尾。即,现有队列的Tail->Link
应该从NULL
更改为新节点。您的代码也是如此。Tail
节点设置为新节点,因为新节点现在是队列的末尾。 通过这种方式,新节点被添加到队列的末尾。它现在是Tail
,因为它是尾节点,所以它的链接是NULL
。
希望这很清楚。顺便说一下,您已经标记了问题c
,但函数头void Append(QueuePointer &Head,QueuePointer &Tail, int Num)
中的传递引用语法是C ++,而不是C.