質問

以下のプログラムのReverceShowValue関数の仕組みがわかりません。
申し訳ございませんが、ご教授の方、よろしくお願いします。


#if 1
/* リスト構造の実装
* 再帰関数を用いて逆順に表示
*/
#include <stdio.h>
#include <stdlib.h>

typedef struct object{
int value;
struct object *next;
}OBJ;

OBJ* AllocateBlock(int value)
{
OBJ *block;
block = (OBJ*)malloc(sizeof(OBJ));
if(block == NULL){
printf("Allocate Error\n");
exit(1);
}
block->value = value;
block->next = NULL;
return block;
}

void ReverceShowValue(OBJ *p)
{
if(p != NULL){
ReverceShowValue(p->next);
printf("%d\n", p->value);
}
}

void FreeAllocate(OBJ *p_top)
{
OBJ *temp;
while(p_top != NULL){
temp = p_top->next;
free(p_top);
p_top = temp;
}
}

int main(void)
{
OBJ *top = NULL;
OBJ *temp;
int i;

for(i = 0;i < 10;i++){
if(top == NULL){
top = AllocateBlock(i);
temp = top;
}
else{
temp->next = AllocateBlock(i);
temp = temp->next;
}
}

ReverceShowValue(top);

FreeAllocate(top);

return 0;
}
#endif

通報する

回答 (1件)

リスト構造であるかどうかは今回の問題の本質ではありませんので、
話を単純化します。
下記のコードをごらんください。
ReverseShowValue関数は、引数で指定した配列の要素を出力するためのものです。
第2引数(出力したい要素番号)が有効な範囲にある間、
自分の次の要素を出力してから自分を出力する、ということを繰り返します。
これで、配列の要素を逆順に出力できます。
お時間があれば、コードを吟味してみてください。


#include <stdio.h>

#define SIZE (5)

void ReverseShowValue(int *arr, int sz)
{
if (sz < SIZE) {
ReverseShowArray(arr, sz + 1);
printf("%d\n", arr[sz]);
}
}

int main(void)
{
int arr[SIZE], i;

for (i = 0; i < SIZE; ++i) {
arr[i] = i;
}
ReverseShowValue(arr, 0);
return 0;
}

この回答へのお礼

ご回答して頂き、誠にありがとうございます。
早速、asuncionさんからお教え頂いた、コードをハックしてみます。

ありがとうございました。

このQ&Aは役に立ちましたか?0 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

注目の記事

おしトピへのコメントで10人に1人に500円分のギフト券プレゼント!(先着2000名様)

話題のトピックにさくっとコメントできる「おしトピ」で指定のオーダー3件にコメントした方先着2000名様の10人に1人にギフト券をプレゼント!
フジテレビ出身のフリーアナウンサー長谷川豊氏の質問にも回答受付中!

このQ&Aを見た人が検索しているワード


新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ

べんりQ&A特集