no se pueden imprimir elementos en una lista enlazada en c

Estoy aprendiendo sobre la lista de enlaces. Mientras bash insertar elementos en la lista enlazada, no puedo imprimir esos elementos insertados.

int main() { int i,x,n; struct node* head = NULL; printf("Enter number of elements to insert into likedlist :"); scanf("%d",&n); printf("Enter elements: "); for(i=0;idata = x; p->next = NULL; if(head == NULL) { head = p; return head; } p->next = head; head = p; return head; } 

Aquí estoy agregando los elementos a una lista vinculada cambiando su nodo principal (insert_front).

 void print(struct node* n) { while(n != NULL) { printf("%d -> ",n->data); n = n->next; } printf("NULL"); } 

Entonces, ¿qué hay de malo con este código? La salida es así

Entrada de muestra:

  Enter number of elements to insert into likedlist :5 Enter elements: 1 2 3 4 5 

Salida de muestra:

 NULL 

Lea más sobre la progtwigción en C (primero un buen tutorial, luego un sitio de referencia y luego consulte el estándar C11 n1570 ). No podemos enseñarlo en unos pocos párrafos.

C usa una estrategia de evaluación llamada por valor .

Entonces, al menos para los novatos, se recomienda (pero no se requiere) convencionalmente que nunca se use un argumento formal como el destino del lado izquierdo de alguna asignación, porque cualquier cambio a un argumento formal es local a la función que tiene ese argumento formal. no impactar a la persona que llama.

Entonces, compile con todas las advertencias e información de depuración : gcc -Wall -Wextra -g con GCC . Utilice el depurador (por ejemplo, gdb ) para comprender el comportamiento de su progtwig (su error probablemente no esté en el fragmento de código que nos muestra).

La capacidad de comprender el comportamiento de un progtwig completo y de depurarlo es una habilidad esencial para los desarrolladores. Tanto las advertencias del comstackdor como el depurador pueden ayudarlo a comprender el comportamiento de un progtwig. Consulte también http://norvig.com/21-days.html para obtener información útil.

Por lo tanto, el argumento formal principal en la insert es una copia local del argumento real de la persona que llama.

En

 if(head == NULL) { head = p; return head; } 

Solo modificas esa copia, no el original. Entonces la head = p; lo anterior es completamente inútil (y confuso), es mejor que simplemente reemplace el bloque entre llaves arriba con simplemente return p;

No sabemos cómo se llama insert , y no podemos ayudar más.

Quizás insert debería obtener la dirección de algún puntero … o quizás su main debería usar el valor de retorno de la misma …

En su pregunta editada, dentro de su main , reemplace

  insert(head,x); //WRONG 

(lo que no cambia la head local declarada en main , incluso si insert está cambiando su primer formal, debido al paso del argumento llamada por valor) con

  head = insert(head, x);