mallocの動作について
RadixSort(基数ソート)で名簿のソートを行うプログラムを書いています。
Queueの挿入操作をする関数enqueueで処理が滞ってしまいます。
コンパイルは通りますが、どうやら「ココ→」(2箇所に書いておきました)で示した行が原因で止まってしまうらしいです。
対処方法が分からずに行き詰っています。どなたかご存知の方、教えていただけると嬉しいです。
ソースの前に、簡単ながらアルゴリズムを記しておきます。
1.名簿のテキストファイルを読み込む。
2.各人の名前は左詰で書かれている。
3.名前の右側にアルファベット順で'A'よりも先にくる文字'_'を詰める。
4.名前に使われる文字の種類だけキューを用意する。
5.名前の一番右側の文字を参照し、その文字に対応するキューに名前を入れる。
6.各キューに「落とし蓋」に相当する文字列を入れる。
7.最初のキューから順番にキューの後ろから名前を取り出し、名前の右から2番目の文字に対応するキューに名前を入れる。
8.取り出した名前が「落し蓋」であった場合は、次の番号のキューから名前を取り出すようにする。
9.全てのキューから全ての名前を取り出し、キューに入れなおす作業が終わったら、各キューに再び「落し蓋」をする。
10.以下、7~9の作業を、参照する文字の位置を1つずつずらしながら行う。
11.テキストファイルにソート結果を出力。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 80
#define FS '_' //名前の右に詰める文字
typedef struct cell{
struct cell *next;
struct cell *prev;
char ch[N];
}cell;
typedef struct queue{
struct cell *init;
struct cell *final;
}queue;
void enqueue(queue *q, char *x);
int dequeue(queue *q, char *x);
int main(int argc, char *argv[]){
FILE *fp_from, *fp_to;
char temp[N], endline[N];
int i, j;
queue *q[54]; //0:空白用の文字, 1~52:アルファベット, 53:スペース
for(i = 0; i < 54; i++){
q[i] = (queue *)malloc(sizeof(queue));
q[i]->init = NULL;
q[i]->final = NULL;
}
if(!argc){
printf("Please input a name of a listfile.\n");
return(1);
}
if(argc >= 3){
printf("You can input only two filenames.\n");
return(1);
}
if((fp_from = fopen(argv[0], "r")) == NULL){
printf("Reading error.\n");
return(1);
}
while(feof(fp_from) == 0){
fgets(temp, N, fp_from);
for(i = strlen(temp)-1; i < N; i++) temp[i] = FS; //空白用文字を名前の右側に詰める
enqueue(q[0], temp);
}
for(i = 0; i < N; i++) endline[i] = FS; //各キューの「落とし蓋」を用意
for(i = N-1; i > 0; i--){
for(j = 0; j < 54; j++){
ココ→ enqueue(q[j], endline); //各キューに「落し蓋」を挿入する
}
for(j = 0; j < 54; j++){
while(1){
dequeue(q[j], temp);
if(temp[0] == FS) break;
if(temp[i] == FS){
enqueue(q[0], temp);
}else if((temp[i] >= 'A') && (temp[i] <= 'Z')){
enqueue(q[temp[i]-'A'+1], temp);
}else if((temp[i] >= 'a') && (temp[i] <= 'z')){
enqueue(q[temp[i]-'a'+27], temp);
}else if(temp[i] == ' '){
enqueue(q[53], temp);
}else{
printf("There was an unavailable symbol.\n");
return(1);
}
free(temp);
}
}
}
if(argc == 1) fp_to = fopen(strcat(argv[0], "_2.txt"), "w");
else fp_to = fopen(argv[1], "w");
for(i = 0; i < 54; i++){
while(1){
if(dequeue(q[i], temp) == 1) break;
fputs(temp, fp_to);
fputc('\n', fp_to);
}
}
fclose(fp_from);
fclose(fp_to);
return(0);
}
//キューqに1つの要素xを前から入れる。
void enqueue(queue *q, char *x){
cell *r;
ココ→ r = (cell *)malloc(sizeof(cell));
strcpy(r->ch, x);
if(!q->init) q->final = r;
r->prev = NULL;
r->next = q->init;
if(q->init) q->init->prev = r;
q->init = r;
return;
}