1
struct Node
{
    int id;
    char name[25];
    int age;
    int No;
    int RoomNo;
    struct Node* next;

};

void PrintList(struct Node *temp)
{


    while(temp->next!=NULL)
    {
        printf("ID: %d \n", temp->id);
        printf("Name: %s\n", temp->name);
        printf("Age: %d\n", temp->age);
        printf("No: %d\n", temp->No);
        printf("Room No: %d\n", temp->RoomNo);
        temp = temp->next;
        printf("-----------\n");
    }
    printf("\n\n");
}


int main()
{
    int i;
    FILE *fptr;
    fptr = fopen("test.txt", "r");
    struct Node *List = (struct Node *) malloc(sizeof(struct Node *));
    List->next = NULL;
    struct Node *temp;
    temp = List;
    for(i=0;i<3;i++)
    {
        temp ->next = (struct Node *) malloc(sizeof(struct Node *));

        fscanf(fptr, "%d;%[^;];%d;%d;%d", &temp ->id, temp ->name, &temp ->age, &temp ->No, &temp ->RoomNo);

        temp = temp ->next;

        temp ->next = NULL;

        getc(fptr);
    }

    PrintList(List);
}

This is the content of txt file. I want to store each data in a linked list like "List->id = 5 List->name Carl" like that. When there is a new line program should create another node and store the second line into second node. It goes like that. But with the code above I can only store the first line.

5;Carl;24;22410392;322
12;Jack;30;22410394;400
6;Adam;42;22513392;295

ID: 5
Name: Carl
Age: 12
No: 1801675082
Room No: 256
-----------
ID: 12
Name: Jack
Age: 6
No: 1835099201
Room No: 256
-----------
ID: 6
Name: Adam
Age: 42
No: 22513392
Room No: 295
-----------

This is the output, only the id and name are correct for the first two. But the last one is correct for some reason.

1 Answers1

2

The size calculations in the lines

    struct Node *List = (struct Node *) malloc(sizeof(struct Node *));
        temp ->next = (struct Node *) malloc(sizeof(struct Node *));

are wrong. You must allocate for the structure, not the pointer, per element.

They should be:

    struct Node *List = malloc(sizeof(*List));
        temp ->next = malloc(sizeof(*temp->next));

or if you want to stick with using type name with sizeof:

    struct Node *List = malloc(sizeof(struct Node));
        temp ->next = malloc(sizeof(struct Node));

Also note that casting results of malloc() in C is discouraged.

MikeCAT
  • 73,922
  • 11
  • 45
  • 70