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?
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 (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!
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
te pasaste xiruko , muchisimas gracias. Solo esperaba alguna sujerencias. De verdad muchisimas gracias ^^ es muy util
muchisimas gracias a ti tambien Fire544 ^^