Home > OS >  What is the logical error in my attempt to implement the insertion of nodes in the linked list?
What is the logical error in my attempt to implement the insertion of nodes in the linked list?

Time:11-21

I'm unable to get an output for inserting nodes at the beginning, end, and after a given node. I'm not very sure if there is anything that I missed out in the main(). I'm unable to point out my logical error in the program `

#include<stdio.h>
#include<stdlib.h>

struct node{
    int data;
    struct node *next;
};

//Inserts at the begining
void push(struct node **head, int x){
    struct node *newnode = (struct node *)malloc(sizeof(struct node));
    newnode->data = x; 
    *head = newnode;
    newnode->next = (*head);
    *head = newnode;
}

//Insert at the last 
void append(struct node **head, int x){
    struct node *temp;
    struct node* newnode = (struct node*)malloc(sizeof(struct node));
    newnode->data = x;
    newnode->next = 0;
    if(*head == 0){
        *head = newnode;
    }
    temp = *head;
   while(temp->next != 0){
        temp = temp->next;
   }
   temp->next = newnode;
}

//inserting at a given node 
void insertAfter(struct node* temp, int x){
    if(temp == NULL){
        printf("previous node cannot be NULL");
    }
    struct node* newnode = (struct node*)malloc(sizeof(struct node));
    newnode->data = x;
    newnode->next = temp->next;
    temp->next = newnode;   
}

void printList(struct node *temp){
    while(temp->next != NULL){
        printf("%d",temp->data);
    }
    temp = temp->next;
}

int main(){
    struct node *head = NULL;
    append(&head,6);
    push(&head, 7);
    push(&head, 1);
    append(&head, 4);
    insertAfter(head->next, 8);
    printf("Created linked list is:\n"); 
    printList(head);
    return 0;
}

`

The output is 1 7 8 6 4

But I'm getting no output and no errors as well

CodePudding user response:

Within the function print_list there can be an infinite loop because this statement

temp = temp->next;

is placed after the while loop

void printList(struct node *temp){
    while(temp->next != NULL){
        printf("%d",temp->data);
    }
    temp = temp->next;
}

The function can look for example the following way

void printList( const struct node *head )
{
    for ( ; head != NULL; head = head->next )
        printf( "%d -> ", head->data );
    }
    puts( "null" );
}

Pay attention to that within the function push this statement

*head = newnode;

is present twice.

Also the functions are unsafe because there is no check whether memory was allocated successfully within the functions.

For example the function append could be declared and defined the following way

//Insert at the last 
int append( struct node **head, int x )
{
    struct node *newnode = malloc( sizeof( *newnode ) );
    int success = newnode != NULL;

    if ( success )
    {
        newnode->data = x;
        newnode->next = NULL;

        while ( *head != NULL ) head = &( *head )->next;

        *head = newnode;
    }

    return success;
}
  • Related