IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Однонаправленный список, вхождение одного списка в другой
Boxer
сообщение 18.12.2010 2:31
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской

Репутация: -  0  +


Доброго времени суток!
Пишу функцию, входит ли список L1 в список L2

я пишу если 1й эл списка L1 равен i-ому эл списка L2, то запускаю массив while L1^.next<>nil do {а вот тут-то и вопрос! я хочу записать: сравниваем 2й и последующие эл списка L1 с i+1, i+2... эл списка L2, как это записать я не знаю =( }
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 19.12.2010 2:25
Сообщение #2


Гость






Цитата
может произойти просто взрыв мозга!
Ничего тут произойти не может, твой код даже компилироваться не будет...

Цитата
я дописал этот код
Во-первых, ты не дописал, а переписал код (это два совершенно разных слова, заметь). Зачем понадобилось в тот код, что я показал, вносить изменения, причем совершенно ненужные? Я ж сказал, что приведенный фрагмент работает. Надо было только оформить его функцией, и правильно написать получение списка от пользователя. Вот, смотри:
type
telem = integer;

TList=^list;
List =
record
item:TElem;
Next:TList;
end;

Procedure creation(Var L:TList);
Var
x, last :TList;
Inf: TElem;
Begin
L := Nil; last := nil;
Writeln ('Введите элементы списка.');
while not eoln do
begin
read(inf);
new(x);
x^.next:=nil;
x^.item:=inf;
if L = nil then L := x
else last^.next := x;
Last := x;
end;
readln;
Writeln;
End;

procedure Print(L: TList);
begin
while l<>nil do
begin
write(l^.item:3);
l:=l^.next;
end;
writeln;
end;

function Search(L1_start, L2_start: tlist): boolean;
var
L2, curr_L1,curr_L2:TList;
begin
search := False;
if (L1_start<>nil) and (L2_start<>nil) then
begin
L2 := L2_start;
while L2 <> nil do
begin
if L1_start^.item = L2^.item then
begin
curr_L1 := L1_start^.next;
curr_L2 := L2^.next;
while (curr_L1 <> nil) and (curr_L1 <> nil) and (curr_L1^.item = curr_L2^.item) do
begin
curr_L1 := curr_L1^.next;
curr_L2 := curr_L2^.next;
end;
if curr_L1 = nil then
begin
Search := true;
write('found: ');
print(L2);
end;
end;
L2 := L2^.next;
end;
end;
end;

var L1, L2: tlist;
begin
L1 := nil; L2 := nil;
write('Please enter list L1: '); creation(L1);
write('Please enter list L2: '); creation(L2);
write('L1: '); print(L1);
write('L2: '); print(L2);
if not Search(L1, L2) then
begin
writeln('not found');
end;
readln;
end.


Please enter list L1: Введите элементы списка.
2 3 4

Please enter list L2: Введите элементы списка.
1 2 2 3 2 3 4 5

L1: 2 3 4

L2: 1 2 2 3 2 3 4 5

found: 2 3 4 5

Не надо никаких точек как признака окончания ввода, есть функция Eoln, которая понимает, когда закончилась строка.

Во вторых, в следующий раз пытайся хотя бы откомпилировать программу, и исправить те ошибки на которые указывает компилятор. О неописанном типе, о несуществующих переменных, например.

Ну, и в третьих: программа еще не закончена. Добавляй код удаления списков... Без него ни один уважающий себя преподаватель программу не примет. Работодатель - тем более...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 12.08.2025 5:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"