Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный связанный список, Как создать? 
:(
    Опции темы
Limonadni Joe
Дата 31.10.2004, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 1.11.2002
Где: Москва

Репутация: нет
Всего: 2



Нужен алгоритм создания двумерного связанного списка. Каждый элемент связан с правым и с нижним, см. рис:
--Resize_Images_Alt_Text--
(желательно Pascal)

PM MAIL ICQ YIM MSN   Вверх
Fedor
Дата 1.11.2004, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: 2
Всего: 32



Я бы делал так:

Структура данных:
Код

type
a = ^spisok
spisok = record
 ParentLeft, ParentTop:a;
 ChildDown,ChildRight:a;
 znacheniye:integer;
end;

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



--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Akina
Дата 1.11.2004, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Подробнее цель. Элементы движутся? по списку надо ходить в обе стороны?

Или скажем так - а нахрена это? Сформулируй ВСЮ задачу, а не маленький кусочек, а?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
chaos
Дата 1.11.2004, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



Цитата(Limonadni @ 31.10.2004, 12:41)
Нужен алгоритм создания двумерного связанного списка. Каждый элемент связан с правым и с нижним, см. рис:
--Resize_Images_Alt_Text--
(желательно Pascal)

не большая оговрочка
Каждый элемент у тя не будет связан с правым и нижним
PM WWW   Вверх
Limonadni Joe
Дата 1.11.2004, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 1.11.2002
Где: Москва

Репутация: нет
Всего: 2



Цитата
Код
type
a = ^spisok
spisok = record
ParentLeft, ParentTop:a;
ChildDown,ChildRight:a;
znacheniye:integer;
end;


У каждого элемента (кроме крайних) две связи , соответственно должны остаться только ChildDown, ChildRight:a.

Цитата
Соотв, в процедуру добавления можно вставить параметр, куда именно (право или низ) прицепить ребенка. И т.п.

А как будет происходить связывание элемента 2:2 (на рис.) с 2:1 (строка : столбец), если 2:2 был создан от 1:2, а не от 2:1?

Akina, Элементы не движуться (а как они могут двигаться?). Движение по списку происходит только туда? куда показывают стрелки (условие задачи). Как добраться до конкретного элемента - моя задача. "Нахрена это?" - не ко мне вопрос, учитель задал погеморроится и переделать прогу с 2-мерным дин. массивом под 2-мерный список.

Это сообщение отредактировал(а) Limonadni Joe - 1.11.2004, 22:04
PM MAIL ICQ YIM MSN   Вверх
Fedor
Дата 2.11.2004, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: 2
Всего: 32



Цитата(Limonadni @ 1.11.2004, 21:52)

У каждого элемента (кроме крайних) две связи , соответственно должны остаться только ChildDown, ChildRight:a.

Ну это если не надо хранить родителей.
Цитата(Limonadni @ 1.11.2004, 21:52)

А как будет происходить связывание элемента 2:2 (на рис.) с 2:1 (строка : столбец), если 2:2 был создан от 1:2, а не от 2:1?

Понял вопрос. Если честно, не вижу никакого другого варианта, как возвратится к первому родителю 2:2 и пойти от родителя в другую сторону чтоб найти 2:1. Или же к другому родителю... Короче говоря, получается эдакая рекурсивная процедура. Во время нее запоминаешь текущие индексы, и понятно куда идти. Правда, времени так много уйдет...



--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Akina
Дата 2.11.2004, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Limonadni Joe
Цитата
Элементы не движуться (а как они могут двигаться?).
А зачем тогда связи? храни их в массиве, связи обеспечиваются значениями индексов, "дырявость" - null в элементе.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Limonadni Joe
Дата 2.11.2004, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 1.11.2002
Где: Москва

Репутация: нет
Всего: 2



Akina, Задание и условие его решения придумывал не я. НАДО использовать список.

Вообщем справился самостоятельно. См. пример:

Код

type
 PElem = ^TElem;
 TElem = record
   Data: integer;
   Right, Bottom: PElem;
 end;

function CreateList(const n: integer): PElem; // создание квадратного списка со стороной n, и возвращение его первого элемента
var
 cur_c, cur_r: PElem; // cur_r - первый эл. текущей строки, cur_c - текущий эл. текущей строки
 i: integer;
begin
 New(Result);

 // создаём первую строчку                
 cur_c := Result;              
 for i := 1 to n - 1 do begin  
   New(cur_c^.Right);          
   cur_c := cur_c^.Right;      
 end;                          

 // создание остальных строк
 cur_r := Result;
 for i := 1 to n - 1 do begin // для не квадратного списка высотой m заменить n на m
   cur_c := cur_r;
   New(cur_c^.Bottom);
   while cur_c^.Right <> nil do begin
     New(cur_c^.Right^.Bottom);
     cur_c^.Bottom^.Right := cur_c^.Right^.Bottom;
     cur_c := cur_c^.Right;
   end;
   cur_r := cur_r^.Bottom;
 end;
end;



Если хотите понять, как работает, лучше вручную (с карандашиком) продебагить первые две с половиной строчки 2-мерного списка.

Если можно сделать красивее или что-то упростить, напишите.

Это сообщение отредактировал(а) Limonadni Joe - 2.11.2004, 17:29
PM MAIL ICQ YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.