LinkedList-Fixed.c:


/**
  * Note: after class, this took me another 20 minutes
  * to find and fix the bug. I tracked it down by adding
  * one node at a time (so I removed the second and third
  * calls to 'insert_ordered', ran the code, added the second
  * call back in, and then discovered the bug).
  */

#include <stdio.h>

struct Node
{
    int value;
    struct Node *next;
};

float average(struct Node *head)
{
    struct Node *node = head;
    int size = 0;
    int sum = 0;
       
    while(node != NULL)
    {
        sum += node->value;
        size++;
        node = node->next;
    }

    return ((float)sum) / size;
}

void print_list(struct Node *head)
{
    struct Node *node = head;
       
    while(node != NULL)
    {
        printf("%d\n", node->value);
        node = node->next;
    }
}

void append(struct Node **head, int value)
{
    struct Node *node = *head;
    struct Node *insert_node;
    struct Node *new_node =
        malloc( sizeof(struct Node) );
           
    new_node->value = value;
    new_node->next = NULL;

    if (*head == NULL)
    {
        *head = new_node;
        /*printf("Node:%d\n", head->value);*/
        return;
    }
   
    while(node != NULL)
    {
        insert_node = node;
        node = node->next;
    }

    insert_node->next = new_node;
}

void insert_ordered(struct Node **head, int value)
{
    struct Node *node = *head;
    struct Node *insert_node = NULL;
    struct Node *new_node =
        malloc( sizeof(struct Node) );
           
    new_node->value = value;
    new_node->next = NULL;

    /* We should have used > instead of <
     * (since this is the stopping condition of the loop)
     */

    while((node != NULL) && (value > node->value))
    {
        insert_node = node;
        node = node->next;
    }

    /* When adding an element to the head of the list
     * (i.e., when the number we're adding is smaller
     * than the rest), we need to adjust the value of
     * "head". This is similar to the special case of
     * when we have an empty list, so I moved that code
     * here.
     */

    if (insert_node == NULL)
    {
        *head = new_node;
    }
    else
    {
        insert_node->next = new_node;
    }

    new_node->next = node;
}

/*
remove
*/


void check_head(struct Node *head)
{
    if (head == NULL)
    {
        printf("Head is NULL\n");
    }
    else
    {
        printf("Node:%d\n", head->value);
    }
}

main()
{
    struct Node *head = NULL;
    float avg;
       
    insert_ordered(&head, 16);
    insert_ordered(&head, 3);
    insert_ordered(&head, 34);
    print_list(head);
   
    avg = average(head);
    printf("Average is %.2f\n", avg);
}