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

listas simpl. enlazadas

Estas en el tema de listas simpl. enlazadas en el foro de C/C++ en Foros del Web. hola amigos de forosdelweb quisiera que me ayuden con este algoritmo.... este programa registro los datos de un cliente, los muestra, modifica, elimina y he ...
  #1 (permalink)  
Antiguo 29/10/2010, 09:03
 
Fecha de Ingreso: octubre-2010
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Pregunta listas simpl. enlazadas

hola amigos de forosdelweb quisiera que me ayuden con este algoritmo.... este programa registro los datos de un cliente, los muestra, modifica, elimina y he ahi el problema cuando le pongo eliminar me borra el primero creo dos clientes y me borra siempre el primero... algo anda mal alli, les agradezco de antemano su aporte. les dejo el codigo de mi programa en C++ (utilizo turbo c++)

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <string.h>

typedef struct nodo {
char nombre[20];
char apellido[30];
char dni[9];
char telefono[9];
nodo *siguiente;
};

void mostrar_menu();
void anadir_cliente();
void buscar_cliente();
void mostrar_lista();
void borrar_cliente();
void modificar_cliente();

nodo *primero, *ultimo,*u,*aux;


void main()
{
char opcion;
primero = (nodo *) NULL;
ultimo = (nodo *) NULL;
do{
mostrar_menu();
opcion = getch();
switch ( opcion )
{
case '1': anadir_cliente(); break;
case '2': modificar_cliente(); break;
case '3': borrar_cliente(); break;
case '4': mostrar_lista(); break;
case '5': buscar_cliente(); break;
case '6': exit(1);
default: clrscr(); printf("\a[!] Opcion invalida\n" ); break;
}
}while(opcion!='6');
}


void mostrar_menu()
{
printf("\t\t\tPROGRAMA DE REGISTRO DE CLIENTES\n");
printf("========================================== =================================\n");
printf("MENU\n");
printf("(1) Añadir nuevo cliente\n");
printf("(2) Modificar datos del cliente\n");
printf("(3) Eliminar cliente\n");
printf("(4) Mostrar lista de clientes\n");
printf("(5) Buscar cliente por dni\n");
printf("(6) Salir\n\n");
printf("========================================== =================================\n");
printf("Ingrese opcion: ");fflush(stdin);
}

void anadir_cliente()
{
nodo *nuevo;
nuevo = (nodo *) malloc (sizeof(nodo));
clrscr();
if (nuevo==NULL)
printf( "No hay memoria disponible\n");
else
{
printf("AÑADIR NUEVO CLIENTE\n");
printf("========================================== =================================\n");
printf("Nombre: "); fflush(stdin);
scanf("%s",&nuevo->nombre);
printf("Apellido: "); fflush(stdin);
scanf("%s",&nuevo->apellido);
printf("DNI: "); fflush(stdin);
scanf("%s",&nuevo->dni);
printf("Teléfono: "); fflush(stdin);
scanf("%s",&nuevo->telefono);
nuevo->siguiente = NULL;
if (primero==NULL)
{
printf("========================================== =================================");
printf("\n[!] Cliente añadido satisfactoriamente\n");
primero = nuevo;
ultimo = nuevo;
}
else
{
printf("========================================== =================================");
printf("\n[!] Cliente añadido satisfactoriamente\n");
ultimo -> siguiente = nuevo;
ultimo = nuevo;
}
}
printf("========================================== =================================\n");
printf("\nPresione una tecla para continuar\n");
getch();
clrscr();
}

void mostrar_lista()
{
nodo *auxiliar;
int i;
i=0;
auxiliar = primero;
clrscr();
printf("MOSTRAR LISTA DE CLIENTES\n");
printf("========================================== =================================\n");
printf("Nº ");
printf("Nombre\t\t");
printf("Apellido\t\t");
printf("DNI\t\t");
printf("Telefono\t \n");
while (auxiliar!=NULL)
{
gotoxy(1,5+i),printf("%d\t",i+1);
gotoxy(7,5+i),printf("%s\t\t",auxiliar->nombre);
gotoxy(25,5+i),printf("%s\t\t",auxiliar->apellido);
gotoxy(49,5+i),printf("%s\t",auxiliar->dni);
gotoxy(65,5+i),printf("%s\t\n",auxiliar->telefono);
auxiliar = auxiliar->siguiente;
i++;
}
if (i==0)
{
printf("========================================== =================================");
printf("\n[!] No hay clientes\n");
}
else
{
if (i>=0)
{
printf("========================================== =================================");
printf("\n[!] Numero de clientes: %d\n",i);
}
}
printf("========================================== =================================\n");
printf("\nPresione una tecla para continuar\n");
getch();
clrscr();
}

