Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Списки - что такое, зачем и с чем их есть ?
 
 автор: DDK   (30.03.2007 в 23:10)   письмо автору
 
 

Расскажите пожалуйста подробно :) Ни в одной книге не нашел доходчивого объяснения...

  Ответить  
 
 автор: Oligarx   (31.03.2007 в 11:08)   письмо автору
 
   для: DDK   (30.03.2007 в 23:10)
 

если не ошибаюсь то это списки констант ... и используют их если не ошибаюсь, когда нужно описать большое количество констант одна за другой ... например таблица цветов.

  Ответить  
 
 автор: DDK   (31.03.2007 в 11:53)   письмо автору
 
   для: Oligarx   (31.03.2007 в 11:08)
 

Мне вот свстретился такой пример:


struct mystruct {
char field1[8];
char field2[4];
int field3;
int field4;
float field5;
float field6;
};

struct list {
mystruct m;
list* next;
};

struct list *head, *ref, *last;

int Add() {
ref=last;
if((last=(list*) calloc(1,sizeof(list)))!=NULL) {
last->next=NULL;
if(head!=NULL)
{
ref->next=last;
ref=last;
else {
head=ref=last;
return 1;

else {
cerr<< "No more memory avaliable";
return 0;
}
}; 

void Del() {
if(head!=NULL) {
while(head->next!=NULL) {
ref = head->next;
free((list*) head);
head = ref;
}
}
return;
};

... и т.д. в том же духе


Как оно работает ?

ЗЫ: Мда... что-то с табуляцией на этом форуме плоховато, в php-шном нормально вроде было же...

  Ответить  
 
 автор: cheops   (31.03.2007 в 14:26)   письмо автору
 
   для: DDK   (31.03.2007 в 11:53)
 

Списки основаны на укзателях... если массив - это набор блоков, расположенных последовательно рядом друг с другом, то список - это набор блоков, разбросанных по всей памяти и связанных друг с другом указателями. Исчезает возноможность пользоваться индексом, однако появляется гибкость - не нужнен неразрывный кусок памяти для его хранения и очень легко вставить новый элемент в середину. Элемент списка как правило состоит из структуры или объекта, в котором имеется два указателя - на предыдущий и последующий элемент, ну и полезная нагрузка: то это элемент хранит. Например
typedef struct element
{
  int number;
  // Ссылка на следующий элемент списка
  struct element *next;
  // Ссылка на предыдущий элемент списка
  struct element *prev;
} element;

PS Подробно создание списка разбирается в нашей книге "C++ мастер-класс в задачах и примерах".
PPS Существуют готовые списки, например, контейнер list в библиотеке STL.

  Ответить  
 
 автор: cheops   (31.03.2007 в 14:27)   письмо автору
 
   для: DDK   (31.03.2007 в 11:53)
 

Табуляция ещё зависит от программы, откуда копируете - в буфер обмена редактор может помещать минимальное количество символов.

  Ответить  
 
 автор: DDK   (02.04.2007 в 13:49)   письмо автору
 
   для: DDK   (30.03.2007 в 23:10)
 

Блин, не понимаю я всё-таки этот указательный механизм :( Объясните пожалуйста "для идиотов", если можно с примерами :)

  Ответить  
 
 автор: alex19921992   (02.04.2007 в 14:13)   письмо автору
 
   для: DDK   (02.04.2007 в 13:49)
 

Короче указатель, это переменная, которая может куда-нить "смотреть".
каждый элемент списка имеет 2 таких указателя - на следующий эл-т и на предыдущий. При добавлении первого элемента в список, ты все указатели направляешь в ноль (НУЛЛ). при добавлении второго, тебе надо сделать так, чтобы соответствующий указатель второго смотрел на первый эл-т, а указатель первого - на второй. примерно таким же образом делается удаление, добавление в центр эл-тов, и т.п. 2 эл-та должны каждый указывать друг на друга, т.к. если первый указывает на второй, то имея второй эл-т мы не сможем взять информацию с первого. Чтобы пробежать весь список циклом, надо иметь 2 отдельных указателя - на первый и последний эл-ты, а также "бегунок" - чтоб пробежать список.
Сначала ты ставишьбегунок на первый эл-т и делаешь че-нить с ним. Потом переходишь по указателю на след. эл-т, и так далее.
Указатель хранит адрес ячейки памяти, поэтому перейти по указателю можно простым присваиванием:
begunok=begunok->next;

  Ответить  
 
 автор: cheops   (02.04.2007 в 15:40)   письмо автору
 
   для: DDK   (02.04.2007 в 13:49)
 

Указатель - это переменная в качестве значения которой используется адрес другой переменной. Используя оператор разыменовки * можно получить значение переменной на которую указывает оператор, а при помощи & наоборот адрес переменной. Я обычно, когда указатели объясняю, рисую следующую схему
         |  Указатель |  Переменная |
---------|------------|-------------|
значение |  *point    |   variable  |
адрес    |   point    |  &variable  |
---------|------------|-------------|

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования