UTNianos

Versión completa: [Algortimos]Procedimiento Inserta Nodo por Dos Campos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Bueno, eso. Alguno tiene una imagen o un copy-past del codigo en pascal o en diagrama de este procedimiento de la cátedra?
Lo necesitaria para antes del sábado, si me hacen la gauchada
Gracias che =)
Es lo mismo que con un solo campo, solo que le tenés que agregar una condición más para el otro. Quizá viste otro insertaNodo, esta es la versión de Alejandro Frankel , esta buena, no tiene ifs anidados.


procedure InsertaNodo(var lista:tlista;info:tinfo)
var nuevo,ant,aux:tlista;
begin
new(nuevo);
nuevo^.info:=info;
aux:=lista;
while( (aux<>nil) AND (aux^.info.campo1<info.campo1) AND (aux^.info.campo2<info.campo2) ) do
begin
ant:=aux;
aux:=aux^.sig
end;


/*el siguiente al nuevo nodo siempre va a ser aux, por mas que este sea NIL*/
nuevo^.sig:=aux;


/*Si aux es igual a lista, es decir, es el primer nodo o la lista esta vacía, entonces el nuevo nodo va a ir primero, sino va después de lo que esté antes de aux.*/

if(aux=lista) then lista:=nuevo else ant^.sig:=nuevo;

end.





Yo también doy el final el sábado.
(08-12-2010 20:53)Anirus escribió: [ -> ]Es lo mismo que con un solo campo, solo que le tenés que agregar una condición más para el otro. Quizá viste otro insertaNodo, esta es la versión de Alejandro Frankel , esta buena, no tiene ifs anidados.


procedure InsertaNodo(var lista:tlista;info:tinfo)
var nuevo,ant,aux:tlista;
begin
new(nuevo);
nuevo^.info:=info;
aux:=lista;
while( (aux<>nil) AND (aux^.info.campo1<info.campo1) AND (aux^.info.campo2<info.campo2) ) do begin
ant:=aux;
aux:=aux^.sig
end;
nuevo^.sig:=aux;
if(aux=lista) then lista:=nuevo else ant^.sig:=nuevo;
end.





Yo también doy el final el sábado.

Sisis uso la de frankel yo tambien, es genial =P
bueno ahora me las "ingenio" y de ultima lo subo a ver si le sirve a alguien
gracias =D
che,una cosa:
puede ser q en tu codigo

procedure InsertaNodo(var lista:tlista;info:tinfo)
var nuevo,ant,aux:tlista;
begin
new(nuevo);
nuevo^.info:=info;
aux:=lista;
while( (aux<>nil) AND (aux^.info.campo1<info.campo1) AND (aux^.info.campo2<info.campo2) ) do begin
ant:=aux;
aux:=aux^.sig
end;
nuevo^.sig:=aux;
if(aux=lista) then lista:=nuevo else ant^.sig:=nuevo;
end.



la parte de

while( (aux<>nil) AND (aux^.info.campo1<info.campo1) AND (aux^.info.campo2<info.campo2) ) do begin



puede ser que sea??
while( (aux<>nil) AND ((aux^.info.campo1<info.campo1) OR (aux^.info.campo1=info.campo1) )AND (aux^.info.campo2<info.campo2) ) do begin[/code]


es decir que cuando agregue se fije en el priemr campo qeu sea menor O IGUAL

porque hice una prueba de escritorio y de esa forma funcionaria si por ejemplo tenemos una lista con nodos de dos campos y si estos son

1 | 1
1 | 4
2 | 2

y quiero agregar uno que sea 1|3
si es con mayor lo agregaria atras del 1|1 pero si fuera mayor igual lo agregaria bien

espero haber sido claro jje
Qué bueno que te diste cuenta, yo estaba convencida de que era así y me estaba acordando mal xD, igual me parece que ahora están mal los paréntesis, porque en cuanto el segundo campo fuera menor, no se cumpliria la condicion, sin importar si el primero es mayor o no.
1 | 1
1 | 2
1 | 3
1 | 4
2 | 3

Si quiero agregar 2|2 al pasar por el tercer nodo, hay una parte que no se cumple:
while( (aux<>nil) AND ((aux^.info.campo1<info.campo1) OR (aux^.info.campo1=info.campo1) )AND (aux^.info.campo2<info.campo2) )
Entonces queda while( V & (V v F) & F) y se sale del ciclo y lo pondría así:

1 | 1
1 | 2
2 | 2
1 | 3
1 | 4
2 | 3




Me parece que era así, que solo se fije lo del segundo campo cuando el 1ro es igual:


while( (aux<>nil) AND ( (aux^.info.campo1<info.campo1) OR ((aux^.info.campo1=info.campo1)AND (aux^.info.campo2<info.campo2)) ) )do begin


GENIAL
lo estoy probrando con distintos datos andan todos! te mereces un punto mas en la reputacion =D
(09-12-2010 01:45)Teteban escribió: [ -> ]GENIAL
lo estoy probrando con distintos datos andan todos! te mereces un punto mas en la reputacion =D

O uno menos por mandarme una burrada en la primera respuesta xD por suerte revisás las cosas.
(08-12-2010 21:02)Anirus escribió: [ -> ]Para el final del sabado pasado había (o al menos lo resolví así) que ordenar una lista por el resultado de la suma de dos de sus campos, es lo mismo pero haciendo (aux^.info.campo1 + aux^.info.campo2)< (info.campo1 + info.campo2)
(solo que iba > porque era descendiente)

No intentes resolver el final pensando en eso que lei mal esa parte del enunciado y pensé que en la lista iba la suma de los extranjeros en vez de los del 2009.
URLs de referencia