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

 



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