Beginner
Beginner

Reputation: 759

Insertion at end in linked list

I am inserting node at the end of the list but my code is printing only the first element and running in infinite loop. I am unable to figure out the error in my code.

typedef struct nodetype
{
   int info;
   struct nodetype* next;
}node;
node *head=NULL;

void insertatend(int x);//x is the key element.
void print();


void insertatend(int x)
 {
    node *ptr;
    ptr=(node*)malloc(sizeof(node));
    ptr->info=x;
    if(head==NULL)
      {
       ptr->next=ptr;
       head=ptr;
      }
    else
    ptr->next=ptr;
}

void print()   //To print the list
{
   node *temp=head;
   printf("List is-");
   while(temp!=NULL)
   {
      printf("%d",temp->info);
      temp=temp->next;
   }
}

Upvotes: 0

Views: 107

Answers (4)

HAP
HAP

Reputation: 1

You could also redefine your node struct to include next, prev, head, and tail pointers and manipulate them appropriately.

In your case, you should only need to set the head pointer on the tail node and the tail pointer on the head node. Set next and prev on all nodes. head pointer on head node should point to itself; tail pointer on tail node should point to itself. Head->prev = NULL; Tail->next = NULL;

Then just pass the head pointer always to your insertatend func.

Upvotes: 0

rfreytag
rfreytag

Reputation: 1193

Your "temp != NULL" will never become false after the insertion, because in that insertion you set the next pointer to itself, thus creating a link loop.

it should be more like this:

void insertatend(int x)
{
    node *ptr;
    ptr=malloc(sizeof(node)); //don't cast pointers returned by malloc
    ptr->info=x;
    ptr->next=NULL; //set next node pointer to NULL to signify the end
    if(head==NULL)
    {
      head=ptr;
    }
    else
    {
      node* tmp = head;
      while(tmp->next) tmp = tmp->next; //get last node
      tmp->next=ptr; //attach new node to last node
    }
}

also your else branch was incorrect, creating another link loop.

Upvotes: 1

Rerito
Rerito

Reputation: 6086

Consider your insert method (I will take head as a parameter here instead of a global)

void insertatend(node **hd, int x) {
    node *ptr = NULL, *cur = NULL;
    if (!(ptr = malloc(sizeof (node)))) {
        return;
    }
    if (!*hd) {
        *hd = ptr;
    } else {
        cur = *hd;
        while (cur->next) {
            cur = cur->next;
        }
        cur->next = ptr;
    }
}

You need to traverse your list from the end to its back in order to perform the insertion correctly. (Hence the while loop in the above function).

Upvotes: 1

David Ranieri
David Ranieri

Reputation: 41055

You need to pass the last element of the list:

void insertatend(node *last, int x)

Or put a a tail node as global:

node *head = NULL;
node *tail = NULL;

void insertatend(int x)
 {
    node *ptr;
    ptr = malloc(sizeof(node)); /* Don't cast malloc */
    ptr->info = x;
    ptr->next = NULL;
    if (head == NULL) {
       head = ptr;
    } else {
       tail->next = ptr;
    }
    tail = ptr;
}

Upvotes: 0

Related Questions