Связные списки (и указатели на указатели)

Модератор: Модераторы разделов

PIF
Сообщения: 391

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

Сообщение PIF »

Мучаю лабораторную работу по "Алгоритмам и структурам", тема "Связные списки". От Кнута никакой пользы кроме головной боли и желания этот том выбросить, нафиг, в окно(как всегда, в принципе. И зачем нас по нему учиться заставляют?!). Г. Шилдт в "Полном справочнике по С" все описывает проще. Не могу понять одного:

Код: Выделить всё

// Функция вставки в конец списка

void slstore(struct adress *i, struct adress **last)
{
   if (*last==NULL)
      *last=i; // Первым элементом будет
   else
      (*last)->next = i;

   i->next = NULL;
   *last = i;
}


Нет, в принципе, все ясно, и мне, и компилятору. Смущает конструкция "указатель на указатель", т. е.

Код: Выделить всё

   (*last)->next = i;
...
// и т. д.


Мне понятно (вроде бы) как она работает, но почему используется именно она? Почему нельзя использовать один указатель?
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Связные списки

Сообщение elide »

видишь в самом конце там есть

Код: Выделить всё

*last = i;
вот для этого и нужен указатель на указатель.
потому как в С все параметры всегда передаются по значению. а раз так, то их невозможно менять.
поэтому приходится использовать двойные указатели. все крайне просто.
слава роботам!
Спасибо сказали:
PIF
Сообщения: 391

Re: Связные списки

Сообщение PIF »

elide писал(а):
29.11.2006 17:55
видишь в самом конце там есть

Код: Выделить всё

*last = i;
вот для этого и нужен указатель на указатель.
потому как в С все параметры всегда передаются по значению. а раз так, то их невозможно менять.
поэтому приходится использовать двойные указатели. все крайне просто.


Вай-вай-вай, дятел я, дятел.
Полный дятел. Забыл значение заклинания "передача по значению". Блин. Посыпаю голову пеплом.
Типа, через передачу указателя на указатель, мы передаем адрес того указателя, по которому сохраняем адрес элемента i. (Это я для таких же дятлов. Чтобы не мучались, если что)
Спасибо сказали:
Аватара пользователя
makss
Сообщения: 226
ОС: Win+ Lin

Re: Связные списки

Сообщение makss »

Код: Выделить всё

void slstore(struct adress *i, struct adress **last)
{
   if (*last==NULL)
      *last=i; // Первым элементом будет
   else
      (*last)->next = i;

   i->next = NULL;
   *last = i;
}


Код: Выделить всё

[b]   else
      (*last)->next = i;

   i->next = NULL;
   *last = i;[/b]

зачем???в данном случае вот это мы же и так присвайваем последнему указателю адрес данной структуры
я так понимаю next это указатель в структуре на саму себя( структуру ), нафиг он нужен в этом случае
не воспринимайте Linux c позиции Windows, учитесь использовать командную строку
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Связные списки

Сообщение elide »

я так понимаю next это указатель в структуре на саму себя
хм.... почему-то все вменяемые люди назвали бы ссылку на саму себя this или, в крайнем случае, self.
а если указатель называется next, то он должен указывать на _следующую_ структуру.
ты не находишь это логичным?
т.е. я не знаю, может ты всегда называешь ссылку на себя - next. тогда я уже ничем не могу тебе помочь.... но нормальные люди так не делают, нет.
слава роботам!
Спасибо сказали:
Аватара пользователя
makss
Сообщения: 226
ОС: Win+ Lin

Re: Связные списки

Сообщение makss »

хм.... почему-то все вменяемые люди назвали бы ссылку на саму себя this или, в крайнем случае, self.
а если указатель называется next, то он должен указывать на _следующую_ структуру.
ты не находишь это логичным?
т.е. я не знаю, может ты всегда называешь ссылку на себя - next. тогда я уже ничем не могу тебе помочь.... но нормальные люди так не делают, нет.


Да не в том дело как ее назвать
собственно я имелл ввиду примерно это

struct adr {
...
...
...
/* обявление членов структуры /*
adr *next;
}

/* код /*

создаем допустим два экземпляра структуры adr

adr ad1, ad2;

тогда конструкция вида
ad1.next = &ad2;
и получается что ad1 содержит в себе адрес экземпляра ad2
и в принципе это можно делать пока не законситься память у компа:)
или я опять что то не понимаю:)

и еще вопрос
чем будет отличаться кроме видимости(так скажем экземпляра) конструкции:

addr my;
и
addr *p_my;
p_my = (addr *)malloc(sizeof(addr));

я так понимаю в первом случае память для него выделиться автоматом, и уничтожиться автоматом при выходе из блока в котором он создан, а во втором память для него так и останеться пока мы явно не укажем удалить ее при помощи free
не воспринимайте Linux c позиции Windows, учитесь использовать командную строку
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Связные списки

Сообщение elide »

ну тут я даже не знаю.... это уже явно не в этот форум.
почитай хоть что-нибудь по языку, ага. пересказывать главы учебников тебе здесь никто не будет.
слава роботам!
Спасибо сказали:
Аватара пользователя
makss
Сообщения: 226
ОС: Win+ Lin

Re: Связные списки

Сообщение makss »

Спасибо читал, и не раз

Поэтому собственно и спрашиваю,
и почему не в этот форум.....сложно сказать что тут не так, так я специально примерно это делал и дебагером прогонял все работало как и должно, только там я память выделял malloc для экземпляра структуры, и адрес сохранял как раз в next.
не воспринимайте Linux c позиции Windows, учитесь использовать командную строку
Спасибо сказали:
Аватара пользователя
Bruce
Сообщения: 647
Статус: beat maniac
ОС: Debian GNU/Linux 4.0

Re: Связные списки

Сообщение Bruce »

чего-то мне кажется, что сначала нужно понять _как_ это должно работать, потом словесно это описать, если уж совсем туго - нарисовать себе алгоритм, потом написать самому, а уж потом лезть в тонкости учебников. а то совсем уже :/
Samsung r40 (t5500, 1.5G ram, 80 gb hdd)

koolkhel's lj
Спасибо сказали: