G
Guest
Реализована вставка элемента в очередь с приоритетами. по нарастающей, начиная с минимального.
зачем указатель на указатель, как это работает?
я так понимаю, что в первом цикле while() {} мы ищем элементы в очереди с одинаковыми полями Index. Как только их нашли, удаляем старый элемент из списка с данным Index заменяя его новым (соответственно Weight тоже меняется). Я прав?
Какие еще есть эффективыне ( и не) способы доступа к элементам очереди Q кроме как через двойной указатель???
зачем указатель на указатель, как это работает?
Код:
int PQ_Enqueue(struct PQueue * Q, int Weight, int Index)
{
struct PQueue_Node **nodeptr;
struct PQueue_Node *scannode, *newnode;
/* check to see if Index is already present */
nodeptr = &Q->Front;
newnode = Q->Front;
while (newnode)
{
if (newnode->Index==Index)
{
*nodeptr = newnode->Next;
break;
}
nodeptr = &newnode->Next;
newnode = newnode->Next;
}
if (!newnode)
{
newnode = malloc(sizeof(struct PQueue_Node));
if (!newnode) return 1;
}
/* teper' newnode initialisironana */
newnode->Weight = Weight;
newnode->Index = Index;
/* now insert newnode into the queue */
scannode = Q->Front;
nodeptr = &Q->Front;
while (scannode)
{
if (scannode->Weight>Weight)
{
/* vstavlayem node pervim elementom spiska */
newnode->Next = scannode;
*nodeptr = newnode;
return 0;
}
/* ina4e peredvigaemsya vpravo po spisku */
nodeptr = &scannode->Next;
scannode = scannode->Next;
}
/* esli doshli do konca spiska, vstavlyaem tekushij element vkonec */
newnode->Next = NULL;
*nodeptr = newnode;
return 0;
}
я так понимаю, что в первом цикле while() {} мы ищем элементы в очереди с одинаковыми полями Index. Как только их нашли, удаляем старый элемент из списка с данным Index заменяя его новым (соответственно Weight тоже меняется). Я прав?
Какие еще есть эффективыне ( и не) способы доступа к элементам очереди Q кроме как через двойной указатель???