>>897
まず、リストの先頭を保持する方法がおかしい。
TOP.keyは使用していないんだから、struct node *top;としてそこからリストを始める。

次にpopだが、基本的にpushの逆。
1) topの持っている先頭ノードの場所を一時変数に記憶
2) topの指す場所を先頭ノードの次のノードの場所に変更
3) 1)、2)の操作で切り離されたノードからキーの値を一時変数に記憶
4) 1)で記憶した元先頭ノードの領域を開放する(重要)
5) 3)で記憶した値を呼び出し元に返して終了
ただし、リストが空のときにどう処理するかという問題がある。
通常は、キーになりえない何か特別な値を返すが、
この場合習作だから、無視してもいいかもしれない(課題ならそのへん書いてありそうだが)。
ともあれtopがNULLかどうかはチェックして処理を切り替えること。

mainは、任意個数の数字を入力させてそれを次々にpushし、
入力終了(たぶんEOF)になったら逆にpopで値を取り出して画面に表示すればOK。