elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda eliminacion nodo lista enlazada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda eliminacion nodo lista enlazada  (Leído 874 veces)
khyel

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda eliminacion nodo lista enlazada
« en: 25 Febrero 2017, 21:07 »

Buenas tardes, tengo poco que empeze con el tema de listas enlazadas y estoy realizando un ejercicio de un libro el cual es un registro de un hotel, en el cual el usuario ingresa nombre y habitacion, todo me funciona bien solo que al eliminar un nodo dependiendo cual deseo eliminar me provoca un crash y la verdad no encuentro el error por mas que intento.
Por ejemplo:

nodo1 -> nodo2 -> nodo3

si elimino nodo2 me queda:

nodo1->nodo3

al eliminar nodo3 deja de funcionar el programa.

o tambien cuando elimino nodo1 y nodo3 tambien se eliminan perfectamente pero el nodo2 restante al tratar de eliminarloigual deja de funcionar.

Se los agradeceria si me pudieran proporcionar una ayuda en como puedo solucionar esto o si estoy cometiendo algun error en mi codigo.

Código:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define SIZE 20

struct Registro {
char nombre[SIZE];
int habit;
struct Registro *siguiente;
};

typedef struct Registro NODOLISTA;
typedef NODOLISTA *NODOLISTAPTR;
NODOLISTAPTR inicio = NULL;

/* Function prototype */
void insertar ( NODOLISTAPTR *, char[SIZE] ,int);
void imprimir ( NODOLISTAPTR );
int count ( NODOLISTAPTR );
void eliminar(NODOLISTAPTR);

int main() {
    char cliente[SIZE];
    int opc=0;
    int i=0;
    int hab=0;;
    do{
        printf("\n\t\t* * MENU * *");
        printf("\n1) Registrar\n2) Eliminar\n3) Imprimir registro\n4) Salir\n\nOpcion: ");
        scanf("%d",&opc);
        system("cls");
        switch(opc){
        case 1:
            printf("\nIngrese los siguientes datos:");
            printf("\n\nNombre: ");
            fflush(stdin);
            scanf ("%[^\n]%*c", cliente);
            printf("Habitacion: ");
            fflush(stdin);
            scanf("%d",&hab);
            insertar ( &inicio, cliente, hab);
            printf("\nRegistro exitoso.");
            getch();
            system("cls");
            break;
        case 2:
            eliminar(inicio);
            break;
        case 3:
            imprimir(inicio);
            getch();
            break;
        case 4:
            printf("Saliendo...");
            getch();
            break;
        }
    }while(opc!=4);
    return 0;
}

void insertar ( NODOLISTAPTR *sPtr, char valor[SIZE],int _hab )
{
NODOLISTAPTR nuevo, previo, actual;
int cmp;
nuevo = malloc(sizeof(NODOLISTA));
if ( nuevo != NULL ) {
strcpy(nuevo->nombre, valor);
nuevo->habit=_hab;
nuevo->siguiente = NULL;
previo = NULL;
actual = *sPtr;
while ( actual != NULL ) {
cmp = strcmp(valor, actual->nombre);
if (cmp < 0) {
/* you're at the point where you need to add the node */
break;
}
previo = actual;
actual = actual->siguiente;
}
if ( previo == NULL ) {
nuevo->siguiente = *sPtr;
*sPtr = nuevo;
}
else{
previo->siguiente = nuevo;
nuevo->siguiente = actual;
}
}
else
printf("%s no se inserto.\n", valor);
}

void imprimir ( NODOLISTAPTR actual )
{
if ( actual == NULL )
printf("Lista esta vacia.\n\n");
else{
printf("The list is:\n");
while ( actual != NULL ){
printf("%s , %d --> ", actual->nombre,actual->habit);
actual = actual->siguiente;
}
printf("NULL\n\n");
}
}

void eliminar(NODOLISTAPTR actual){
    NODOLISTAPTR prev;
    char cli[SIZE];
    printf("Ingrese nombre a borrar: ");
    fflush(stdin);
    scanf ("%[^\n]%*c", cli);
    while ( actual != NULL ) {
        if (strcmp(cli, actual->nombre) == 0) {
            if(actual==inicio){
                inicio=actual->siguiente;
                free(actual);
            }else{
                prev->siguiente=actual->siguiente;
                free(actual);
            }
        }
        else{
            prev = actual;
            actual = actual->siguiente;
        }
    }
}



En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Ayuda eliminacion nodo lista enlazada
« Respuesta #1 en: 25 Febrero 2017, 22:33 »

Mirate este víde
https://www.makigas.es/series/estructuras-de-datos/listas-enlazadas-en-c


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con lista enlazada
Java
netca 2 2,099 Último mensaje 20 Abril 2012, 16:11
por adwind
Eliminar nodo en lista enlazada: problema con el último nodo [C]
Programación C/C++
Rhessus 2 2,754 Último mensaje 20 Julio 2016, 06:08
por Rhessus
Borrar nodo en lista simplemente enlazada[C]
Programación C/C++
NOB2014 4 4,206 Último mensaje 28 Julio 2016, 14:22
por NOB2014
Agregar nodo a lista doblemente enlazada (lenguaje C)
Programación C/C++
NOB2014 7 4,326 Último mensaje 3 Agosto 2016, 16:14
por AlbertoBSD
Borrar ultimo nodo lista simplemente enlazada
Programación C/C++
robertoesimez 5 2,151 Último mensaje 23 Marzo 2017, 07:22
por MAFUS
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines