目标是按字母顺序对一维单词矩阵中的单词i x j矩阵进行排序(原始矩阵中的每一行都已排序)。矩阵是从文件中读取的,并存储在三星指针***index
中,它是这样动态分配的(在单独的函数中):
char ***index;
index= (char ***) malloc(*row * sizeof(char **));
...
for (int i = 0; i < *row; ++i){
index[i]= (char **) malloc(*col * sizeof(char **));
for (int j=0; j<*col; j++) {
fscanf(fp,"%s",tmp);
index[i][j]=strdup(tmp);
}
}
然后我将索引传递给排序函数:char **sort_data(char ***index, int row,int col)
。
只是以下一种合并排序算法没什么特别的:
***index
每行的前几个元素**sortedIndex
将排序后的单词替换为同一行中的新单词。
char **sort_data(char ***index, int row,int col){
int i,posInIndex,smallestCharPos,*tracker;
char **sortedindex,*buffer;
sortedindex=(char **) malloc((row*col)*sizeof(char*));
tracker= (int*) calloc(row, sizeof(int));
posInIndex=0;
while (posInIndex<row*col) {
smallestCharPos=-1;
for (i=0; i<row; i++) {
if ((smallestCharPos==-1)||(strcmp(index[i][tracker[i]], buffer)<0)) {
smallestCharPos=i;
buffer=index[i][tracker[i]];
}
}
sortedindex[posInIndex]=index[smallestCharPos][tracker[smallestCharPos]];
posInIndex++;
tracker[smallestCharPos]++;
}
free(tracker);
return (sortedindex);
}
在for循环的某些迭代(取决于矩阵大小)之后,我在EXC_BAD_ACCESS (code=1, address=0x14000001f5)
语句中得到了if
,这使我相信这是我的内存分配问题,但我无法发现错误。
一个要排序的矩阵的例子是(这个特殊的矩阵在for
循环10次迭代后给我带来麻烦):
米兰都灵威尼斯
巴里·热那亚·塔兰托
佛罗伦萨那不勒斯罗马
博洛尼亚卡利亚里·巴勒莫
答案 0 :(得分:0)
问题在于,您在完成一行操作后不会跟踪。即使您已经用完一行中的所有单词,您也可以继续查看该行,好像还有更多单词要处理。
您需要添加一些代码以跳过已经完全处理的行。
尝试更改此内容:
if ((smallestCharPos==-1)||(strcmp(index[i][tracker[i]], buffer)<0)) {
...
}
到
if (tracker[i] < col)
{
if ((smallestCharPos==-1)||(strcmp(index[i][tracker[i]], buffer)<0)) {
...
}
}