kalvin
kalvin

Reputation: 25

Linked list append function adding an extra empty node at the beginning

            struct node{

                char name[50];
                double grade;
                struct node* next;


            };





            void append(struct node* root){

                int n;

                printf("Enter the number of students: ");
                scanf("%d",&n);

                while(n !=0){

                    struct node* temp;

                    temp=(struct node*)malloc(sizeof(struct node));

                    printf("\nEnter the name of the student: ");
                    scanf("%s",&temp->name);
                    printf("\nEnter the grade for the student named %s: ",temp->name);
                    scanf("%f",&temp->grade);
                    temp->next=NULL;

                    if(root==NULL){
                       root=temp;
                    }else{
                        struct node* iterate=root;

                        while(iterate->next != NULL){

                            iterate=iterate->next;
                        }

                        iterate->next=temp;

                    }

                n--;
                }


            }

int listLength(struct node* root){

    struct node* temp = root;
    int counter=0;

    while(temp !=NULL){

        counter++;
        temp=temp->next;
    }

    return counter;

}

      int main()
        {
            struct node* root = NULL;

            append(&root);
            //printList(&root);
            printf("Node length: %d",listLength(&root));
            return 0;
        }

This is what I have so far as I'm starting out with linked lists. I tried to make it so I can append to multiple linked lists with the function. So I'd just create a different root pointer in main and call the append function with it as a parameter to add nodes.

This seems to work, however, it adds an extra empty node at the beginning of the list. This node doesn't contain any data. So for example, if I add 4 students to the list the nodeLength function would return 5.

Upvotes: 1

Views: 183

Answers (2)

user2736738
user2736738

Reputation: 30926

        struct node{
            char name[50];
            double grade;
            struct node* next;
        };
        struct node * append(struct node* root){
            int n;
            printf("Enter the number of students: ");
            scanf("%d",&n);
            while(n !=0){
               struct node* temp;
                temp=(struct node*)malloc(sizeof(struct node));
                printf("\nEnter the name of the student: ");
                scanf("%s",&temp->name);
                printf("\nEnter the grade for the student named %s: ",temp->name);
                scanf("%f",&temp->grade);
                temp->next=NULL;
                if(root==NULL){
                   root=temp;
                }else{
                    struct node* iterate=root;
                    while(iterate->next != NULL){
                        iterate=iterate->next;
                   }
                    iterate->next=temp;
                    root=iterate;
                }
            n--;
            }
      return root;            }

 int nodeLength(struct node* root){
       struct node* temp = root;
       int counter=0;
       while(temp !=NULL){
           counter++;
           temp=temp->next;
       }
      return counter;
}
int main()
{
      struct node* root = NULL;
      root= append(root);
      //printList(&root);
      printf("Node length: %d",nodeLength(root));
      return 0;
}

Check this code to understand a bit. Will explain more.

And don't cast the return type of malloc.

Here what you are doing will work fine for if you correctly changed the parameter to struct node** but yes it can be done more easily like this(example shown above). It's natural and more intuitive rather than using double pointer.

Upvotes: 1

gsamaras
gsamaras

Reputation: 73366

Change this:

void append(struct node* root)

to this:

void append(struct node** root)

so that you make the changes last even when append() terminates.

Of course then you will have to use *root instead of root inside the body of that function.


PS: Do I cast the result of malloc? No.

Upvotes: 2

Related Questions