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