Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Unir dos listas enlazadas en otra lista

Estas en el tema de Unir dos listas enlazadas en otra lista en el foro de C/C++ en Foros del Web. Bueno el problema que tengo es que no introduce bien las listas en la otra nueva, la idea que tuve es introducir la primera lista ...
  #1 (permalink)  
Antiguo 27/05/2010, 13:42
 
Fecha de Ingreso: mayo-2010
Mensajes: 3
Antigüedad: 14 años
Puntos: 0
Unir dos listas enlazadas en otra lista

Bueno el problema que tengo es que no introduce bien las listas en la otra nueva, la idea que tuve es introducir la primera lista enlazada en la nueva al estar ya ordenada, seria meterla nodo por nodo. Luego al estar ya introducida seria introducir la segunda comprobando los numeros para introducir el nodo en su lugar.

Lo que el programa no hace bien esque solo entra una vez en el primer bucle while(resaltado en rojo), y el caso esque la lista no esta vacia, porque introduzco varios numeros y si la muestro por pantalla los numeros si que estan y no apunta a NULL.

Si alguno encuentra el error se lo agradecere mucho, porque me esta sacando loco este programa. Gracias



Código:
#include <stdio.h>
#include <stdlib.h>
struct elemento
{
	int dato;
	struct elemento * sig;
};

void crear(struct elemento **lista);
void InsertaOrdenada(struct elemento **lista, int elemento);
void MuestraOrdenada(struct elemento *lista);
void JuntarListas(struct elemento **listaU, struct elemento **list1, struct elemento **list2);
int BuscarElemento(struct elemento **lista, int elemento);

main()
{
int opcion,x;
struct elemento *lista1, *lista2, *lista_unida;
crear(&lista1);
crear(&lista2);
crear(&lista_unida);

	do{
   	printf("\n\nMENU OPCIONES LISTA ENLAZADA SIMPLE");
      printf("\n___________________________________________");
		printf("\n\n 1.-Insertar elemento en la lista 1");
      printf("\n 2.-Insertar elemento en la lista 2");
		printf("\n 3.-Unir listas.");
		printf("\n 4.-Listar elementos\n");
		printf("\n 0.-SALIR\n");
		printf("\nIntroduce la opcion: ");
		scanf("%d",&opcion);
		switch(opcion)
      	{
			case 1:  printf("Introduce el elemento que quieras introducir en la lista 1: ");
         			scanf("%d",&x);
         			InsertaOrdenada(&lista1, x);
                  system("cls");
                  break;

			case 2:  printf("Introduce el elemento que quieras introducir en la lista 2: ");
         			scanf("%d",&x);
         			InsertaOrdenada(&lista2, x);
                  system("cls");
                  break;

         case 3:  system("cls");
         			printf("Uniendo listas....\n\n");
                  JuntarListas(&lista_unida,&lista1,&lista2);
                  MuestraOrdenada(lista_unida);

			case 4:  system("cls");
         			MuestraOrdenada(lista1);
                  MuestraOrdenada(lista2);
                  break;
			}

		}
   while(opcion!=0);

system("pause");
}


void crear(struct elemento **lista)
{
	*lista=NULL;
}

void InsertaOrdenada(struct elemento **lista, int elemento)
{
	struct elemento *aux,*ant,*nuevo;
	nuevo=(struct elemento*)malloc(sizeof(struct elemento));

	nuevo->dato=elemento;
   fflush(stdin);
   nuevo->sig=NULL;
   aux=(*lista);
   ant=(*lista);

   if(aux==NULL || aux->dato > nuevo->dato)
   {
   	nuevo->sig=aux;
   	(*lista)=nuevo;
   }
   else
   {
   	while(aux!=NULL && aux->dato < nuevo->dato)
         {
    			ant=aux;
            aux=aux->sig;
         }
      nuevo->sig=aux;
      ant->sig=nuevo;
   }
}

void JuntarListas(struct elemento **listaU, struct elemento **list1, struct elemento **list2)
{
	struct elemento *aux,*ant2,*aux2;

   aux=(*list1);
   aux2=(*listaU);
   ant2=(*listaU);

   while(aux!=NULL)
   {
   	if(aux2==NULL)
      {
      	aux->sig=aux2;
      	(*listaU)=aux;
      }
      else
      {
      	while(aux2!=NULL)
         {
         	ant2=aux2;
            aux2=aux2->sig;
         }
      	aux->sig=aux2;
         ant2->sig=aux;
      }
      aux=aux->sig;
  }
   MuestraOrdenada(*listaU);

   aux=(*list2);

   while(aux!=NULL)
   {
   	aux2=(*listaU);
   	ant2=(*listaU);

   	if(aux2==NULL || aux2->dato > aux->dato)
   	{
   		aux->sig=aux2;
   		(*listaU)=aux;
   	}
   	else
   	{
   		while(aux2!=NULL && aux2->dato < aux->dato)
         	{
    				ant2=aux2;
            	aux2=aux2->sig;
         	}
      	aux->sig=aux2;
      	ant2->sig=aux;
   	}
      aux=aux->sig;
   }

}

void MuestraOrdenada(struct elemento *lista)
{
	struct elemento *aux;
	int i=1;
   if(lista==NULL)
   {
   	printf("No se ha encontrado ningun elemento en la lista\n\n");
   }
   else
   {

		aux=lista;
		while(aux)
   	{
			printf("\nElemento %d: %d",i,aux->dato);
			aux=aux->sig;
      	i++;
		}
   	printf("\n\n");
   }
}

Etiquetas: dos, lista, listas, unir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:15.