第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回講義 課題 ソース・コードの解説 関数 push(),pop() の第二引数が NODE ** 型である理由 push 操作,pop 操作の双方で,main 関数のローカル変 数 head の書き換えが必要となる. 変数 head の型は NODE * 型であり,これをポインタ渡し で渡すには,関数 push(),pop() に対して「head のあ りか (アドレス)」,すなわち「main 関数から見た場合の &head」を教えてやる必要がある. &head の型は「ノードへのポインタ (head) へのポイン タ」であるから,NODE ** 型でなければならない. 関数 push(),pop() から main() 内の head を書き換 えるには,それぞれの関数内で「*head への書き込み」 を行う. 3 第11回講義 課題 解答例 オーバーフローの チェックは不要 新規ノードに n を 記録し,head に連結 main() head ノード 1 2 pop() head n 2 1 copy n void push(int n, NODE **head) { NODE *p; p = talloc(); p->data = n; p->pointer = *head; *head = p; } 2 1 p head p p 2 1 4 第11回講義 課題 解答例 空かのチェック int pop(int *n, NODE **head) { 先頭ノードのデータ NODE *p; を *n に出力,リン ク調整,メモリ解放. if (*head == NULL) return -1; else { p = *head; *n = p->data; *head = p->pointer; free(p); return 0; } main() -1 0 head ノード 1 2 pop() head p head n 2 1 n ノード 1 2 } p p 2 1 5 第11回講義 課題 注意点 関数 pop() において,*head のメンバ変数を書き換えよ うとするコードにおいて, *head->data あるいは *head->pointer とするとコンパイルエラーとなる. 正しくは, (*head)->data あるいは (*head)->pointer 6
© Copyright 2024 ExpyDoc