How to implement a linked list in C?

后端 未结 14 905
予麋鹿
予麋鹿 2020-12-06 02:49

I am creating a linked list as in the previous question I asked. I have found that the best way to develop the linked list is to have the head and tail in another structure.

14条回答
  •  忘掉有多难
    2020-12-06 03:31

    A demo for Singly Linked List. If you prefer, try to check Circular Linked List and Doubly Linked List.

    #include 
    #include 
    
    
    typedef struct node {
        int val;
        struct node * next;
    } node_t;
    
    
    // Iterating over a list
    void
    print_list(node_t *head)
    {
        node_t *current = head;
    
        while(current != NULL)
        {
            printf("%d\n", current->val);
            current = current->next;
        }
    }
    
    
    // Adding an item to the end of the list
    void
    push_end(node_t *head, int val)
    {
        node_t *current = head;
        while (current->next != NULL)
        {
            current = current->next;
        }
    
        current->next = malloc(sizeof(node_t));
        current->next->val = val;
        current->next->next = NULL;
    }
    
    // Adding an item to the head of the list
    void
    push_head(node_t **head, int val)
    {
        node_t *new_node = NULL;
    
        new_node = malloc(sizeof(node_t));
        new_node->val = val;
        new_node->next = *head;
    
        *head = new_node;
    }
    
    // Removing the head item of the list
    int
    pop_head(node_t **head)
    {
        int retval = -1;
        node_t *next_node = NULL;
    
        if (*head == NULL) {
            return -1;
        }
    
        next_node = (*head)->next;
        retval = (*head)->val;
        free(*head);
        *head = next_node;
    
        return retval;
    }
    
    // Removing the last item of the list
    int
    pop_last(node_t *head)
    {
        int retval = 0;
        node_t *current = NULL;
    
        if (head->next == NULL) {
            retval = head->val;
            free(head);
            return retval;
        }
    
        /* get to the second to last node in the list */
        current = head;
        while (current->next->next != NULL) {
            current = current->next;
        }
    
        /* now current points to the second to last item of the list.
           so let's remove current->next */
        retval = current->next->val;
        free(current->next);
        current->next = NULL;
    
        return retval;
    }
    
    // Removing a specific item
    int
    remove_by_index(node_t **head, int n)
    {
        int i = 0;
        int retval = -1;
        node_t *current = *head;
        node_t *temp_node = NULL;
    
        if (n == 0) {
            return pop_head(head);
        }
    
        for (i = 0; i < n - 1; i++) {
            if (current->next == NULL) {
                return -1;
            }
            current = current->next;
        }
    
        temp_node = current->next;
        retval = temp_node->val;
        current->next = temp_node->next;
        free(temp_node);
    
        return retval;
    }
    
    
    int
    main(int argc, const char *argv[])
    {
        int i;
        node_t * testnode;
    
        for (i = 0; i < argc; i++)
        {
            push_head(&testnode, atoi(argv[i]));
        }
    
        print_list(testnode);
    
        return 0;
    }
    
    // http://www.learn-c.org/en/Linked_lists
    // https://www.geeksforgeeks.org/data-structures/linked-list/
    

提交回复
热议问题