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

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

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

 
 Ответить  Открыть новую тему 
> разделить список
сообщение
Сообщение #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);

 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 27.10.2020 11:32
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name