2013-06-08 3 views
0

Я пытаюсь вставить узлы в список на основе значения элемента данных. В принципе, если член isVip оценивает значение true, этот узел получает приоритет и должен быть вставлен перед любым обычным узлом (но за любыми существующими VIP-узлами). Регулярные узлы просто добавляются в конце списка.Вставка до/после узла в связанном списке

Я уверен, что у меня есть хорошая идея, как использовать два указателя для перехода по списку и вставить элементы для n> 2, где n - количество текущих членов списка, но я как бы концептуально застрял для случая, когда есть только один узел.

Вот моя рабочая версия кода ниже:

void SelfStorageList::rentLocker(Locker e) { 

int count = 0; 
    LockerNode *p = head; 

if (isEmpty()) { 
    head = new LockerNode(e); 
    tail = head; 
} 

for(;p!=0;count++, p=p->next) { 

    if(count == 1) { 

     if (e.isVip) { 

         if(p->objLocker.isVip) { 
          LockerNode*p = new LockerNode(e, p->next); 

      } 
        } 

      } 


} 

Как вы можете видеть, я проверяю, чтобы увидеть, если передаваемый в объект является VIP, а затем ли текущий один. Здесь я столкнулся с некоторыми неприятностями. Предполагая, что оба VIP, будет эта строка:

LockerNode*p = new LockerNode(e, p->next); 

поставил переданному в объекте шкафчика в нужном месте (то есть после того, как текущий VIP один). Если да, то:

LockerNode*p = new LockerNode(e, p); 

аналогичным образом разместить его раньше? Является ли использование или отсутствие «следующего» члена узла, что определяет место размещения, или это что-то совсем другое?

Надеюсь, что кто-то может очистить мои сомнения, и извините, если это кажется глупым вопросом! Благодаря!

+0

Вы должны изменить 'p-> next' где-нибудь. Как выглядит конструктор 'LockerNode (e, p)'? – Inspired

+0

Вы действительно хотите передать аргумент 'Locker' * по значению *? Это означает, что это будет * копия *. Вы должны подумать о передаче его по ссылке (или как указатель). –

+0

Нет, значение должно быть прекрасным. Я в порядке с копиями, но спасибо за предложение. –

ответ

0

Просто перебирайте список, а следующий узел имеет isVip комплект (current->next->isVip). После итерации последний посетивший узел будет последним с isVip, и вы должны вставить новый узел после этого.


Он может быть реализован в меньшем количестве линий, без явного isEmpty проверки, и без рецепта. Даже меньше, если вместо этого вы используете стандартный контейнер.

Смежные вопросы