void buscar_cliente()
{
char dniop[9];
int i;
i=0;
nodo* inicio;
nodo* aux;
inicio = primero;
clrscr();
printf("BUSCAR CLIENTE POR DNI\n");
printf("========================================== =================================\n");
printf("Ingrese DNI del cliente a buscar: ");
scanf("%s", &dniop);
for (aux = inicio; aux!=NULL; aux=aux->siguiente)
if (strcmp(aux->dni,dniop)==0)
{
printf("\nNombre : %s\n", aux -> nombre);
printf("Apellido : %s\n", aux -> apellido);
printf("DNI : %s\n", aux -> dni);
printf("Telefono : %s\n", aux -> telefono);
i++;
}
printf("========================================== =================================");
printf("\n[!] Clientes encontrados: %d\n",i);
printf("========================================== =================================\n");
printf("\nPresione una tecla para continuar\n");
getch();
clrscr();
}

void borrar_cliente()
{
char dniop[9];
int i;
i=0;
nodo* inicio;
nodo* aux;
inicio = primero;
clrscr();
printf("BORRAR CLIENTE POR DNI\n");
printf("========================================== =================================\n");
printf("Ingrese DNI del cliente a borrar: ");
scanf("%s", &dniop);
for (aux = inicio; aux!=NULL; aux=aux->siguiente)
if (strcmp(aux->dni,dniop)==0)
{
primero = aux -> siguiente;
free(aux);
}
printf("\nPresione una tecla para continuar\n");
getch();
clrscr();
}

void modificar_cliente()
{
int band=1;
char modifica[20],opc;
u=primero;
clrscr();
printf("MODIFICAR DATOS DEL CLIENTE\n");
printf("========================================== =================================\n");
printf("(1) Modificar nombre\n");
printf("(2) Modificar apellido\n");
printf("(3) Modificar DNI\n");
printf("(4) Modificar telefono\n\n");
printf("========================================== =================================\n");
printf("Ingrese opcion: ");
opc = getch();
switch ( opc )
{
case '1':
printf("\nIngrese nombre a modificar: ");
gets(modifica);
while(u!=NULL){
if(strcmp(modifica,u->nombre)==0){
printf("\Ingrese reemplazo: ");
gets(u->nombre);
band=0;
}
u=u->siguiente;
}
if(band==1){
printf("========================================== =================================");
printf("\n[!] No se encontro nombre a modificar\n");
printf("========================================== =================================\n");
}
break;
case '2':
printf("\nIngrese apellido a modificar: ");
gets(modifica);
while(u!=NULL){
if(strcmp(modifica,u->apellido)==0){
printf("\Ingrese reemplazo: ");
gets(u->apellido);
band=0;
}
u=u->siguiente;
}
if(band==1){
printf("========================================== =================================");
printf("\n[!] No se encontro apellido a modificar\n");
printf("========================================== =================================\n");
}
break;
case '3':
printf("\nIngrese DNI a modificar: ");
gets(modifica);
while(u!=NULL){
if(strcmp(modifica,u->dni)==0){
printf("\Ingrese reemplazo: ");
gets(u->dni);
band=0;
}
u=u->siguiente;
}
if(band==1){
printf("========================================== =================================");
printf("\n[!] No se encontro DNI a modificar\n");
printf("========================================== =================================\n");
}
break;
case '4':
printf("\nIngrese telefono a modificar: ");
gets(modifica);
while(u!=NULL){
if(strcmp(modifica,u->telefono)==0){
printf("\Ingrese reemplazo: ");
gets(u->telefono);
band=0;
}
u=u->siguiente;
}
if(band==1){
printf("========================================== =================================");
printf("\n[!] No se encontro telefono a modificar\n");
printf("========================================== =================================\n");
}
break;
}
printf("\nPresione una tecla para continuar\n");
getch();
clrscr();
}
  #2 (permalink)  
Antiguo 29/10/2010, 17:03
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: listas simpl. enlazadas

Aver si entiendo tu implementacion. En la variable "primero" llevas el puntero del primer nodo. Y de ahi se arma tu lista,

Entonce tu problema recide que en borrar nodo lo que haces es poner como primero el siguiente nodo al que borras. Y esto esta mal. Porque estas eliminado todos los nodos que estan atras del tuyo. Fijate si agregas 5 o 6 nodos. si borras el cuarto se van a borrar los tre primeros.

Lo que deberias hacer es llevar un puntero del nodo anteriro que que vas a borrar y enlazar ese nodo anterior con el siguiente al que vas a borrar. Esto se logra en el for que itera nodo a nodo agregadon una variable auxiliar que lleve memoria.

Código C++:
Ver original
  1. ant = null;
  2. for (aux = inicio; aux!=NULL; ant=aux, aux=aux->siguiente)
  3.     if (strcmp(aux->dni,dniop)==0)
  4.     {
  5.      if (ant != null)   // Me fijo que ant no sea nulo. Indica si estoy o no en el primer elemento.
  6.              ant->siguiente  =  aux -> siguiente;
  7.      else
  8.             inicio = aux->siguiente;  // En este caso borro el primer elemento por lo que tengo que modificar el primero.
  9.      free(aux);
  10. }
  #3 (permalink)  
Antiguo 30/10/2010, 08:50
 
Fecha de Ingreso: octubre-2010
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: listas simpl. enlazadas

muchas gracias amigo

Etiquetas: listas
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 11:51.