より、実用的に使いまわせるように、分割コンパイルに対応した形に直してみました。
....多分、ここで投稿している内容を含有する『標準ライブラリ』があるんだと思うのですが、
なんだか自分で書いてみたくて、作ってみました。
qeueu.h の内容...
► スポイラーを表示
/* qeueu.h */
#include
#include
#define Q_SIZE 5
typedef struct {
int sq;
int eq;
int len;
int dete[Q_SIZE];
} qeueu;
// 宣言時の注意:: 『空のキュー』を宣言する際は、sq, eq, len を 0 で初期化すること!!
// 使用例:: qeueu q1 = {0, 0, 0};
// 解説:: 構造体 qeueu の変数を宣言する際に、
// 先頭から3つのメンバ変数をそれぞれ 定数 0 で初期化する。
void enq(qeueu *, int);
// 第一引数:: 操作したい、キュー構造のポインタ
// 第二引数:: 格納したい値
// 返却:: 無し
// 機能:: 第一引数が指すキュー構造に、第二引数の値を格納する
int deq(qeueu *);
// 第一引数:: 操作したい、キュー構造のポインタ
// 返却:: 取り出した値
// 機能:: 第一引数が指すキュー構造から、値を取り出す。
► スポイラーを表示
#ifndef _QEUEU_H_
#define _QEUEU_H_
#include
#include
#define Q_SIZE 5
typedef struct {
int sq;
int eq;
int len;
int dete[Q_SIZE];
} qeueu;
void enq(qeueu *p, int num) {
if (Q_SIZE len) exit(1);
else if (p->len != 0) p->eq = (p->eq == Q_SIZE -1) ? 0 : (p->eq) + 1;
p->dete[p->eq] = num;
(p->len)++;
}
int deq(qeueu *p) {
if (p->len == 0) exit(2);
(p->len)--;
if (p->sq == Q_SIZE -1) {
p->sq = 0;
return p->dete[Q_SIZE -1];
}
else return p->dete[(p->sq)++];
}
#endif
► スポイラーを表示
► スポイラーを表示
第五章 応用データ構造 第四節 キュー
// 宣言
@[ SIZE ] // 配列の要素数
@[ dete[SIZE] ] // 添字は 1 から数える
@[ sq ] // start_queue キューの先頭のデータを指す
@[ eq ] // end_queue キューの最期のデータを指す
@[ len ] // キュー構造に保持しているデータの個数
// 注意点
// SIZE は 1_base 、sq, eq, len は 0_base である
初期化処理-[ SIZE ]
-[ sq = 0 ]
-[ eq = 0 ]
-[ len = 0 ]
定義-[データの格納]
if-[ SIZE < len ]
処理-[ オーバーフロー:: エラー ]
elseif-[ len == 0 ]
-[ dete[eq] にデータを入れる ]
-[len = len +1 ]
else
if-[ eq == SIZE -1 ]
-[ eq = 0 ]
else
-[ eq = eq +1 ]
-[ dete[eq] にデータを入れる ]
-[ len = len +1 ]
[end]
定義-[データの取り出し]
if-[ len == 0 ]
処理-[ 空のキューからデータを取り出そうとしている:: エラー処理 ]
else
-[ dete[sq] のデータを取り出す ]
-[ len = len -1 ]
if[ sq == SIZE -1 ]
-[ sq = 0 ]
else
-[ sq = sq +1 ]
[end]