Search code examples
clinked-listcharchar-pointer

Difference between char, char* inside Linked Lists


I created a linked list that hold int and char type data. A function adds the data to the list and the other prints it out. When i only print the int type i get no problems but when i try to also print the char type the program crashes.

So it has to do the way i'm defining the char* in the printing function print_list().

To be more specific my problem is here in print_list() :

printf("\n [%s] \n", ptr -> name);
printf("\n [%s] \n", ptr -> lastn);

So my actual code is (getting 0 errors and 0 warnings but the program crashes):

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

// Creating structure for node 
struct test_struct 
{ 
    int val;         // val is member id number 
    char name; 
    char lastn; 
    int age; 
    struct test_struct *next; 
}; 

// declaring global head and curr pointers 
struct test_struct *head = NULL; 
struct test_struct *curr = NULL; 

// creating a list 
struct test_struct* create_list(int val, char* name, char* lastn, int age) 
{ 
    printf("\n creating list with head node as [%d] [%s] [%s] [%d] \n", val, name, lastn, age); 

    struct test_struct *ptr = malloc(sizeof(struct test_struct)); // creating list 
    if(NULL == ptr) { 
        printf("\n Node creation failed \n"); 
        return NULL; 
    } 

    ptr->val = val; 
    ptr->name = *name; 
    ptr->lastn = *lastn; 
    ptr->age = age; 
    ptr->next = NULL; 

    head = curr = ptr; 

    return ptr; 
}

// add member to list 
struct test_struct* add_to_list(int val, char *name, char *lastn, int age, bool add_to_end) 
{ 
    if(NULL == head) { 
        return (create_list(val, name, lastn, age)); 
    }      

    if(add_to_end) { 
        printf("\n Adding node to end of list with data [%d] [%s] [%s] [%d] \n",  val, name, lastn, age); 
    } else { 
        printf("\n Adding node to beginning of list with data [%d] [%s] [%s] [%d] \n", val, name, lastn, age); 
    } 

    struct test_struct *ptr = malloc(sizeof(struct test_struct)); 

    if(NULL == ptr) { 
        printf("\n Node creation failed \n"); 
        return NULL; 
    } 

    ptr->val = val; 
    ptr->name = *name; 
    ptr->lastn = *lastn; 
    ptr->age = age; 
    ptr->next = NULL; 

    if (add_to_end) { 
        curr-> next = ptr; 
        curr = ptr; 
    } else { 
        ptr -> next = head; 
        head = ptr; 
    } 

    return ptr; 
} 

//printing the list 
void print_list(void) 
{ 
    struct test_struct *ptr = head; 

    printf("\n -----Printing list Start----- \n"); 

    while(ptr != NULL) { 
        printf("\n [%d] \n", ptr -> val); 
        printf("\n [%s] \n", ptr -> name); 
        printf("\n [%s] \n", ptr -> lastn); 
        printf("\n [%d] \n", ptr -> age); 
        ptr = ptr->next; 
    } 

    printf("\n -----Printing list end---- \n"); 

    return; 
}   

// main function 
int main(void) 
{ 
    struct test_struct *ptr = NULL; 

    // for adding member to list 
    add_to_list(123, "william", "shakespeare", 30, true); 
    add_to_list(124, "william", "gibson", 35, true); 
    add_to_list(125, "chuck", "palahniuk", 40, true); 
    add_to_list(126, "mario", "puzio", 50, true); 
    add_to_list(127, "umberto", "eco", 60, true); 
    add_to_list(128, "ezra", "pound", 125, true); 

    print_list(); 

    return 0; 
}  

Solution

  • You have declared name and lastn as single characters

    struct test_struct
    {
    int val;         // val is member id number
    char name;
    char lastn;
    int age;
    struct test_struct *next;
    };
    

    you need to declare them either as fixed size arrays or pointers which point to allocated space to hold the strings. A string is a series of characters terminated by a \0.

    struct test_struct
    {
    int val;         // val is member id number
    char name[MAXLEN];
    char lastn[MAXLEN];
    int age;
    struct test_struct *next;
    };
    

    then copy arguments to the function to the fields in the struct

    e.g.

    strcpy(ptr->name,name);
    strcpy(ptr->lastn,lastn);