Duplicar nodos múltiplos de 5 en una lista enlazada en C

Informática y Telecomunicaciones4,37 KB

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

Descargar

PDF Word HTML