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

Тема в разделе "C и С++ FAQ", создана пользователем Guest, 27 дек 2003.

Статус темы:
Закрыта.
  1. Guest

    Guest Гость

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

    зачем указатель на указатель, как это работает?
    Код (Text):
     
    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 кроме как через двойной указатель???
     
  2. Гость

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

    QoS_Korch (Yury) Гость

    Что бы ны было неопределённости, нужно записать в указатель 0, т.е. NULL, и что бы не было лажи проверять. А указатель на указатель - это изврат, или я чего-то не понимаю!?
     
  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]
    Это указатель на список указателей,если я правильно понял
     
  5. Гость

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

    Arush Гость

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

    Тут:
    Вставляем элемент в список в соответствии с весом.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей