1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

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

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

    Guest Гость

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

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

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

    QoS_Korch (Yury) Гость

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

    Репутация:
    0
    <!--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. Гость

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

    Arush Гость

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

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

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