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

Menu para listas enlazadas simples

Estas en el tema de Menu para listas enlazadas simples en el foro de C/C++ en Foros del Web. Necesito ayuda con un trabajo para la universidad, necesito elegir 3 listas enlazadas simples, y en un menu tengo que Insertar y Eliminar nodos, Mostrar ...
  #1 (permalink)  
Antiguo 19/10/2015, 18:26
 
Fecha de Ingreso: octubre-2015
Mensajes: 2
Antigüedad: 9 años
Puntos: 0
Menu para listas enlazadas simples

Necesito ayuda con un trabajo para la universidad, necesito elegir 3 listas enlazadas simples, y en un menu tengo que Insertar y Eliminar nodos, Mostrar o eliminar listas, contar nodos de la lista, comparar si las listas son identicas, similares, o si una esta contenida en las otras, ordenar una lista... aquí esta el codigo que me he intentado hacer durante el dia
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
typedef struct _nodo {
int valor;
struct _nodo *siguiente;
} tipoNodo;

typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;

void Insertar(Lista *l, int v);
void Borrar(Lista *l, int v);

int ListaVacia(Lista l);

void BorrarLista(Lista *);
void MostrarLista(Lista l);


int main()
{
Lista lista1 = NULL;
Lista lista2 = NULL;
Lista lista3 = NULL;
pNodo p;

int opc,n,v;
do{
printf("Menu\n");
printf("1. Si Desea Instertar Nodos\n");
printf("2. Si Desea Eliminar Un Nodo\n");
printf("3. Si Desea Mostrar Una Lista\n");
printf("4. Si Desea Eliminar Una Lista\n");
printf("5. Si Desea Contar los Nodos de la Lista\n");

scanf("%d",&opc);
switch(opc)
{
case 1:
printf("En Que Lista Desea Ingresar Nodos\n");
scanf("%d",&opc);
switch(opc)
{
case 1: printf("Lista 1:Que Numero Desea Ingresar\n");
scanf("%d", &v);
Insertar(&lista1,v);
break;
case 2: printf("Lista 2:Que Numero Desea Ingresar\n");
scanf("%d", &v);
Insertar(&lista2,v);
break;
case 3: printf("Lista 3:Que Numero Desea Ingresar\n");
scanf("%d", &v);
Insertar(&lista3,v);
break;
default:
break;
}
break;
case 2:

printf("En Que Lista Desea Eliminar Nodos\n");
scanf("%d",&opc);
switch(opc)
{
case 1: printf("Que Numero Desea Eliminar\n");
scanf("%d", &v);
Borrar(&lista1,v);
break;
case 2: printf("Que Numero Desea Eliminar\n");
scanf("%d", &v);
Borrar(&lista2,v);
break;
case 3: printf("Que Numero Desea Eliminar\n");
scanf("%d", &v);
Borrar(&lista3,v);
break;
default:
break;
}

break;

case 3: printf("Que Lista Desea Mostrar?\n");
printf("Lista 1\n");
printf("Lista 2\n");
printf("Lista 3\n");
scanf("%d",&v);
switch(opc)
{
case 1: MostrarLista(lista1);
break;
case 2: MostrarLista(lista2);
break;
case 3: MostrarLista(lista3);
break;
default:
break;
}
break;


case 4:

break;
case 5:
break;
case 6:
break;


default:

break;
}


Insertar(&lista1, 10);
Insertar(&lista1, 20);
Insertar(&lista1, 30);
Insertar(&lista1, 40);


Insertar(&lista2, 100);
Insertar(&lista2, 200);
Insertar(&lista2, 300);
Insertar(&lista2, 400);


Insertar(&lista3, 1000);
Insertar(&lista3, 2000);
Insertar(&lista3, 3000);
Insertar(&lista3, 4000);



}while (opc!=0);
system("PAUSE");
return 0;


getch();
}

void Insertar(Lista *lista, int v)
{
pNodo nuevo, anterior;


nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;


if(ListaVacia(*lista) ) {

nuevo->siguiente = *lista;

*lista = nuevo;
}
else {

anterior = *lista;

while(anterior->siguiente)
anterior = anterior->siguiente;

nuevo->siguiente = anterior->siguiente;
anterior->siguiente = nuevo;
}
}

void Borrar(Lista *lista, int v)
{
pNodo anterior, nodo;

nodo = *lista;
anterior = NULL;
while(nodo && nodo->valor < v) {
anterior = nodo;
nodo = nodo->siguiente;
}
if(!nodo || nodo->valor != v) return;
else {
if(!anterior)
*lista = nodo->siguiente;
else
anterior->siguiente = nodo->siguiente;
free(nodo);
}
}

int ListaVacia(Lista lista)
{
return (lista == NULL);
}

void BorrarLista(Lista *lista)
{
pNodo nodo;

while(*lista) {
nodo = *lista;
*lista = nodo->siguiente;
free(nodo);
}
}

