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

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

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

> разделить список
Rabbit
сообщение 27.05.2007 14:55
Сообщение #1


Гость






Разделить упорядоченный список на два по отношению к заданному ключу: ( < и >= ) и отпечатать полученные списки.
Вот как я сделала, но опять же не работает:


PROCEDURE DIVIDE (FIRST2,FIRST3:EL);
TYPE
MAS1=ARRAY[1..100] OF INTEGER;
TMAS1=^MAS1;
MAS2=ARRAY[1..100] OF STRING;
TMAS2=^MAS2;
VAR
Z1,Z3:TMAS1;
Z2,Z4: TMAS2;
OK: BOOLEAN;
X,K1,K2: INTEGER;
R: EL;
BEGIN
NEW(Z1);
NEW(Z2);
print;
writeln ('Vvedite znachenie kluchevogo priznaka');
readln(x);
r:= first;
ok:= true;
while (r<>nil) and ok do
if r^.inf1=x then begin
q:=r ;
ok:= false;
end
else r:=r^.Next;
if ok=true
then begin
writeln (' takogo el net' );
Exit;
end;
P:=FIRST;
K1:=0; K2:=0;
WHILE P<> NIL
DO BEGIN
IF P^.INF1<Q^.INF1
THEN BEGIN
INC(K1);
Z1^[K1]:=P^.INF1;
Z2^[K1]:=P^.INF2;
END
ELSE BEGIN
INC(K2);
Z3^[K2]:=P^.INF1;
Z4^[K2]:=P^.INF2;
END;
END;
Q:=NIL;
FIRST1:=NIL;
FOR I:=1 TO K1 DO
BEGIN
new(p);
if first1=nil then first1:=p;
p^.inf1:=Z1^[i];
p^.inf2:=Z2^[i];
if q<>nil then q^.next:=p;
q:=p;
end;
p^.next:=nil;
print;
WRITELN('NAGMITE ENTER');
READLN;
Q:=NIL;
FIRST2:=NIL;
FOR I:=1 TO K2 DO
BEGIN
new(p);
if first1=nil then first2:=p;
p^.inf1:=Z3^[i];
p^.inf2:=Z4^[i];
if q<>nil then q^.next:=p;
q:=p;
end;
p^.next:=nil;
print;
END;

вызов: divide(FIRST2,FIRST1);

 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 1)
volvo
сообщение 27.05.2007 16:22
Сообщение #2


Гость






Во-первых, опять же:
PROCEDURE DIVIDE (var FIRST2,FIRST3:EL);

, тебе же надо вернуть указатели на первый и второй список в вызывающую программу... А во-вторых, вот этого:

...
print;
writeln ('Vvedite znachenie kluchevogo priznaka');
readln(x);
r:= first; prev := nil;
ok:= true;
while (r<>nil) and ok do
if r^.inf1=x then begin
q:=r;
ok:= false;
end
else begin
if (r^.next <> nil) and (r^.next^.inf1 = x) then prev := r;
r:=r^.Next;
end;

if ok=true then begin
writeln (' takogo el net' ); Exit;
end;

if prev = nil then first2 := nil
else begin
first 2 := first;
prev^.next := nil;
end;
first3 := q;
...
(по-моему, нигде не ошибся, набирал прямо здесь) должно хватить, чтобы first2 указывал на первую часть списка - ту, в которой значения inf1 меньше ключа, а first3 - на вторую (где inf1 больше или равно ключу)...

Сообщение отредактировано: volvo - 27.05.2007 16:45
 К началу страницы 
+ Ответить 

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

 



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