TDA Lista de enteros IV

TDA Lista de enteros IV

Esta cuarta parte de la serie dedicada a la implementación de una lista de enteros la dedicaremos al procedimiento de sacar un elemento de la lista.

De nuevo, tras hacer las comprobaciones previas de si la lista existe, deberemos considerar la forma de sacar un elemento dependiendo si está al principio de la lista, al final o señalado por el puntero marcador. Veamos el código.

void lista_saca ( lista c, struct l_enteros *e, int donde ) {
	
	l_lst viejo, corr;
	
	if ( !c ) {
		fprintf ( stderr, "lista_saca: la lista no existe\n" );
		exit ( 1);
	}
	
	if ( !c->tam ) {
		fprintf ( stderr, "lista_saca: lista vacía\n" );
		exit ( 1);
	}
	
	if ( donde < 0 ) {
	
		viejo = c->prim;
		if  ( c->prim != c->ulti ) {
			
			if( c->prim==c->nodo ) c->nodo = c->nodo->sig;
			else c->indnodo--;
			c->tam--;
			c->prim = c->prim->sig;
			
		} else {
			
			c->ulti = c->prim = c->nodo = NULL;
			c->tam = c->indnodo = 0;
			
		}
	
	} else if ( donde > 0 ) {
	
		viejo = c->ulti;
		if ( c->prim != c->ulti ) {
		
			if ( c->ulti == c->nodo ) {
				l_marc( c, c->tam-1 );
				corr = corr->nodo;
		
			}
			else for ( corr=corr->nodo; cor->sig != c->ulti; corr=corr->sig );
			
			c->ulti = corr;
			cor->sig = NULL;
			c->tam--;
		}
	
	}
	
	else {
	
		corr->ulti = corr->prim = corr->nodo = NULL;
		c->tam = c->indnodo = o;
	
	}
	
	else {
	
		if ( !c->nodo )  {
			frprintf ( stderr, "lista_saca: no hay nada marcado.\n" );
			exit (1);
		}
		
		viejo = c->nodo;
		if ( c->prim == c->ulti ) {
			c->ulti = c->prim = c->nodo = NULL;
			c->tam = c->indnodo = 0;
		}
		
		else {
		
			c->tam--;
			if ( c->prim == c->nodo ) c->prim  = c->nodo = c->nodo->sig;
			else if ( c->ulti == c->nodo ) {
				l_marc ( c, c->tam );
				corr = c->nodo;
				c->ulti = corr;
				corr->sig = NULL;
			}
			else {
				for ( corr= c->prim; cor->sig!c->nodo; corr=corr->sig )
					c->nodo = corr->sig =  c->nodo->sig;
			}
			
		}	
		
	}
	
	*e = viejo->val;
	free ( viejo );
	
}

Me gustaría solicitaros que dejéis en la sección de comentarios vuestra opinión y aportaciones sobre la forma de hacer este procedimiento y las posibles alternativas que existen.

No Comments

Post a Comment