私は迷路を解くプログラムを書いています。開始正方形「o」で始まり、「*」で終わります。「#」は壁であり、「。」探索できる正方形です。アルゴリズムは、プログラムの開始時に開始スクエアを空のキューに追加することです。その後の各ステップでは、キューから正方形を取り出し、それがすでに記録されている正方形であるか、仕上げの正方形であるか、または探索可能であるかどうかを確認します。探索可能な場合は、隣接する壁以外の正方形をキューに追加します。私の問題は、キューに開始正方形を追加すると、セグメンテーションエラーが発生し、その理由がわからないことです。関連するコードは次のとおりです。
mazeQ.c:
#include <stdio.h>
#include <stdlib.h>
#include "QueueInterface.h"
int main(void)
{
Queue Q;
InitializeQueue(&Q);
int row;
int column;
int x;
int y;
scanf("%d %d", &column, &row); //scan dimensions of maze
char input[row][column];
ItemType maze[row][column];
for(x = 0; x <= row; x++) {
fgets(input[x],column+2,stdin);
}
row++;
for (x = 1; x < row; x++){
for (y = 0; y < column; y++) {
maze[x][y].squareType = input[x][y];
maze[x][y].xCoordinate = x-1;
maze[x][y].yCoordinate = y;
maze[x][y].recordedSquare = 0;
}
}
for(x = 1; x < row; x++){
for(y = 0; y < column; y++) {
if (maze[x][y].squareType == 'o')
Insert(maze[x][y],&Q); //INSERTED HERE
}
}
for (x = 1; x < row; x++) {
for (y = 0; y < column; y++) {
printf("%c", maze[x][y].squareType);
}
printf("\n");
}
}
UserTypes.h:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char squareType;
int xCoordinate;
int yCoordinate;
int recordedSquare;
} ItemType;
以下の2つのファイルは、そのままにしておく必要があります。QueueImplementation.c:
#include <stdio.h>
#include <stdlib.h>
#include "QueueInterface.h"
void SystemError(char *errorMsg) {fprintf(stderr,errorMsg);}
void InitializeQueue(Queue *Q)
{
Q->Front = NULL;
Q->Rear = NULL;
}
int Empty(Queue *Q)
{
return (Q->Front == NULL);
}
int Insert(ItemType R, Queue *Q)
{
QueueNode *Temp;
/* attempt to allocate */
Temp = (QueueNode *) malloc(sizeof(QueueNode)); /* a new node */
if (Temp == NULL) { /* Temp = NULL signals allocation */
SystemError("system storage is exhausted"); /* failure */
return 0;
} else {
Temp->Item = R;
Temp->Link = NULL;
if ( Q->Rear == NULL ) {
Q->Front = Temp;
Q->Rear = Temp;
} else {
Q->Rear->Link = Temp;
Q->Rear = Temp;
}
}
return 1;
}
QueueInterface.h:
#include "UserTypes.h" /* get ItemType definition */
typedef struct QueueNodeTag {
ItemType Item;
struct QueueNodeTag *Link;
}QueueNode;
typedef struct { /* a queue is empty iff */
QueueNode *Front; /* its Front == NULL */
QueueNode *Rear;
}Queue;
/* defined operations */
extern void InitializeQueue(Queue *Q);
/* Initialize the queue Q to be the empty queue */
extern int Empty(Queue *Q);
/* Returns TRUE == 1 if and only if the queue Q is empty */
extern int Full(Queue *Q);
/* Returns TRUE == 1 if and only if the queue Q is full */
extern int Insert(ItemType R, Queue *Q);
/* If Q is not full, insert a new item R onto the rear of Q */
extern int Remove(Queue *Q, ItemType *F);
/* If Q is non-empty, remove the frontmost item of Q and put it in F */
プログラムは、mazeQ<sampleMazeと入力して実行されます
sampleMaze
12 10
############
#..........#
#.#.######.#
#.#....#...#
#.###.*#.#.#
#...####.#.#
#.#.#..#.#.#
#.#.#.##.#.#
#o#......#.#
############