**News Alert:**Experts Exchange Confirmed as Safe in Cloudbleed Leak Read More

Solved

Posted on 1998-01-06

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*/

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

{

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*/

1 Comment

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;

}

}

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Title | # Comments | Views | Activity |
---|---|---|---|

Using unmanaged DLL from managed application | 14 | 294 | |

using pointers to pointers to write to a two dimensional array | 16 | 92 | |

Can case within switch statement specify range of values ? | 3 | 82 | |

Windows Updates failing due to Diskpart not configured correctly | 8 | 119 |

Join the community of 500,000 technology professionals and ask your questions.