Reputation: 83
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
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
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