AYUDA ORDENAR LISTA SIMPLE[C]

Iniciado por HRSLASH, 23 Abril 2011, 04:22 AM

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

HRSLASH

Hola gente del foro!! Estoy teniendo un problema para ordenar una lista simple, se q directamente podria insertar los nodos en forma ordenada, pero lo q quiero es ordenarlo al final para hacer un algoritmo q me ordene la lista.. El problema es q no se pq no me lo ordena correctamente.. No puedo encontrar el error.. usando un puntero auxiliar quiero extraer numeros de la lista e ir insertandolos ordenadamente en otra.. Espero q puedan ayudarme pq estoy volviendome loco..
aqui el codigo..


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

struct nodo{
    char data;
    struct nodo *nextPtr;
};

typedef struct nodo NODO;
typedef NODO *NODOPTR;

void insertNodo(NODOPTR *, char);
char deleteNodo(NODOPTR *, char);
int listLength(NODOPTR);
void ordenarAscendente(NODOPTR *, NODOPTR *);
void printLista(NODOPTR);

main()
{
    NODOPTR startPtr = NULL, startPtr2 = NULL;
    char value;
    int choice;

    printf("Ingrese una opcion: ");
    scanf("%d", &choice);

    while (choice != 4){
        switch (choice){
            case 1:
                printf("Ingrese una letra: ");
                scanf("%s", &value);
                insertNodo(&startPtr, value);
                printLista(startPtr);
                break;
            case 2:
                printf("Ingrese una letra para borrar: ");
                scanf("%s", &value);
                deleteNodo(&startPtr, value);
                printLista(startPtr);
                break;
            case 3:
                if(listLength(startPtr) == NULL)
                    printf("La lista no contiene elementos\n");
                else
                    printf("La lista contiene %d elementos\n", listLength(startPtr));
                break;
            default:
                printf("Opcion inexistente");
        }
        printf("Ingrese una opcion: ");
        scanf("%d", &choice);
    }

    ordenarAscendente(&startPtr, &startPtr2);
    printLista(startPtr2);

    return 0;
}





void insertNodo(NODOPTR *sPtr, char val)
{
    NODOPTR newPtr, previousPtr, currentPtr;

    newPtr = (NODO*)malloc(sizeof(NODO));

    if (newPtr != NULL){
        newPtr -> data = val;
        newPtr -> nextPtr = NULL;

        previousPtr = NULL;
        currentPtr = *sPtr;

        while (currentPtr != NULL){
            previousPtr = currentPtr;
            currentPtr = currentPtr -> nextPtr;
        }

        if (previousPtr == NULL){
            newPtr -> nextPtr = *sPtr;
            *sPtr = newPtr;
        }

        else{
            previousPtr -> nextPtr = newPtr;
            newPtr -> nextPtr = currentPtr;
        }
    }
    else
        printf("%s not inserted. Insuficient space", val);
}

char deleteNodo(NODOPTR *sPtr, char val)
{
    NODOPTR previousPtr, currentPtr, tempPtr;

    if (val == (*sPtr) -> data){
        tempPtr = *sPtr;
        *sPtr = (*sPtr) -> nextPtr;
        free(tempPtr);
        return val;
    }
    else{
        previousPtr = *sPtr;
        currentPtr = (*sPtr) -> nextPtr;

        while(currentPtr != NULL && currentPtr -> data != val){
            previousPtr = currentPtr;
            currentPtr = currentPtr -> nextPtr;
        }
        if(currentPtr != NULL){
            tempPtr = currentPtr;
            previousPtr -> nextPtr = currentPtr -> nextPtr;
            free(tempPtr);
            return val;
        }
    }

    return '\0';
}

int listLength(NODOPTR currentPtr)
{
    int cont = 0;

    if (currentPtr == NULL)
        return NULL;
    else{
        while (currentPtr != NULL){
            cont++;
            currentPtr = currentPtr -> nextPtr;
        }
    }

    return cont;
}

void ordenarAscendente(NODOPTR *sPtr, NODOPTR *sPtr2)
{
    NODOPTR auxPtr, previousPtr, currentPtr, tempPtr;

    //auxPtr = *sPtr;

    if (*sPtr == NULL)
        printf("No hay elementos en la lista\n");
    else{
        while (*sPtr != NULL){
            tempPtr = *sPtr;

            previousPtr = NULL;
            currentPtr = *sPtr2;

            while (currentPtr != NULL && tempPtr -> data > currentPtr -> data){
                previousPtr = currentPtr;
                currentPtr = currentPtr -> nextPtr;
                }

            if (previousPtr == NULL){
                tempPtr -> nextPtr = *sPtr2;
                *sPtr2 = tempPtr;
            }
            else{
                previousPtr -> nextPtr = tempPtr;
                tempPtr -> nextPtr = currentPtr;
            }

            free(tempPtr);
            *sPtr = (*sPtr) -> nextPtr;
        }
    }
}

void printLista(NODOPTR currentPtr)
{
    if (currentPtr == NULL)
        printf("La lista esta vacia");
    else{
        while (currentPtr != NULL){
            printf("|%c|->", currentPtr -> data);
            currentPtr = currentPtr -> nextPtr;
        }
    }
    printf("NULL\n");
}


Saludos!!
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer