не совсем ясен этот код на СИ

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Реализована вставка элемента в очередь с приоритетами. по нарастающей, начиная с минимального.

зачем указатель на указатель, как это работает?
Код:
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 кроме как через двойной указатель???
 
G

Guest

#2
Опять ламерский вопрос, а "матёрые" сишники замолкли :)
Guest
Можно сделать тоже самое, используя просто указатель. Но тогда может возникнуть ситуация неопределенности - когда указатель будет указывать на несуществующий элемент.
 
Q

QoS_Korch (Yury)

#3
Что бы ны было неопределённости, нужно записать в указатель 0, т.е. NULL, и что бы не было лажи проверять. А указатель на указатель - это изврат, или я чего-то не понимаю!?
 
G

Guest

#4
<!--QuoteBegin-QoS_Korch (Yury)+6:01:2004, 01:19 -->
<span class="vbquote">(QoS_Korch (Yury) @ 6:01:2004, 01:19 )</span><!--QuoteEBegin-->Что бы ны было неопределённости, нужно записать в указатель 0, т.е. NULL, и что бы не было лажи проверять. А указатель на указатель - это изврат, или я чего-то не понимаю!?[/quote]
Это указатель на список указателей,если я правильно понял
 
G

Guest

#5
Папа программирования
:))))))))))))
какие тут "матерые" на этом сайте? Рассмешил! Здесь даже сам сайт организован чайниками. Чего стоит одно отнесение 1С к базам данных!! :)))
 
A

Arush

#6
Указатель на указатель введен для более простого манипулирования со списком(Убирается проверка на пустоту списка).
Все от того что список односвязный :)
Тут:
if (newnode->Index==Index)
{
*nodeptr = newnode->Next;
break;
}
Найденый элемент исключается из списка - если было 1->2->3 искали 2, то *nodeptr=2->Next и получаем 1->3

Тут:
Код:
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; //Тут или конец списка или Q->Front если список пуст!!!
Вставляем элемент в список в соответствии с весом.
 
Статус
Закрыто для дальнейших ответов.