Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
#1

Двунаправленный список однонаправленных упорядоченных подсписков - Pascal

16.02.2009, 15:43. Просмотров 3341. Ответов 25
Метки нет (Все метки)

Двунаправленный список однонаправленных упорядоченных подсписков. Реализация задачи должна быть только с применением динамических структур. Дополнительно реализовать:
  • Нахождение произведения всех элементов указанного подсписка.
  • Разбиение n-го подсписка на два подсписка отличающихся не более, чем на один элемент.
  • Найти количество элементов в n-ом подсписке, стоящих после элемента с ключом k.
Плаз,подскажите,что за подсписки и где про них есть материал?

ребят,ну что никто не знает,а то я всю голову себе поламала...

я знаю есть человек,который знает ответ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2009, 15:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Двунаправленный список однонаправленных упорядоченных подсписков (Pascal):

Двунаправленный список
У меня дана информация про спортсмена:ФИО, вес, рост.Создать процедуру для...

Линейный двунаправленный список
Помогите разобраться с задачей. Задан массив из 40 случайных элементов,...

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

Массив целых чисел, двунаправленный список
Дан массив целых чисел. Поместить все элементы этого массива в двунаправленный...

Односвязный список.Добавление упорядоченных записей. Вывод.
Здравствуйте. Просмотре форум нашёл такую же задачу, но к сожалению не...

Двунаправленный неупорядоченный список. Ошибка Встречено '=', а ожидалось ';'
делал задачку и вот возникла проблемка: Строка 162 : Встречено '=', а...

25
Xentar
Of Wolf and Man
993 / 188 / 5
Регистрация: 09.07.2008
Сообщений: 1,778
16.02.2009, 16:05 #2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
type
   odnosvyazniy_spisok=^spisok_os; // структура односвязного списка (в задаче идет как подсписок к двусвязному)
   spisok_os = record
   next:odnosvyazniy_spisok; // ссылка на следующий эл-т односвязного списка (на предыдущий нет, ибо односвязный)
   data:[тип данных односвязного списка]; // данные хранящиеся в ячейке списка
   end;
   
   dvuh_svyazniy_spisok=^spisok_ds; // структура основного двусвязного списка.
   spisok_ds = record
   next,prev:dvug_svyazniy_spisok;   // ссылки на следующий и предыдущий элемент двусвязного списка (оттого и двусвязный)
   begg:odnosvyazniy_spisok; // ссылка на первый элемент односвязного подсписка.
   end;
1
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
17.02.2009, 10:48  [ТС] #3
это всё хорошо,только где подсписок??

Добавлено через 16 часов 25 минут 20 секунд
а то я честно говоря не увидела...
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
17.02.2009, 11:01 #4
Ну вот тот указатель который будет указывать из элемента двунаправленого списка, на однонаправленный:
Код
begg:odnosvyazniy_spisok;
Для Вас уже сделали описание, Вам осталось почитать про то как создаются такие списки и всё... Смотрите тут...
1
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
17.02.2009, 13:14  [ТС] #5
мне неясна вот эта строчка
Pascal
1
data:[тип данных односвязного списка];
её что так и писать??
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
17.02.2009, 13:20 #6
Ну я не знаю, если вы пишете такое то встаёт вопрос вы знаете Паскаль?
Xentar написал так из-за того, что он не знает какую вы будете хранить информацию в вашем списке (integer,real,byte,word,longint,record...)
0
Puporev
Модератор
54124 / 41757 / 28869
Регистрация: 18.05.2008
Сообщений: 98,280
17.02.2009, 13:21 #7
её что так и писать??
Тип, раз у Вас числа, то это мне кажется integer, real и т.д.
1
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
17.02.2009, 16:46  [ТС] #8
я думаю,что лучше integer,спасибо вам

