1

みんな私はキューに不慣れで、それらがどのように機能するかを理解するのが難しいと感じています。私が理解しているのは、キューはAppendアイテムでありServe、追加された最初のアイテムであるということだけです。

以下のコードから、私が理解したのは、追加するたびにLink常にNULL、それは正しいですか? また、いつTail !=NULLtrue になりますか? 追加するたびに...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();
}
4

1 に答える 1

0

Tailと の間で混乱してTail->Linkいます。キューでTail->Linkは、常にNULLです。ただし、キューが空の場合のみですTail。キューに少なくとも 1 つのノードがある場合はそうではありません。NULLTailNULL

キューは FIFO 構造 (先入れ先出し) です。ノードは常にキューの最後に追加され、ノードは常にキューの先頭から削除されます。したがって、ノードを追加すると、新しいノードがキューの最後に追加されます。そのため、最後に追加されたノードが常にTailキューのノードになります。Tail->Linkの場合、次のノードへのポインターは常に になりNULLます。これは、キュー内の最後のノードであり、次のノードがないためです。

何が起こっているかは次のAppend()とおりです。

  1. 新しいノードにメモリが割り当てられます。データが新しいノードにコピーされます。新しいノードは既存のキューの最後に追加されるため、新しいノードのリンクは に設定されNULLます。
  2. 既存のキューがチェックされます。Tail既存のキューのノードが の場合、キューNULLにノードがないことを意味します。したがって、新しいノードはキュー内の唯一のノードになります。これは、キューの最初のノードになることを意味します。これは、Headポインタにこの新しいノードを割り当てる必要があることを意味します。あなたのコードはこれを正しく行います。
  3. Tail既存のキューのノードが でない場合NULL、新しいノードを既存のキューの最後に追加する必要があります。つまり、既存のキューを新しいノードTail->Linkに変更する必要があります。NULLあなたのコードもこれを行います。
  4. Tail最後に、新しいノードがキューの最後になるため、既存のキューのノードが新しいノードに設定されます。

このようにして、新しいノードがキューの最後に追加されます。現在はTailであり、テール ノードであるため、そのリンクはNULLです。

うまくいけば、それは明らかです。ところで、質問にタグを付けcましたが、関数ヘッダーの参照渡し構文void Append(QueuePointer &Head,QueuePointer &Tail, int Num)は C ではなく C++ です。

于 2013-08-31T09:48:07.340 に答える