no acabo de entender tu codigo, mezclas en asignaciones punteros y structs, ademas de que a mi parecer esta algo desordenado... para arreglar esto, deberias tener una funcion que te inserte 1 nodo en la lista, 1 funcion que te elimine 1 nodo de la lista, y una funcion que te elimine la lista entera. luego otra funcion que te permita buscar cosas en ella. te dejo la funcion para crear 1 nodo, con el trozo de codigo en el main para hacer n nodos, y asi veras donde te has equivocado.
struct lista* insertar_nodo(struct lista* l, struct dato x)
{
struct lista *q, *p;
q
=(struct lista
*)malloc(sizeof(struct lista
)); // reservamos memoria para 1 nodo //aqui rellenamos la estructura del nodo creado
q->datos=x;
q->sig=NULL; //NULL ya que sera el ultimo elemento de la lista
if (l == NULL) return q; // si el puntero l de los parametros era NULL, retornamos el nodo creado ya que sera el unico elemento de la lista
// si l ya tenia nodos, buscamos el ultimo para poder añadir el nuevo nodo
p=l; //no usamos q ya que necesitamos la direccion del nuevo nodo creado
while (p->sig != NULL) p=p->sig; //buscamos el ultimo nodo de la lista
p->sig=q; //al ultimo nodo le asignamos a siguiente el nuevo nodo q
return l; //retornamos l, q era tanto parametro de la funcion como el valor de retorno
}
y en el main, se usaria de esta manera para crear una lista con n nodos:
struct lista {
struct dato datos;
struct lista *sig;
};
int main() {
struct dato d;
struct lista *l=NULL;
//(codigo.....)
for (i=0; i<n; i++)
l=insertar_nodo(l, d);
//(Codigo.....)
}
si quieres que te pase el codigo entero dimelo, era un problema bastante divertido que posteo un usuario el foro hace tiempo, aunque es algo largo y por eso no lo postee. un saludo