Добавлено через 3 часа 21 минуту 15 секунд
ребята,я теперь столкнулась с тем,а как умножить,ведь элементов n?
0
Xentar
Of Wolf and Man
993 / 188 / 5
Регистрация: 09.07.2008
Сообщений: 1,778
17.02.2009, 17:05 #9
Вместо цикла for используешь
repeat
или
while
условием выхода будет возвращение к начальному элементу. (если делаешь циклический список)
или значение null (nil) (ссылка на несуществующий эл-т. присутствует в начале списка (предыдущий элемент не существует) и в конце списка (так как следующий после последнего элемент не существует)
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
17.02.2009, 17:55  [ТС] #10
у меня линейный список....

типа вот так?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Procedure proizvedenie; 
var  
 i,n: integer;  
 proiz: real;  
begin  
 clrscr;  
 proiz:=1;  
 write('Vvedite N: ');  
 readln(n);  
 for i:=1 to n do  
 proiz:=proiz*i;  
 writeln('Proizvedenie=',proiz);  
 readkey;  
end.
или нет?
0
Xentar
Of Wolf and Man
993 / 188 / 5
Регистрация: 09.07.2008
Сообщений: 1,778
18.02.2009, 10:53 #11
...................
структуру списков я написал.
Видимо ты совсем не работала со списками.
...................
n - у тебя уже есть ! ибо список имеет ограниченную длинну
про цикл FOR - ЗАБУДЬ !!!
...................
обращение к элементам списка производится таким образом
Pascal
1
S^.data //где S - указатель вашего списка, а data - данные хранящиеся в данном элементе списка
...................
Список состоящий из одного элемента выглядит так.
однонаправленный
1й элемент -> null

двунаправленный
null <- 1й элемент -> null
ибо каждый элемент списка имеет ссылку на следующий (и на предыдущий, если список двунаправленный)
значит в списке с одним элементом
Pascal
1
S^.next = null// почему next ?? - смотри описание структуры постом выше
следоваетельно можно сделать так
Pascal
1
2
3
4
5
6
7
var P: real;
//....... 
P:=1 // присваиваем произведению 1 чтоб при перемножении на первый эл-т списка получился тот же ел-т.
repeat // начало цикла
P:=P*S^.data; // здесь считается произведение
S:=S^.next; // здесь S, указатель на эл-т списка, переходит к следующему элементу.
until S=null; // когда он станет равным nill - не существующий элемент, т.е. выйдет за пределы списка - цикл остановится.
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
18.02.2009, 11:54  [ТС] #12
попытаюсь разобраться,а насчет списков я работала с ними,но мне они очень тяжело даються,поэтому,если что я буду консультироваться
0
Xentar
Of Wolf and Man
993 / 188 / 5
Регистрация: 09.07.2008
Сообщений: 1,778
19.02.2009, 12:12 #13
Ты представь что у тебя есть несколько пронумерованных полочек, в каждом по три ящичка.
В первом лежит бумажка с номером предыдущей полки
Во втором какая то цифра ( данные ) (может быть даж деньги)
В третьем номер следующей полки.

У тебя в руках есть номер первой полки.

Влезаешь в средний ящичек с надписью данные и берешь бумажку - читаешь.
Дальше залезаешь в ящичек с надписью "следующая полка" и узнаешь с какой следующей полки надо прочитать данные

В качестве указателя (S - у меня в посте выше) - будешь ты сама - беря бумажку из ящичка "next" (следующий) - ты переходишь к следующей полке.
Pascal
1
S:=S^.next;
В принципе вот. примерно так, если брать аналогию из реальной жизни
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
19.02.2009, 13:53  [ТС] #14
а что значит "Разбиение n-го подсписка на два подсписка отличающихся не более, чем на один элемент."
Это типа два подсписка только один больше другого на один элемент,так что ль или 2 одинаковых подсписка,только 1 элемент разный?
0
Xentar
Of Wolf and Man
993 / 188 / 5
Регистрация: 09.07.2008
Сообщений: 1,778
19.02.2009, 15:57 #15
Эту фразу можно интерпретировать по разному....
1. у тебя будет 2 одинаковых по длинне списка один в один, только один из эл-тов будет разный.
2. второй список будет на 1 эл-т больше первого, или наоборот

Сделай как нибудь, если придерутся переделай.
Или сразу пытай препода, на предмет того что он(она) имел(а) ввиду.
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
19.02.2009, 17:30  [ТС] #16
кстати,может совместить эти 2 варианта?
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
20.02.2009, 19:39  [ТС] #17
подскажите плиз алгоритм как разбить подсписок на 2 подсписка?

Добавлено через 1 час 41 минуту 30 секунд
и алгоритм нахождения кол-ва элементов в n-ом подсписке?
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
20.02.2009, 22:27 #18
Цитата Сообщение от Дашустрик Посмотреть сообщение
и алгоритм нахождения кол-ва элементов в n-ом подсписке?
Ну если Вы задаёте такой вопрос, то получается вы ещё не совсем понимаете структуру списка, у него есть особенность его последний элемент указывает на nil, а это можно использовать, делайте цикл
Код
 kol:=0;
 while указатель<>nil do
 begin
  inc(kol);
  указатель:=указатель_на_следующий_элемент
 end;
На выходе kol=количеству_элементов
З.Ы. и да, не забудьте стать в начало подсписка, т.е. наш "указатель" В начале должен стоять на самом первом элементе
0
Дашустрик
Дашики
7 / 7 / 1
Регистрация: 26.09.2008
Сообщений: 477
22.02.2009, 03:30  [ТС] #19
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Код
 kol:=0;
 while указатель<>nil do
 begin
  inc(kol);
  указатель:=указатель_на_следующий_элемент
 end;
На выходе kol=количеству_элементов
З.Ы. и да, не забудьте стать в начало подсписка, т.е. наш "указатель" В начале должен стоять на самом первом элементе
только по условию вместо указателя вписать ключ k?
а как быть с разбиением подсписка на 2,с отличающимся 1 элементом,я честно не очень понимаю?
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
22.02.2009, 16:20 #20
Цитата Сообщение от Дашустрик Посмотреть сообщение
только по условию вместо указателя вписать ключ k?
Нет, я вам привёл алгоритм нахождения количества элементов в списке, а вам же нужно после какого-то элемента с ключом К, тогда пишем так
Код
 while (указатель<>nil) or (указатель.data<>K) do
  указатель:=указатель_на_следующий_элемент;
{После такой операции наш указатель стоит на элементе с информационной частью К}
{Ну а теперь до конца считаем...}
 kol:=0;
 while указатель_на_след_элем<>nil do {обычно указатель.next<>nil do}
 begin
  inc(kol);
  указатель:=указатель_на_следующий_элемент
 end;
0
22.02.2009, 16:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2009, 16:20
Привет! Вот еще темы с решениями:

Двунаправленный линейный список. Не могу найти ошибку
Программа, которая выполняет следующие операции с двунаправленным линейным...

Кольцевой двунаправленный список: удалить все элементы, у которых одинаковые соседи
Дан кольцевой двунаправленный список. Из списка L удалить все элементы у...

Дано два однонаправленных списка целых чисел. Увеличить все элементы с четным количеством цифр из первого спис
Дано два однонаправленных списка целых чисел. Увеличить все элементы с четным...

Из составного списка сделать простой список, освобождая исходный список от подсписков
Задание Напишите программу, которая из составного списка делает простой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru