dポイントプレゼントキャンペーン実施中!

以下のプログラムの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

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2009/11/19 16:34

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


このQ&Aを見た人がよく見るQ&A