Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 219
  • Last Modified:

This only prints -1,2,-4

What is wrong with this code, please make all code enhancements in a new c file..
It only prints -1,2-4 plus it doesn't seem to sort the incomming integer..


 #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;
  }

  prev=NULL;
  curr=head;
  temp=NULL;
  temp=curr->next;
  while(curr->next != NULL)
  {

       if (curr->number< new_node->number&&new_node->number>temp->number)
       {
            new_node->next=temp;
            temp=new_node;
          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;
      }
}

Please rewrite the code. with /* showing why and what you did*/
0
johnm112496
Asked:
johnm112496
1 Solution
 
mlevCommented:
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;
    }
}

0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now