Saturday, 20 August 2016

printing - Inserting Node Linked List C



I am trying to create a linked list which stores name and age of a student.
I am having trouble with insertion.




#include 
#include
#include
#include

typedef struct node{

char Name[50];
int studentAge;

struct node* next;

}MyNode;


this is how i defined my Struct which constains the requried data and a pointer 'next' which points to the next node.



Below is my insertion function
so in the first if condition i am saying if there isnt a head ie head = NULL then create memory space for the head using malloc.. after this i copy all the data into the head node and making sure that the next of head points to null.




In the second condition i am saying if there is a head ie Head ! = NULL
then traverse the list to the end using the current pointer and then copy all the data in.



void InsertStudent(char givenName[50], int age, MyNode* head){

if(head == NULL){
head = (MyNode*) malloc(sizeof(MyNode));
strcpy(head->Name,givenName);
head->studentAge = age;
head->next = NULL;

}


if(head != NULL){
MyNode* current = head;
while(current->next != NULL){
current = current->next;
}
current->next = (MyNode*) malloc(sizeof(MyNode));
strcpy(current->next->Name,givenName);

current->next->studentAge = age;
current->next->next = NULL;
}

}


Now i am not sure if there is a problem in my printing or inserting because it doesn't print my nodes when i try the code out



void PrintList(MyNode* head){

MyNode* current = head;

while(current != NULL){
printf("Name is %s Age is %d\n",current->Name,current->studentAge);
current = current->next;
}

}



this is my main function.. is there a problem with the MyNode* head = NULL; line of code is that allowed?



  int main()
{


MyNode* head = NULL;

int r = 0;
while(r!=1)

{
printf("Data Structures - Linked List\n");
printf("Choose one Option:\n\n");
printf("1.Insert Student\n");
printf("2.Remove Student\n");
printf("3.Print all student\n");
printf("4.Exit\n");

int option=0;
char givenName[50];

int givenAge;
scanf("%d",&option);

switch(option){

case 1:
printf("Enter name of student: ");
scanf("%s",givenName);
printf("\nEnter Age of student: ");
scanf("%d",&givenAge);

InsertStudent(givenName,givenAge,head);
break;

case 2:
printf("Enter name of student: ");
scanf("%s",givenName);
printf("\nEnter Age of student: ");
scanf("%d",&givenAge);
RemoveStudent(givenName,givenAge);
break;


case 3:
PrintList(head);
break;
case 4:
r=1;
break;
default:
r=1;
printf("\nNot an option\n");

break;

}

}
}

Answer



You're not setting the initial value of the head pointer to the first node, and since that is never done, the list remains empty and you leak memory like a sieve leaks rain water.




As you have communicated you want to use pointer-to-pointer syntax, the result should look like this . (sans error checking, which you shoudl probably consider adding):



void InsertStudent(char givenName[50], int age, MyNode** head)
{
while (*head)
head = &(*head)->next;

*head = malloc(sizeof **head);
strcpy((*head)->Name, givenName);
(*head)->studentAge = age;

(*head)->next = NULL;
}


Invoked from your main program using the address of the head pointer (do NOT confused that with the address held in the head pointer which you're initially setting to NULL correctly; think of the latter a value held by a pointer, the former as a residence where the head pointer itself is in memory).



InsertStudent(givenName,givenAge, &head); // NOTE THIS


I leave the task of removal and list cleanup.



No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...