アプリ版:「スタンプのみでお礼する」機能のリリースについて

データ構造とアルゴリズムについての質問です.
Queue(待ち行列)に関する以下の課題についてわかる方ご教授願います.
課題内容は,
①CountをもつQueueのプログラムを配列で作成せよ.
②Queueのプログラムを連結リストで作成せよ.
の2つです.

CountなしのQueueを配列を用いて作ったプログラムはわかっているので,そこに付け加える形で回答願いたいです.そのプログラムを以下に示しておきます.

struct queue {
int *bd;
int hd;
int tl;
int mx;
char *id;
};

void error_id (char *frm, char *id)
{
fprintf(stderr, frm, id);
exit(1);
}

struct queue *newqueue (int maxsize, char *name)
{
struct queue *q;
if ((q = (struct queue *)malloc(sizeof(struct queue))) == NULL)
error_id("malloc for %s\n", name);
if ((q->bd = (int *)malloc(maxsize * sizeof(int))) == NULL)
error_id("malloc for %s's body\n", name);
q->hd = q->tl = 0;
q->mx = maxsize;
q->id = name;
return q;
}

A 回答 (2件)

コール元がないのでなんとも言えませんが…



>struct queue *newqueue (int maxsize, char *name)
>q->id = name;

nameがmalloc()などで確保された領域でない場合、期待動作にならない…かも知れませんな。
# char name[100];とかの静的領域だとキューの全てで同じアドレスを。


さらに、まず滅多に発生しないでしょうけど、malloc()失敗すると飛ぶかと。
>if ((q = (struct queue *)malloc(sizeof(struct queue))) == NULL)
>error_id("malloc for %s\n", name);

malloc()失敗したのでqにNULLが入ってerror_id("malloc for %s\n", name)をコール。
で、
>if ((q->bd = (int *)malloc(maxsize * sizeof(int))) == NULL)
NULLポインタ参照で落ちる…かと。


struct queueはキューに登録するアイテム…なんでしょうかね?
連結リストにするにはリスト構造の為のメンバが無いみたいですけど。
# 配列ならそんなメンバは不要ですけども。
    • good
    • 0

「CountをもつQueueのプログラムを配列で作成せよ.」ってどういうことなんだろうか. 「Count」がなんなのかさっぱりわか

らんし, プログラムを「配列で作成」ってのはどうなっていることを求めているんだろう.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!