0

Alrighty, first off, I am 100% positive that it is not my print function that is messing up this program, but my output is printing "pre" and then segfaulting. I believe that it's happening within my create_list function. My logic in that function is that the array (the linked-list typedef is Node, so head is Node*, the array that holds the heads is Node**) holds the heads of several different linked-lists, and stores each branch according to the index (first number in the input). But obviously my logic in programming isn't equal to what I'm thinking. Any assistance would be great, thanks.

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

    if ( argc != 2 ) {
        printf("Insufficient arguments.\n");
        return 0;
    }

    FILE* fp = fopen(argv[1], "r"); 
    printf("here");
    while(fp == NULL){
        char file[MAX_FILE_LENGTH];
        printf("Unable to open file, enter a new file name: ");
        scanf("%s", file); 
        fp = fopen(file, "r");
    }
    Node** array = NULL; 
    int length = create_list(array, fp);

    fclose(fp); 

    printf("pre\n");

    print_list(array, length);

    return 0;

    }
int create_list(Node** array, FILE* fp){ 
    int length, i, index, value;

    fscanf(fp, "%d\n", &length); 

    array = malloc(sizeof(Node*)*length); //allocate memory for the pointers

    for(i = 0; i < length; i++){

        array[i] = NULL; //set all the pointers to null
    }

    while ( !feof(fp) ) //until it reaches eof
    {

        fscanf(fp, "%d %d\n", &index, &value);

        Node* node = new_node(value); //get the node

        if ( array[index] == NULL ) { //if nothing is in there yet at the index

            array[index] = node; //make whatever is at the index this node

        }

        else { //otherwise
            Node* head = array[index]; //head equals the thing
            while ( head->next != NULL ) { //go through the list until next is null
                head = head->next;
            }
            head->next = node; //then make that null next point to the new node

        }

    }

    return length;
}

void print_list(Node** array, int length){
    int i;
    for(i = 0; i < length; i++){
        Node* curr = array[i]; //make the head what's stored in the array

        printf(" %d ", i); //index

        printf("%d ->", curr->value); //print the value

        curr = curr->next; //move it
    }
}
  • 1
    1. Your create function doesn't pass the array base pointer by address. Either return the new array base as a function result or pass the base pointer address. 2. This: [`while ( !feof(fp) )` is wrong.](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong). – WhozCraig Mar 27 '14 at 08:20

1 Answers1

1

One problem is here:

Node** array = NULL; 
int length = create_list(array, fp);

Parameters are passed by value, which means that you pass NULL to create_list, and array will still be NULL when create_list returns.

There are several ways to fix this. For example like this:

Node** array = NULL; 
int length = create_list(&array, fp);

And:

int create_list(Node*** arrayp, FILE* fp){ 
    int length, i, index, value;
    Node **array;

    fscanf(fp, "%d\n", &length); 

    array = *arrayp = malloc(sizeof(Node*)*length); //allocate memory for the pointers
Klas Lindbäck
  • 33,105
  • 5
  • 57
  • 82
  • Thanks. You fixed the problem that I addressed, but apparently there were more problems as stated in the next answer. – soulkingbrook Mar 27 '14 at 17:16
  • I didn't review the entire code. That's why I said "One problem" and not "The problem". There are usually more than one (speaks from experience). – Klas Lindbäck Mar 28 '14 at 07:34