Joshua
Joshua

Reputation: 83

Why is a garbage value included in my linked list

In program, the first node's element is always garbage, I have been trying to search for a solution but I couldn't find any. I've been trying to check it a bunch of times but it just doesn't work.

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

typedef struct nd{
    int elem;
    struct nd * next;
} nodeType;

typedef struct listT{
    nodeType *head;
    int elemCtr;
} listType;

void input(nodeType **head);
void segregate(nodeType *head, listType *odd, listType *even);
void display(nodeType *head, listType odd, listType even);
int main(){
    listType odd, even;
    nodeType *head;
    odd.head=NULL;
    even.head=NULL;
    head = NULL;
    input(&head);
    segregate(head, &odd, &even);
    display(head, odd, even);
}

void input(nodeType **head){
    printf("\nPlease input numbers input 0 if you wish to end the inputting process.:\n");
    int x;
    scanf("%d", &x);
    for(;x!=0;){    
    nodeType *newnode;
    newnode = (nodeType*)malloc(sizeof(struct nd));
    newnode->elem=x;
    newnode->next=*head;    
    *head=newnode;
    scanf("%d", &x);
    }
}

void segregate(nodeType *head, listType *odd, listType *even){
    nodeType **trav;
    for(*trav=head;*trav!=NULL;trav=&(*trav)->next){
        if((*trav)->elem%2==0){
                nodeType *newnode;
                newnode = (nodeType*)malloc(sizeof(struct nd));
                newnode->elem = (*trav)->elem;
                newnode->next = even->head;
                even->head = newnode;
            }
        else{
                nodeType *newnode;
                newnode = (nodeType*)malloc(sizeof(struct nd));
                newnode->elem = (*trav)->elem;
                newnode->next = odd->head;
                odd->head = newnode;
        }
    }
}

void display(nodeType *head, listType odd, listType even){
    printf("\nAll numbers :");
    nodeType **trav;
    for(trav=&head;*trav!=NULL;trav=&(*trav)->next){
        printf("\n%d", (*trav)->elem);
    }
    printf("\nEven numbers :");
    for(trav=&even.head;*trav!=NULL;trav=&(*trav)->next){
        printf("\n%d", (*trav)->elem);
    }
    printf("\nOdd numbers :");
    for(trav=&odd.head;*trav!=NULL;trav=&(*trav)->next){
        printf("\n%d", (*trav)->elem);
    }
}

I have also tried running the code without the segregate and the display function and I realized that it doesn't change the first node's elem to garbage. I have no idea what could be the problem.

Upvotes: 2

Views: 358

Answers (2)

Rami ZK
Rami ZK

Reputation: 560

I guess that your mistake that you are declaring the trav variable as a pointer to pointer to nodetype , and it should be just a pointer to node type I modified your code and it worked fine here it is.

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

typedef struct nd{
    int elem;
    struct nd * next;
} nodeType;

typedef struct listT{
    nodeType *head;
    int elemCtr;
} listType;

void input(nodeType **head);
void segregate(nodeType *head, listType *odd, listType *even);
void display(nodeType *head, listType odd, listType even);
int main(){
    listType odd, even;
    nodeType *head;
    odd.head=NULL;
    even.head=NULL;
    head = NULL;
    input(&head);
    print(head);
    segregate(head, &odd, &even);
    display(head, odd, even);
}
void input(nodeType **head){
    printf("\nPlease input numbers input 0 if you wish to end the inputting process.:\n");
    int x;
    scanf("%d", &x);
    for(;x!=0;){
    nodeType *newnode;
    newnode = (nodeType*)malloc(sizeof(struct nd));
    newnode->elem=x;
    newnode->next=*head;
    *head=newnode;
    scanf("%d", &x);
    }
}

void segregate(nodeType *head, listType *odd, listType *even){
    nodeType *trav;
    for(trav=head;trav!=NULL;trav=trav->next){
        if(trav->elem%2==0){
                nodeType *newnode;
                newnode = (nodeType*)malloc(sizeof(struct nd));
                newnode->elem = trav->elem;
                newnode->next = even->head;
                even->head = newnode;
            }
        else{
                nodeType *newnode;
                newnode = (nodeType*)malloc(sizeof(struct nd));
                newnode->elem = trav->elem;
                newnode->next = odd->head;
                odd->head = newnode;
        }
    }
}

void display(nodeType *head, listType odd, listType even){
    printf("\nAll numbers :");
    nodeType *trav;
    for(trav=head;trav!=NULL;trav=trav->next){
        printf("\n%d", trav->elem);
    }
    printf("\nEven numbers :");
    for(trav=even.head;trav!=NULL;trav=trav->next){
        printf("\n%d", trav->elem);
    }
    printf("\nOdd numbers :");
    for(trav=odd.head;trav!=NULL;trav=trav->next){
        printf("\n%d", trav->elem);
    }
}

Upvotes: 1

2501
2501

Reputation: 25752

Variable trav is uninitialized in function segregate, causing undefined behavior:

nodeType **trav;
for(*trav=head ...

I haven't walked throughout the code, but did you mean:

nodeType** trav = &head;

Upvotes: 3

Related Questions