アルゴリズムとデータ構造 第 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) { // ■■■■ ここが課題の内容 ■■■■ }
© Copyright 2024 ExpyDoc