#include <stdio.h> #include <stdlib.h> typedef struct node { int value; // 4 bytes struct node *next; // 8 bytes } node_t; node_t *new_node(int v); node_t *insert_node(node_t **head, int v); void print_list(node_t *curr); int main(int argc, char *argv[]) { node_t *head = NULL; int x; // Keep reading integers, insert them into linked list while(scanf("%d", &x) == 1) { if(insert_node(&head, x) == NULL) { exit(1); } } // Print the list print_list(head); return 0; } // Creates and returns a new node with value v node_t *new_node(int v) { node_t *n = NULL; n = (node_t *)malloc(sizeof(node_t)); if(n == NULL) { fprintf(stderr, "Error: malloc failed.\n"); return NULL; } // Set the value and next variables of n n->value = v; n->next = NULL; return n; } // Inserts a node in the list beginning with head, returns // a pointer to the new node. Note: We have to pass the address // of head to this function so the value of head can be changed in // the calling function. node_t *insert_node(node_t **head, int v) { node_t *tmp = new_node(v); if(tmp == NULL) return NULL; if(*head == NULL) { // case 1 *head = tmp; } else { // case 2 tmp->next = *head; *head = tmp; } return tmp; } // Prints the list recursively void print_list(node_t *curr) { if(!curr) return; printf("Node address: %p\n", curr); printf(" Node value: %d\n", curr->value); printf("Next address: %p\n\n", curr->next); print_list(curr->next); }