Duplicar nodos múltiplos de 5 en una lista enlazada en C
Sea una lista simplemente enlazada en la que los nodos están definidos de la siguiente manera:
struct nodo {
int dato;
struct nodo* sgte;
};Realizar un procedimiento que duplique, al principio de la lista, todos los nodos cuyo dato sea múltiplo de 5.
Ejemplo:
Si la lista original es:
|->|2|->|5|->|3|->|6|->|10|->|1|->|5|->|X|
la lista al final quedaría:
|->|5|->|10|->|5|->|2|->|5|->|3|->|6|->|10|->|1|->|5|->|X|
Código en C
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N_NODOS 15
/* Definición de las estructuras de la lista */
struct nodo {
int dato;
struct nodo *sgte;
};
typedef struct nodo TNodo;
typedef struct nodo* TLista;
/*-------------------------------------------------------------------------*/
void inicializa_lista( TLista *lista )
/* Rellena la lista con N_NODOS */
{
int i;
TNodo *pNodo = NULL;
TNodo *aux = NULL;
for(i=0; i<N_NODOS; i++) {
pNodo = (TNodo*) malloc( sizeof(TNodo) );
if( pNodo!=NULL ) {
pNodo->dato = i;
pNodo->sgte = NULL;
if( *lista==NULL ) /* La lista está vacía */
*lista = pNodo;
else /* La lista no está vacía */
{
/* Buscamos el último nodo y añadimos el nuevo nodo después de ese */
aux = *lista;
while( aux->sgte!=NULL )
aux = aux->sgte;
aux->sgte = pNodo;
}
}
}
}
/*-------------------------------------------------------------------------*/
void imprime_lista( TLista lista )
/* Imprime la lista por pantalla */
{
TNodo *aux = NULL;
printf( "\n|->" );
aux = lista;
while( aux!=NULL ) {
printf( "|%d|->", aux->dato );
aux = aux->sgte;
}
printf( "|X|\n" );
}
/*-------------------------------------------------------------------------*/
void duplica_nodos( TLista *lista )
/* Solución del problema */
{
TLista lista_aux = NULL;
TNodo *aux = NULL, *aux2 = NULL;
TNodo *copia = NULL;
aux = *lista;
while( aux!=NULL ) {
if( aux->dato%5==0 ) {
copia = (TNodo*) malloc( sizeof(TNodo) );
if( copia!=NULL ) {
copia->dato = aux->dato;
copia->sgte = NULL;
if( lista_aux==NULL ) /* Si la lista auxiliar está vacía */
lista_aux = copia;
else /* Si la lista auxiliar no está vacía */
{
aux2 = lista_aux;
while( aux2->sgte!=NULL )
aux2 = aux2->sgte;
aux2->sgte = copia;
}
}
}
aux = aux->sgte;
}
/* Finalmente enganchamos la lista original a la lista auxiliar */
aux = lista_aux;
while( aux->sgte!=NULL )
aux = aux->sgte;
aux->sgte = *lista;
*lista = lista_aux;
}
/*-------------------------------------------------------------------------*/
int main()
{
TLista lista = NULL;
inicializa_lista( &lista );
imprime_lista( lista );
duplica_nodos( &lista );
imprime_lista( lista );
getch();
}