2

我在链表上插入时遇到问题。这是我的代码:

    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;
        }
    }

这里发生的是程序在我的链表上显示第 15 个元素后崩溃......我不知道为什么。索引被声明为 index[20] = {0}; 并且 SIZE 定义为 20,因此链表应该包含单词数组中的所有 20 个单词。可能的原因是什么?会不会是内存分配?提前致谢 :)

这是我的更多代码。对不起,我有点羞于发布它我不擅长代码优雅。赦免。

    #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;
    }
4

1 回答 1

4

问题在于您初始化主体结构的方式:

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

字符串没有被初始化,当您尝试分配给它时会导致分段错误。您应该改用 C++new关键字:

body = new textFile;

new关键字将为结构以及其中包含的任何对象引用分配内存。

也见这里

于 2012-09-25T05:03:57.010 回答