There are 3 bugs here:

1. The comparison clause is incorrect, should be

if (curr->number < new_node->number && new_node->number < temp->number)

2. When inserting a new element into the middle of the list, the pointer in the previous element is not updated.

3. The special case where a new element should be placed in the head of the list is not handled.

4. Of course, this can only work if all numbers are distinct. Otherwise '<=' instead of '<' is needed.

The whole code (corrected):

#include <stdio.h>

#include <stdlib.h>

typedef struct node

{

int number;

struct node *next;

}

Node;

void additem (int a);

void print (void);

Node *head = NULL;

main ()

{

int i = 0;

int a1[5] =

{-1, 2, -4, 67, 78};

for (i = 0; i < 5; i++)

{

additem (a1[i]);

}

print ();

}

void

additem (int a)

{

Node *curr;

Node *new_node;

Node *prev;

Node *temp;

new_node = (Node *) malloc (sizeof (Node));

if (new_node == NULL)

{

printf ("I am dreadfully sorry.. You don't have enough conventional memory to add the New Node\n");

exit (1);

}

new_node->next = NULL;

new_node->number = a;

if (head == NULL)

{

head = new_node;

return;

}

if (new_node->number < head->number) /* this case was not handled */

{

new_node->next = head;

head = new_node;

return;

}

prev = NULL;

curr = head;

temp = NULL;

temp = curr->next;

while (curr->next != NULL)

{

if (curr->number < new_node->number && new_node->number < temp->number) /* the second comparison was inverted */

{

new_node->next = temp;

temp = new_node;

curr->next = new_node; /* this line was mising */

return;

}

else

{

curr = curr->next;

temp = curr->next;

}

}

curr->next = new_node;

return;

}

void

print (void)

{

Node *curr;

int i = 0;

curr = head;

if (curr == NULL)

{

printf ("I am sorry this is an empty list..There is no data in the list\n");

return;

}

while (curr != NULL)

{

printf ("Node: [%d] = %d\n", i, curr->number);

i++;

curr = curr->next;

}

}

1. The comparison clause is incorrect, should be

if (curr->number < new_node->number && new_node->number < temp->number)

2. When inserting a new element into the middle of the list, the pointer in the previous element is not updated.

3. The special case where a new element should be placed in the head of the list is not handled.

4. Of course, this can only work if all numbers are distinct. Otherwise '<=' instead of '<' is needed.

The whole code (corrected):

#include <stdio.h>

#include <stdlib.h>

typedef struct node

{

int number;

struct node *next;

}

Node;

void additem (int a);

void print (void);

Node *head = NULL;

main ()

{

int i = 0;

int a1[5] =

{-1, 2, -4, 67, 78};

for (i = 0; i < 5; i++)

{

additem (a1[i]);

}

print ();

}

void

additem (int a)

{

Node *curr;

Node *new_node;

Node *prev;

Node *temp;

new_node = (Node *) malloc (sizeof (Node));

if (new_node == NULL)

{

printf ("I am dreadfully sorry.. You don't have enough conventional memory to add the New Node\n");

exit (1);

}

new_node->next = NULL;

new_node->number = a;

if (head == NULL)

{

head = new_node;

return;

}

if (new_node->number < head->number) /* this case was not handled */

{

new_node->next = head;

head = new_node;

return;

}

prev = NULL;

curr = head;

temp = NULL;

temp = curr->next;

while (curr->next != NULL)

{

if (curr->number < new_node->number && new_node->number < temp->number) /* the second comparison was inverted */

{

new_node->next = temp;

temp = new_node;

curr->next = new_node; /* this line was mising */

return;

}

else

{

curr = curr->next;

temp = curr->next;

}

}

curr->next = new_node;

return;

}

void

print (void)

{

Node *curr;

int i = 0;

curr = head;

if (curr == NULL)

{

printf ("I am sorry this is an empty list..There is no data in the list\n");

return;

}

while (curr != NULL)

{

printf ("Node: [%d] = %d\n", i, curr->number);

i++;

curr = curr->next;

}

}