2

I'm having a problem with my insertion on linked list. Here is my code:

    for(j = 0; j < SIZE; j++) {
        body = (textFile*) malloc (sizeof(textFile));
        body->word = words[index[j]];
        if(head == NULL) {
            head = tail = body;
        }
        else {
            tail->next = body;
            tail = body;   
            cout << tail->word << endl;
        }
    }

What hapens here is that the program crashes after it displays the 15th element on my linked list... I don't know why. index is declared as index[20] = {0}; and SIZE is defined as 20, so the linked list is supposed to contain all 20 words inside words array. What can be its possbile cause? Could it be memory allocation? Thanks in advance :)

Heres more of my code. Sorry I'm a little ashamed to post it I'm not good in code elegance. Pardon.

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    #define SIZE 20

    using namespace std;

    struct textFile {
        string word;
        struct textFile *next;
    };

    textFile *head, *body, *tail, *temp;

    int main() {
        ifstream wordFile("WORDS.txt", ios::in); // file object constructor
        /* stores words in the file into an array */
        string words[SIZE];
        char pointer;
        int i;
        for(i = 0; i < SIZE; i++) {
            while(wordFile >> pointer) {
                if(!isalpha(pointer)) {
                    pointer++;
                    break;
                }
                words[i] = words[i] + pointer;
            }
        }
        /* stores the words in the array to a randomized linked list */
        srand(time(NULL));
        int index[SIZE] = {0}; // temporary array of index that will contain         randomized indexes of array words
        int j = 0, ctr;
        // assigns indexes to array index
        while(j < SIZE) {
            i = rand() % SIZE;
            ctr = 0;
            for(int k = 0; k < SIZE; k++) {
                if(!i)
                    break;
                else if(i == index[k]) { // checks if the random number has         previously been stored as index
                    ctr = 1;
                    break;
                }
            }
            if(!ctr) {
                index[j] = i; // assigns the random number to the current         index of array index
                j++;
            }
        }
        /* makes sure that there are no double zeros on the array */
        ctr = 0;
        for(i = 0; i < SIZE; i++) {
            if(!index[i])
                ctr++;
        }
        if(ctr > 1) {
            int temp[ctr-1];
            for(j = 0; j < ctr-1; j++) {
                for(i = 0; i < SIZE; i++) {
                    if(!index[i]) {
                        int ctr2 = 0;
                        for(int k = 0; k < ctr-1; k++) {
                            if(i == temp[k])
                                ctr2 = 1;
                        }
                        if(!ctr2)
                            temp[j] = i;
                    }
                }
            }
            j = ctr - 1;
            while(j > 0) {
                i = rand() % SIZE;
                ctr = 0;
                for(int k = 0; k < SIZE; k++) {
                    if(!i || i == index[k]) {
                        ctr = 1;
                        break;
                    }
                }
                if(!ctr) {
                    index[temp[j-1]] = i;
                    j--;
                }
            }
        }
        head = tail = body = temp = NULL;
        for(j = 0; j < SIZE; j++) {
            body = (textFile*) malloc (sizeof(textFile));
            body->word = words[index[j]];
            if(head == NULL) {
                head = tail = body;
            }
            else {
                tail->next = body;
                tail = body;
                cout << tail->word << endl;
            }
            }
            temp = head;
        while(temp != NULL) {
            cout << temp->word << endl;
            temp = temp->next;
        }
        return 0;
    }
  • What is the output of the application? – David B Sep 25 '12 at 03:45
  • Does your IDE, platform or debugger provide you with a crash report? – Dai Sep 25 '12 at 03:45
  • It outputs the first fifteen words in my array. After that is stops working then I have to force it to quit. :( – Aji Maglanque Sep 25 '12 at 03:49
  • @Dai No. It says it can't find a solution. My OS is Windows 7 Starter. – Aji Maglanque Sep 25 '12 at 03:50
  • @MarcCohen string words[SIZE]; – Aji Maglanque Sep 25 '12 at 03:54
  • 2
    What is the array `index[]`? Why do you need that rather than just index the words array directly like `words[j]` instead of `words[index[j]]`? Maybe you can post more of your code – mikeyq6 Sep 25 '12 at 03:57
  • I agree with mikeyq6's comment. Please post more code. – Jay Sep 25 '12 at 04:01
  • 1
    Also, it looks as though you are setting the tail as well as the next Node to both be body. – mikeyq6 Sep 25 '12 at 04:04
  • I used the pointer tail so it points to the end of the linked list... So in the next loop, the new body will be pointed to by the tail->next... I really can't determine where it's going wrong. :( – Aji Maglanque Sep 25 '12 at 04:09
  • Maybe try printing out the contents of index[] to make sure there isn't anything going wrong there – mikeyq6 Sep 25 '12 at 04:19
  • 1
    an unrelated notes: `pointer++;break;` have no effect. this value never read again. – J-16 SDiZ Sep 25 '12 at 04:24
  • @J-16SDiZ Sir because the text file WORDS.txt contains words with a period in the end... That's why we need to break the loop, so only the alphabetic characters will be stored into the array. :) – Aji Maglanque Sep 25 '12 at 11:47
  • 1
    @AjiPorter, the point is... `pointer` is never read again. – J-16 SDiZ Sep 26 '12 at 07:07
  • @J-16SDiZ Ooohh I suddenly felt like I'm finally enlightened, I understand now. So what you're pointing out is the `break` does its job without the `pointer++;` block. Thank you! Saved me 3 lines of code. :) – Aji Maglanque Sep 26 '12 at 09:19

1 Answers1

4

The problem is with the way you are initializing the body struct:

body = (textFile*) malloc (sizeof(textFile));

The string doesn't get initialized, causing the segmentation fault when you try to assign to it. You should use the C++ new keyword instead:

body = new textFile;

The new keyword will assign memory for the struct as well as any object references contained in it.

Also see here

Community
  • 1
  • 1
mikeyq6
  • 1,138
  • 13
  • 27
  • Thank you so much Sir! Can I ask a follow-up question? Why is the string not initialized with malloc? I checked out the link you gave, but the terms were too technical for me, like non-trivial constructor and a lot more. I'm really thinking I'd learn more here in stackoverflow than in my class. :)) – Aji Maglanque Sep 25 '12 at 11:52
  • What is the difference between 'body = (textFile*) malloc (sizeof(textFile));' and 'body = new textFile'? Sorry about this but it is my first encounter with new; it wasn't discussed yet in our class. :( – Aji Maglanque Sep 25 '12 at 13:36
  • I just realized I'm an idiot. `body = (textFile*) malloc (sizeof(textFile));` is for C and `body = new textFile` is for C++. Sorry I just found this by searching on other linked list questions in SO. Thanks again @mikeyq6! :) Here's the link where I got enlightened: http://stackoverflow.com/questions/9662738/remove-all-nodes-in-linked-list?rq=1 :D – Aji Maglanque Sep 25 '12 at 13:50
  • No worries :) Yeah, malloc is from C, but perfectly acceptable to use in C++ as well if you used a C-style string in your struct, ie. `char *word` Don't forget to release the memory you assigned to your Nodes as well, at the end of your program by using the `delete` keyword. – mikeyq6 Sep 26 '12 at 03:44