Связанные списки

Рейтинг: 0Ответов: 1Опубликовано: 09.11.2014

Добрый день. Хочу уточнить. Есть код вида(простой набросок):

struct list{
  int data;
  list*pNext;
};
list *pHead=NULL;
void addHead(int b)
{
    list *ch=new list;
    ch->data=b;
    ch->pNext = pHead;
    pHead = ch;
}
void display (){
    list * current=pHead;
    while(current)
    {
       cout<<current->data;
       current=current->pNext;
    }

}
int main() 
{

  addHead(3);
  display();
   return 0;
}

Не могу понять логику в строке list * current=pHead; Почему *current указывает на 1-й элемент, а не на NULL, ведь в блоке void addHead(int b)pHead присваевается NULL. Вроде, все написал как надо, но выводит бесконечно только последний введенный элемент. Помогите, пожалуйста, разобраться.

Обновление

pHead=ch; pHead указывает на созданную структуру, куда записалась в поле data 3, я правильно понял? В функции display() current указывает на структуру, а если вызовов будет несколько, то *current укажет на последнею структуру или нет?

С присваиванием NULL я ошибся, вы правы.

Обновление 2

Этот код стряпал я. ) Действительно, включив ее в цикл, все заработало, спасибо за внимательность. ) Тогда остался последний вопрос, как в функции dissplay() происходит вывод на печать, т.е. *current указывает на pHead;, который объявлен глобально и равен налу? Значит, *current = NULL, соответственно, далее идет проверка while(current){...} (не равен ли currenr 0), но он ведь равен. Я запутался здесь. Код писал с примера.

Ответы

▲ 1Принят

То что Вы написали называется стек. Тоже разновидность списка.

Я так и не понял, а что Вам тут не нравится?

Если хотите строить список, добавляя элементы в хвост, то используйте 2 указателя -- head и tail (для списка из одного элемента tail == head).

Кстати, только что был подобный вопрос, правда о двусвязном списке, но в целом все то же самое. Почитайте.

Обновление

Смысл строки:

list * current=pHead;

крайне прост.

В функции определяется локальная переменная с именем current и ее начальным значение становится адрес первого элемента списка. Это значение берется из глобальной переменной pHead.


Ничего вроде: "в дальнейшем может быть выделена" нет и в помине...


Если список пуст, то pHead = 0. Последний элемент списка тоже имеет нулевой указатель. Поэтому такой цикл while корректно перебирает все элементы списка.

Обновление 2

@dil, возьмите отладчик (или карандаш и листок бумаги) и посмотрите программу по шагам.


На самом деле в начале main() pHead=0. После первого вызова addHead() она будет равна, скажем 100000 (результату new). А pNext в структуре по этому адресу будет 0.

После второго addHead() pHead станет, например, 100016, а pNext в этой структуре -- 100000 (т.е. предыдущее значение pHead).

И т.д.

pHead будет всегда указывать на первый по порядку (но последний в смысле времени создания (только что созданный)) элемент списка (он же стек в данной реализации).