Очередь двойных указателей, deQueue, enQueue - PullRequest
0 голосов
/ 28 ноября 2018

В настоящее время готовится к экзаменам и не может выяснить причины, стоящие за очередью [Rear *] = new_node в этом примере кода.

Вы не вводите адрес new_node вместо значения?

Кроме того, является ли очередь очередью Node **, поскольку она является указателем на список указателей узлов?

Большое спасибо, я действительно ценю это, независимо от того, сколько часов я трачуна двойных указателях они всегда возникают и перепроверяют мое понимание, которое я, наконец, понял!

void enQueue(struct node **queue, int *rear, struct node *new_node) 
{ 
queue[*rear] = new_node; 
(*rear)++; 
} 

struct node *deQueue(struct node **queue, int *front) 
{ 
(*front)++; 
return queue[*front - 1]; 
} 

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Здесь queue - указатель на указатель на массив struct Node pointers.

, где каждый node указатель внутри массива будет указывать на новые узлы.

              node 1              node2
               ^                  ^
               |       ....       |
           +--------+---------+--------+
  queue -->| node * | node *  |node *  |
           +--------+---------+--------+

Когда вы делаете

       queue[*rear] = new_node; 

Вы присваиваете node * в позиции *rear внутри массива queue для NewNode

Единственная причина, по которой я могу придумать для поддержки массива Node *заключается в том, чтобы избежать копирования содержимого NewNode.

0 голосов
/ 28 ноября 2018

переменная rear является указателем на int*rear вы получите значение этого int.Это значение затем используется в качестве индекса.

Это эквивалентно, например,

int index = *rear;
queue[index] = new_node;
index++;
*rear = index;

Копирует значение переменной new_node (т.е. адрес, на который указывает указатель) в queue[index].С этого момента и new_node, и queue[index] указывают на одно и то же.

Надеюсь, это прояснит, что происходит.

...