[Resuelto]Duda lista simple enlazada en C

Iniciado por Zelandya, 30 Agosto 2012, 04:33 AM

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

Zelandya

Hola soy nueva en el foro, estoy haciendo un trabajo para la facu y estoy intentando declarar una lista enlazada simple:

la idea es la siguiente, con esta estructura quiero crear una lista que segun el string que reciba, aloco la cantidad de memoria exacta para esa palabra


struct nodo{
  char *palabra;
  struct nodo *sig;
};

struct structCSV {
char linea[4098];
struct nodo *P;

} CSV;



con esa estructura llege a hacer algo como esto:

void aniadir_final(char dato[]){
  struct nodo *q;
  struct nodo *a;
  q=(struct nodo *)malloc(sizeof(struct nodo));
  if (CSV.P==NULL)
       {
           q->sig=NULL;
           CSV.P=q;
       }
  else
       {
        while(CSV.P-> sig != NULL)
        q->sig=NULL;
       }
  q->registro=(char *)malloc(strlen(dato)+1);
 
   
   }
}


pero no puedo hacerlo andar, alguna sugerencia?

xiruko

#1
hola, hace poco respondi a una duda parecida y quizas te sirva de ayuda:

http://foro.elhacker.net/programacion_cc/duda_lista_simple_enlazada_c-t368885.0.html;msg1773697#msg1773697

me dio ganas de hacer el codigo de lo que pides, lo he probado y diria que funciona, aunque falta alguna funcion que recorra la lista para buscar y mostrar algo.


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

#define TAM 256

struct lista {
char* palabra;
struct lista *sig;
};

struct lista* InsertarPalabra(struct lista* l, char* word);
struct lista* EliminarLista(struct lista* l);
void MostrarPalabras(struct lista* l);

int main(int argc, char** argv) {

char bufer[TAM], opt;
struct lista* l=NULL;

do {
printf("Inserta la palabra: ");
memset(bufer, '\0', sizeof(bufer));
fgets(bufer, TAM-1, stdin);
bufer[strlen(bufer)-1]='\0';
l=InsertarPalabra(l, bufer);
printf("Quieres salir? y/Y ");
scanf("%c", &opt);
while(getchar()!='\n');
} while(opt!='y' && opt!='Y');

MostrarPalabras(l);
l=EliminarLista(l);
return 0;
}

struct lista* InsertarPalabra(struct lista* l, char* word) {

struct lista *q, *p;

q=(struct lista*)malloc(sizeof(struct lista));
q->palabra=(char*)malloc(strlen(word)*sizeof(char));
strncpy(q->palabra, word, sizeof(q->palabra));
q->sig=NULL;

if (l==NULL) return q;
p=l;
while (p->sig!=NULL) p=p->sig;
p->sig=q;

return l;
}

struct lista* EliminarLista(struct lista* l) {

struct lista *q, *p;

q=l;
while (q!=NULL) {
p=q->sig;
                free(q->palabra);
free(q);
q=p;
}

return NULL;
}

void MostrarPalabras(struct lista* l) {

struct lista *q;

q=l;
while (q!=NULL) {
printf("%s %d\n", q->palabra, (int)strlen(q->palabra));
q=q->sig;
}
}


espero que sirva. un saludo!

edito: he hecho la funcion para mostrar las palabras y el numero de caracteres de cada una (incluida el null al final) para saber si tenia algun error y si que tenia alguno...  :silbar: ahora si que funciona bien, y ya que estoy lo dejo acabado.

Citarte pasaste xiruko , muchisimas gracias. Solo esperaba alguna sujerencias. De verdad muchisimas gracias ^^ es muy util

de nada!

Fire544

#2
Hola Zelandya, mira lo primero es saber cuales datos vas a manejar, en tu caso una lista, lo segundo seria que tipo, dices enlazada, ps ahi tienes algo similar pero con muchos errores, a ver te corrigo: Es correcto hacer struct nodo{...}my_nodo;, pero no recomendado, lo mas factible seria un typedef struct nodo{}; nodo my_struct;, y recuerda dependiendo de tus necesidades es que trabajaras con listas tipo dinamicas o estaticas, tambien recuerda inicializar todo puntero a NULL en su declaracion es muy buena costumbre.!!!

Mira ejemplo:



typedef struct nodo{
       int valor;
       struct nodo *sig;
       };

nodo *primero=NULL;

nodo *add_nodo(nodo *nuevo, int val)
{
    nuevo=(struct nodo*)malloc(sizeof(nuevo));
   
    if(nuevo!=NULL)
    {
                   nuevo->valor=val;
                   nuevo->sig=NULL;
                   }
                   
                   if(nuevo->sig==NULL)
                   {
                                       nuevo->sig=primero;
                                       primero=nuevo;
                                       }
                                       return nuevo;
    }

nodo *ver_nodo()
{
    nodo *ver_lista=primero;
   
    while(ver_lista!=NULL)
    {
                          printf("%i", ver_lista->valor);
                          ver_lista=ver_lista->sig;
                          }
                          return ver_lista;
    }
       
int main(int argc, char **argv)
{
   nodo *data=NULL;
   
   add_nodo(data, 6);
   add_nodo(data, 4);
   add_nodo(data, 0);
   add_nodo(data, 1);
   add_nodo(data, 7);
   add_nodo(data, 0);
   add_nodo(data, 1);
   
   ver_nodo();
 
   }


Suerte !!  :xD
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

Zelandya

te pasaste xiruko , muchisimas gracias. Solo esperaba alguna sujerencias. De verdad muchisimas gracias ^^ es muy util

Zelandya

muchisimas gracias a ti tambien Fire544 ^^