Ayuda con funcion insertar nodo en lista!!!

Iniciado por mathias_vg, 10 Octubre 2015, 13:02 PM

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

mathias_vg

Hola estoy tratando de hacer una funcion que inserte nodo en una determinada posicion dada pero no he podido; tengo algunas fallas en el codigo y no se como solucionarlo

Espero me puedan ayudar,

les dejo el codigo

Código (cpp) [Seleccionar]
struct nodo{
    char *texto;
    struct nodo *siguientelinea;
};
typedef struct nodo *lineas;

struct listageneral{
    char *nombrearchivo;
    lineas primera;
};
typedef struct listageneral *Archivo;

TipoRet InsertarLinea(Archivo &a,char *linea, unsigned int nroLinea){
    if (a->primera == NULL)
    {
        lineas aux = new struct nodo;
        aux->texto = linea;
        aux->siguientelinea=a->primera;
        a->primera=aux;
    }
    else if ((a->primera!=NULL)&&(nroLinea==1))
    {
        lineas aux1 = new struct nodo;
        aux1->texto = linea;
        aux1->siguientelinea=a->primera;
        a->primera=aux1;
    }
    else if ((a->primera!=NULL)&&(nroLinea!=1))
    {
        Archivo p=NULL; // ver este caso

        int posicion = 2;
        while (posicion<nroLinea)
        {
            a->primera = a->primera->siguientelinea;
            posicion++;
        }

        lineas aux2 = new struct nodo;
        aux2->texto = linea;
        aux2->siguientelinea = a->primera;
        a->primera=aux2;
    }
    return OK;

ivancea96


mathias_vg

Disculpa pero no te entendi, me podes ayudar con el codigo?

Muchas gracias

ivancea96

Ni has dicho cuales son los errores, ni cuales son los problemas, ni qué no sabes hacer. Solo has dicho lo que tratas de hacer, y has mostrado el código.

mathias_vg

Este es mi codigo, mi problema es que cuando agrego el nodo lo agrega despues de uno del mismo valor y yo lo nececito agregar antes,

Espero me puedan ayudar!

Código (cpp) [Seleccionar]
struct nodo{
    char *texto;
    struct nodo *siguientelinea;
};
typedef struct nodo *lineas;

struct listageneral{
    char *nombrearchivo;
    lineas primera;
};
typedef struct listageneral *Archivo;

TipoRet InsertarLinea(Archivo &a,,char *linea, unsigned int nroLinea){
    if (a->primera==NULL)
    {
        lineas aux = new struct nodo;
        aux->texto = linea;
        aux->siguientelinea=a->primera;
        a->primera=aux;
    }
    else
    {
        lineas nuevo_nodo = new struct nodo;
        nuevo_nodo->texto = linea;
        nuevo_nodo->siguientelinea;
        nodo*primero = a->primera;
        nodo*ant = NULL;
        nodo*auxiliar = a->primera;
        int posicion = 1;
        while ((auxiliar!=NULL) && (posicion<=nroLinea))
        {
            ant = auxiliar;
            a->primera = a->primera->siguientelinea;
            auxiliar = a->primera;
            posicion++;
        }
        ant->siguientelinea=nuevo_nodo;
        nuevo_nodo->siguientelinea=auxiliar;
        a->primera=primero;

    }

ivancea96

while ((auxiliar!=NULL) && (posicion<=nroLinea))
        {
            ant = auxiliar;
            a->primera = a->primera->siguientelinea;
            auxiliar = a->primera;
            posicion++;
        }
        ant->siguientelinea=nuevo_nodo;
        nuevo_nodo->siguientelinea=auxiliar;
        a->primera=primero;


En vez de poner posicion<=nroLinea, pon posicion<nroLinea.
Luego, tendrías que comprobar que ant no sea NULL. Si no es NULL, le asignas el nuevo nodo. Sino, le asignas el nuevo nodo a la lista.

En este tipo de algoritmos, lo mejor es que, si no lo lograste a la primera, lo borres y lo trates de hacer de nuevo. Pero no te pongas a escribir sin tener planteada la totalidad del algoritmo, y con totalidad me refiero a todas sus posibilidades lógicas (nroLinea==0, nroLinea>nroLineasLista, etc)

Como dato final, en la lista, te recomiendo guardar un entero indicando el número de elementos que tiene. Te ahorrará algunas operaciones (pero a la vez tendrás que actualizarlo en cada mdificación de la lista)