リンクリストへの挿入に問題があります。これが私のコードです:
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はindex[20]={0}として宣言されています。SIZEは20として定義されているため、リンクリストにはwords配列内に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;
}