Lista enlazada simple – listas ligadas [C]

Iniciado por DanielPy, 9 Junio 2015, 02:12 AM

0 Miembros y 1 Visitante están viendo este tema.

DanielPy

Hola gente.
Como verán estoy tratando de interpretar las listas ligadas y les aseguro que en 10 días tan sólo pude construir este pequeño programa, lo que me falta saber que es más conveniente, declarar las variables estructura cómo globales o dentro la función principal y pasarlas como parámetro a las funciones.-
Por último necesitaría que alguien me ayude a construir la función borrar_elemento, no pude poner ninguna línea.-

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

struct _agenda{
char nombre[30];
char telefono[12];
struct _agenda *siguiente;
};

struct _agenda *primero, *ultimo;

void mostrar_menu();
void agregar_elemento();
void mostrar_lista();

int main(void){
char opcion, ch;

primero = (struct _agenda *) NULL;
ultimo = (struct _agenda *) NULL;
do{
mostrar_menu();
opcion = getchar();
while((ch = getchar()) != EOF && ch != '\n');
switch ( opcion ){
case '1': agregar_elemento();
break;
case '2':  printf("No disponible todavía!\n");
break;
case '3': mostrar_lista(primero);
break;
case '4': exit( 1 );
default: printf( "Opción no válida\n" );
break;
}
} while (opcion!='4');

getchar();
return 0;
}

void mostrar_menu(){
system( "CLS" );
printf( "\n\n ===== Menu =====" );
printf( "\n 1 - Agregar elemento" );
printf( "\n 2 - Borrar elemento" );
printf( "\n 3 - Mostrar elementos" );
printf( "\n 4 - Salir" );

printf("\n\n Escoge una opcion......: ");
}

/* Con esta función añadimos un elemento al final de la lista */
void agregar_elemento(){
struct _agenda *nuevo;

/* reservamos memoria para el nuevo elemento */
nuevo = (struct _agenda *) malloc (sizeof(struct _agenda));
if( nuevo == NULL){
printf(" \n No hay memoria disponible");
}
printf( "\n ===== Nuevo elemento =====" );
printf( "\n Nombre.....:" );
gets( nuevo->nombre );
printf( "\n Telefono...:" );
gets( nuevo->telefono );

/* el campo siguiente va a ser NULL por ser el último elemento*/
nuevo->siguiente = NULL;

/* ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista */
/* comprobamos si la lista está vacía. si primero==NULL es que no
         hay ningún elemento en la lista. también vale ultimo==NULL */
if( primero == NULL ){
printf( "\n Primer elemento" );
primero = nuevo;
ultimo  = nuevo;
}else{
/* el que hasta ahora era el último tiene que apuntar al nuevo */
ultimo->siguiente = nuevo;
/* hacemos que el nuevo sea ahora el último */
ultimo = nuevo;
}
}

void mostrar_lista(){
struct _agenda *auxiliar; /* lo usamos para recorrer la lista */
int i=0;

auxiliar = primero;
printf( "\nMostrando la lista completa:\n ");
while( auxiliar != NULL ){
printf( "\n Nombre: %s, Telefono: %s",
auxiliar->nombre,auxiliar->telefono);
auxiliar = auxiliar->siguiente;
i++;
}
if( i==0 ){
printf( "\nLa lista está vacía!!\n" );
}
getchar();
}

//http://www.santiagoapostol.net/srca/cursoc/cursoc22.html#anadir


Desde ya muchas gracias por la ayuda que deseen brindarme.-   

rir3760, no tuve internet por 10 días y no pude responderte al otro tema, luego me ocupo.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ivancea96

Lo mejor es que pases la lista a las funciones. Sinó, no podrás tener más de una lista en el programa.

Para borrar el nodo número i, tendrás que ir hasta él, y guardarlo en un puntero temporal. Luego, el puntero al nodo siguiente del nodo anterior lo igualas al nodo siguiente del nodo a borrar. Por último, haces free() con el nodo que tienes que borrar, que lo tendrás guardado en el puntero temporal.

Cuando pongo "nodo siguiente" me refiero al puntero de la estructura. Lo puse así porque es algo lioso xD

DanielPy

Hola.
Como siempre muchas gracias por ocuparte, te explico lo que me pasa, teoría  leí más de 20 páginas lo que necesito es que alguien me dé un ej. de código para tener como referencia y poder estudiarlo a partir del mismo.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ivancea96

#3
struct _agenda *temp1 = /* Nodo anterior al nodo que sera borrado */, *temp2 = /* Nodo a ser borrado */;
temp1->siguiente = temp2->siguiente;
free(temp2);


Aqui un esquema jeje



Edito: Dado que es una lista enlazada simple, tener un puntero al último elemento de pocote va a servir. Lo mejor sería que en vez de tener 2 punteros globales, tuvieras listas almacenadas en variables. Esas variables simplemente serían un puntero al primer elemento :o