Помощь - Поиск - Пользователи - Календарь
Полная версия: разделить список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Rabbit
Разделить упорядоченный список на два по отношению к заданному ключу: ( < и >= ) и отпечатать полученные списки.
Вот как я сделала, но опять же не работает:


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);

volvo
Во-первых, опять же:
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 больше или равно ключу)...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.