構造体ポインタを用いたを使用したリストについて
Posted: 2011年8月12日(金) 00:37
先日「dijkstra法を用いた最短距離迷路探索」という課題が出され、構造体ポインタの使用方法(具体的にはメモリの動的確保)が理解できずここ数日悩み続けています。1or2次元配列を用いたプログラムでは組めたのですが、この課題では指定されたヘッダファイルを用いて分割コンパイルしなければならず、記載されたプログラムの意味がいまいち理解できないのでどなたかに回答をいただければと思い質問することにしました。
[1]具体的な質問点
[1.1] 構造体MAZE内で宣言されている各種ポインタの取り扱い方法=dijkstra法との繋げ方。
[1.2] ファイルのパスとは開く対象のファイル名と認識して良いのか。
[1.3] [ファイルに文字列を書き込み/ファイルに文字列を書き込む]の処理の違い。
質問[1.1]についてなのですが、最初は構造体ポインタを用いたノードのリスト構造を作成するのかと思ったのですが、自分は以下に示す典型的なものの理解しかなく今回のようなパターンはどうすれば良いのか見当もつきません。一度(MAZE->cost + 1 = 1)みたいに無理矢理繋げようとした所やはりセグメントエラーが出てしまいました。
長文になってしまってすいません、回答の程よろしくお願いしますm(_ _)m
struct vertex{
int class;
int address;
struct vertex *next; ←これがないとお手上げ;;
}
struct vertex *top, *new;
top = NULL;
while(1){
new = (struct vertex*)malloc(struct vertex);
new->class = 1;
new->address = 1;
new->next = top;
top = new;
}
[2] 環境
[2.1] OS : Linux
[2.2] コンパイラ名 : gcc
[2.3] 言語: C
[3] C言語理解度:基本情報を取得したばかり。
[1]具体的な質問点
[1.1] 構造体MAZE内で宣言されている各種ポインタの取り扱い方法=dijkstra法との繋げ方。
[1.2] ファイルのパスとは開く対象のファイル名と認識して良いのか。
[1.3] [ファイルに文字列を書き込み/ファイルに文字列を書き込む]の処理の違い。
質問[1.1]についてなのですが、最初は構造体ポインタを用いたノードのリスト構造を作成するのかと思ったのですが、自分は以下に示す典型的なものの理解しかなく今回のようなパターンはどうすれば良いのか見当もつきません。一度(MAZE->cost + 1 = 1)みたいに無理矢理繋げようとした所やはりセグメントエラーが出てしまいました。
長文になってしまってすいません、回答の程よろしくお願いしますm(_ _)m
struct vertex{
int class;
int address;
struct vertex *next; ←これがないとお手上げ;;
}
struct vertex *top, *new;
top = NULL;
while(1){
new = (struct vertex*)malloc(struct vertex);
new->class = 1;
new->address = 1;
new->next = top;
top = new;
}
[2] 環境
[2.1] OS : Linux
[2.2] コンパイラ名 : gcc
[2.3] 言語: C
[3] C言語理解度:基本情報を取得したばかり。
#ifndef MAZE_DEFINE
#define MAZE_DEFINE
#define COST_MAX 30000
//迷路構造体
typedef struct tagMAZE{
int nodecount; //全体のノード数を記憶
int startindex; //スタート位置を記憶
int goalindex; //ゴール位置を記憶
char* maze; //迷路情報
char* donenode; //使用済みフラグを記憶
int* cost; //最小コスト
int* from; //最小コストを提供するノード
int width; //迷路の横幅
int height; //迷路の縦幅
}MAZE;
//ファイルを開き迷路情報を構造体に記憶する関数
//mazefilepath:ファイルのパス←arg_pathのスペルミス?(謎)
MAZE* create_maze(char *arg_path);
#endif
#ifndef FILE_DEFINE
#define FILE_DEFINE
//ファイルサイズを取得
//filepath:サイズを取得したいファイルのパスです
long get_file_size(char* arg_path);
//ファイルに文字列を書き込み
//arg_str:書き込みたい文字列
//arg_fp:書き込む対象のファイルのポインタ
void write_string(char *arg_str, FILE* arg_fp);
//指定したファイルに文字列を出力.
//arg_path:保存するファイル名
//arg_str:ファイルに書き込む文字列
void output_string(char *arg_path, char *arg_str);
//指定したファイル内のデータを全て読み込み
//arg_path:データを読み込むファイルのパス
char* load_string(char *arg_path);
#endif