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);