第15次循环后出现链表运行时错误

Linked List Runtime Error after 15th Loop

本文关键字:链表 运行时错误 15次 循环      更新时间:2023-10-16

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

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,所以链表应该包含单词数组中的所有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;
}

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

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

字符串未初始化,导致在尝试分配时出现分段错误。您应该使用C++new关键字:

body = new textFile;

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

另请参见此处