void MostrarLista(Lista lista)
{
pNodo nodo = lista;

if(ListaVacia(lista)) printf("Lista vacía\n");
else {
while(nodo) {
printf("%d -> ", nodo->valor);
nodo = nodo->siguiente;
}
printf("\n");
}
}
  #2 (permalink)  
Antiguo 20/10/2015, 03:26
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Menu para listas enlazadas simples

Bienvenido al foro.

[modo_profesor=on]

En la función Insertar, la asignación:

Código C:
Ver original
  1. if(ListaVacia(*lista) ) {
  2.   nuevo->siguiente = *lista;

Es rara, ya que *lista es NULL, estas obviedades es mejor indicarlas de forma explícita, ya que el código será más fácil de leer... no tendrás que deducir el valor de *lista aunque este sea obvio:

Código C:
Ver original
  1. nuevo->siguiente = NULL;

En cualquier caso, este problema se puede evitar si a la hora de reservar memoria para el nuevo nodo llamas a calloc en vez de a malloc. La diferencia entre ambas funciones es que calloc pone a 0 todos los bytes de la memoria reservada, por lo que cualquier puntero que se encuentre en la estructura recién creada apuntará automáticamente a NULL.

Seguimos en InsertarLista

Código C:
Ver original
  1. while(anterior->siguiente)
  2.       anterior = anterior->siguiente;
  3.    
  4.     nuevo->siguiente = anterior->siguiente;
  5.     anterior->siguiente = nuevo;

Según este código, el while se repetirá hasta que anterior->siguiente es NULL, cierto? no te parece entonces que a esta línea:

Código C:
Ver original
  1. nuevo->siguiente = anterior->siguiente;

Le pasa lo mismo que hemos comentado hace un momento?

Las líneas de código que no son necesarias es mejor eliminarlas cuanto antes.

Nota: Por cierto, estaría genial que comprobases que las reservas de memoria se hacen correctamente. Esto lo puedes conseguir comprobando que el puntero ha dejado de apuntar a NULL después de llamar a malloc.

No corras que aún no hemos terminado con esta función, queda una cosa más y es la más importante: Si se supone que la lista tiene que ser ordenada... por qué añades los nuevos nodos SIEMPRE al final? No deberías tener en cuenta también el valor de cada nodo? Para esta parte no te pongo código, es bastante importante que lo medites primero y saques tus propias conclusiones.

Pasamos a Borrar

Código C:
Ver original
  1. if(!nodo || nodo->valor != v) return;
  2.   else {
  3.     if(!anterior)
  4.       *lista = nodo->siguiente;
  5.     else
  6.       anterior->siguiente = nodo->siguiente;
  7.     free(nodo);
  8.   }

Un detalle sobre legibilidad... ese if es un poco raro... si inviertes la condición te puedes ahorrar el return y consigues un código más fácil de leer:

Código C:
Ver original
  1. if(nodo && nodo->valor == v)
  2.   {
  3.     if(!anterior)
  4.       *lista = nodo->siguiente;
  5.     else
  6.       anterior->siguiente = nodo->siguiente;
  7.     free(nodo);
  8.   }

Vale, ahora retrocedamos al main...

Código C:
Ver original
  1. case 3: printf("Que Lista Desea Mostrar?\n");
  2.         // printf("Lista 1\n");
  3.         // printf("Lista 2\n");
  4.         // printf("Lista 3\n");
  5.         scanf("%d",&v);
  6.         switch(opc)
  7.         {
  8.         }
  9.         break;

No ves nada raro ahí? Estás almacenando la opción del usuario en v y, sin embargo estás mostrando una lista basándote en opc

Y para terminar... añade por favor una opción para salir del programa... y no te olvides en este caso borrar todas las listas!!!! Es bueno acostumbrarse a no dejar fugas de memoria en nuestros programas.

Un saludo
  #3 (permalink)  
Antiguo 24/10/2015, 14:57
 
Fecha de Ingreso: octubre-2015
Mensajes: 2
Antigüedad: 9 años
Puntos: 0
Respuesta: Menu para listas enlazadas simples

Gracias por las aclaraciones y las ayudas jajajaj, ahora una duda, como puedo dejar definidas las 3 listas y a ellas instertar, borrar nodos?
  #4 (permalink)  
Antiguo 26/10/2015, 03:04
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Menu para listas enlazadas simples

Tu función Insertar más o menos hace lo que estás pidiendo, únicamente tienes que corregir lo que te he comentado en el mensaje anterior.

Tu inicialmente partes de una lista vacía, esto es:

Código C:
Ver original
  1. Lista lista1 = NULL;

Cuando llamas a Insertar, la función debe detectar que la lista está vacía y sustituir el puntero de la lista, que apunta a NULL, por el puntero al nodo que estás creando en ese momento.

Si la lista no está vacía, entonces tendrás que localizar el punto exacto donde insertar el nuevo nodo... hay que tener en cuenta que si la posición del nuevo nodo es al principio de la lista hay que modificar el puntero de la lista para que se entere de que su primer nodo es otro.

Etiquetas: enlazadas, int, listas, numero, simples
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 19:36.