Dawson
Dawson

Reputation: 457

Adding node to global linked list causing crash

I'm trying to add items to a linked list. The code compiles OK but when I execute the program, it crashes before adding the first node. The code looks OK to me but I must be missing something.

The code uses a global linked list which is necessary for this problem. I think my usage of it may be what is causing the crash.

main.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkedList.h"

int main (int argc, char* argv[])

{
    LinkedList *canQueue;
    int ii;
    createList();

    FILE* f;
    f = fopen(argv[1], "r");

    if(f==NULL) 
        {
        printf("Error: could not open file");
        return 0;
        }


    for(ii = 0; ii < 10; ii++)
        {
        TinCan* tempCan = malloc(sizeof(TinCan));
        fscanf(f, " label_%d", &tempCan->label); /*Read info from file into label field*/
        insertLast(canQueue, tempCan); /*Inserts the new can into linked list*/
        }

    return 0;
}

LinkedList.h

typedef struct TinCan
    {
    int label;
    } TinCan;

typedef struct Node
    {
    TinCan* data;
    struct Node *next;
    } Node;

typedef struct LinkedList
    {
    Node *head;
    } LinkedList;


void insertLast(LinkedList* list, TinCan *newData);
void createList();

extern LinkedList* canQueue;

LinkedList.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkedList.h"

LinkedList *canQueue;

void createList() /*creates empty linked list*/
  {
    canQueue = malloc(sizeof(LinkedList));
    canQueue->head = NULL;
  }

void insertLast(LinkedList* list, TinCan *newData)
    {
    Node* newNode = malloc(sizeof(Node));
    newNode->data = newData;
    newNode->next = NULL;

    if(list->head==NULL)
        {
        list->head=newNode;
        }

        else
            {
            Node* temp;
            temp = list->head;
            while(temp->next!=NULL)
                {
                temp = temp->next;
                }
             temp->next = newNode;
            }
  printf("Added to end");
  }

Upvotes: 2

Views: 273

Answers (1)

Shafik Yaghmour
Shafik Yaghmour

Reputation: 158469

Based on your response, you need to remove this declaration from main:

LinkedList *canQueue;

It is shadowing the global canQueue, which means later on when you call insertLast:

insertLast(canQueue, tempCan);

you are operating on an unintialized pointer.

Upvotes: 1

Related Questions