第11回講義 課題 リスト構造の強力な利点は,データサイズに制限がないこ とである.そこで,リスト構造を用いてスタックを実装す ることで,「オーバーフローしないスタック」を作ること ができる.添付ソースの関数 push(),pop() を作成せよ. このスタックにデータをプッシュする場合: head push 1 push 2 1 1 第11回講義 課題 データのポップは以下のように行われる: head 2 pop 1 *n 2 pop 1 *n 1 pop データなし エラー信号を返す ※ データ出力は「ポインタ渡し」で行っており,渡す先は main 関数 内のローカル変数 n (pop()にとっての *n) である. 2 第11回講義 課題 ソース・コードの解説 ノードの構造体を struct tfield 型として定義し,こ れを typedef によって「NODE型」と読み替えて (別名を つけて) いる. 構造体の変数名が「struct」を含んで長ったらしいので, C言語ではこの方法がよく行われる. まとめて, typedef struct tfield { int data; struct tfield *pointer; } NODE; と書いてもよい. 3 第11回講義 課題 ソース・コードの解説 main 関数でやっているのは,キーボード入力された文字 列の 1 文字目をコマンドとして,‘i’ なら入力処理, ‘o’ なら出力処理, ‘d’ ならスタック内容の表示, ‘q’ ならプ ログラム終了という場合分け処理を無限ループさせている. switch 文の使い方が曖昧な学生は,この機会に復習して おくこと. ノード新規生成関数 talloc() では,malloc() による メモリ動的確保の失敗 (このとき malloc() は NULL を返 す) に対応する処理 (標準エラー出力へのエラーメッセー ジ出力とプログラム異常終了) を追加してある. main 関数の引数・戻り値については,講義ウェブサイト 上の第3回講義の宿題の「解説」の最後の方に簡単な説明 を書いておいた. 4 第11回講義 課題 ソース・コードの解説 関数 push(),pop() の第二引数が NODE ** 型である理由 push 操作,pop 操作の双方で,main 関数のローカル変 数 head の書き換えが必要となる. 変数 head の型は NODE * 型であり,これをポインタ渡し で渡すには,関数 push(),pop() に対して「head のあ りか (アドレス)」,すなわち「main 関数から見た場合の &head」を教えてやる必要がある. &head の型は「ノードへのポインタ (head) へのポイン タ」であるから,NODE ** 型でなければならない. 関数 push(),pop() から main() 内の head を書き換 えるには,それぞれの関数内で「*head への書き込み」 を行う. 5
© Copyright 2024 ExpyDoc