アルゴリズムとデータ構造 第 12 回課題

アルゴリズムとデータ構造 第 12 回課題
else {
printf("data: %d¥n", n);
break;
}
case 'd':
case 'D':
DispList(head);
break;
case 'q':
case 'Q':
break;
default:
printf("Invalid command.¥n");
break;
}
if ((command[0] == 'q') ||
(command[0] == 'Q')) {
printf("Quit.¥n");
break;
}
扱うデータのサイズが任意であるというリストの利
点を活かして,ダミーノードつき循環双方向リスト
によりキューを実現したい.キューへのデータ追加
はリスト左端へのノード挿入により行い,キューか
らのデータ取り出しは右端ノードを対象とする.
このとき,キューからデータを取り出す関数
QueueOut()を作成せよ.
ベースとするソース・コードはウェブ上にあるので,
ダウンロードして加筆し,コンパイル・実行して動
作を確認すること.提出するのは関数 QueueOut()
のソース・コードのみ.
関数 QueueOut() がやるべきこと
キューにデータがなければ -1 をリターン
右端のノードのデータをポインタ *n を使っ
て返す
右端ノードを削除
 右端ノードを指しているポインタ (2 個)
を調整
 右端ノードのメモリ空間を解放
0 をリターン




}
}
NODE *talloc(void)
{
NODE *p;
p = (NODE *)malloc(sizeof(NODE));
if (p == NULL) {
fprintf(stderr, "Cannot generate node.¥n");
exit(1);
}
return p;
}
ベースとなるソース・コード ex12-base.c
#include <stdio.h>
#include <stdlib.h>
void DispList(NODE *head)
{
NODE *p;
printf("Queue:");
p = head->left;
while (p != head) {
printf(" %d", p->data);
p = p->left;
}
printf("¥n");
// ノード構造体の定義
typedef struct tfield {
int data;
struct tfield *left, *right;
} NODE;
NODE
void
void
int
*talloc(void);
DispList(NODE *);
QueueIn(NODE *, int);
QueueOut(NODE *, int *);
}
void QueueIn(NODE *head, int n)
{
NODE *p;
int main(int argc, char *argv[])
{
NODE *head;
char command[20];
int n;
head = talloc();
head->left = head->right = head;
while (1) {
printf("¥nInput command: ");
scanf("%s", command);
switch(command[0]) {
case 'i':
case 'I':
printf("Input data: ");
scanf("%d", &n);
QueueIn(head, n);
break;
case 'o':
case 'O':
if (QueueOut(head, &n) == -1) {
printf("Queue is empty.¥n");
break;
}
p = talloc();
p->data = n;
p->right = head->right;
p->left = head;
head->right->left = p;
head->right = p;
}
int QueueOut(NODE *head, int *n)
{
// ■■■■ ここが課題の内容 ■■■■
}