C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 関数を使ったリストの反転


(過去ログ 105 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■62628 / inTopicNo.1)  関数を使ったリストの反転
  
□投稿者/ りすと (1回)-(2011/10/23(Sun) 02:21:50)

分類:[C#] 

線形リストのプログラムで、入力した数字が出力時逆になる(1の部分)ところを、
再度反転させて、入力と同じ順序で出力(2の部分)できるようにしたいです。

例:入力  9876
  出力  6789   (1
      9876   (2

下のプログラムですが(2)の部分の実行結果がうまくでません。
教科書に反転する関数があったのでその関数を使用しているのですが、
自分でも(2)のfor文の中身をどのようにすればよいかわからなかったのでアドバイスお願いします。

#include <stdio.h>
#include <stdlib.h>
typedef struct node *link;
struct node { int item; link next; };

link reverse();

link reverse(link x){
link t, y= x, r= NULL;
while( y!=NULL ){
t= y->next; y->next= r;
r= y; y= t; }
return r;
}

int main(int argc, char *argv[]){
int i, j;
link p, head= NULL;
for(i= 1; i!=argc; i++){ link p;
p= (link)malloc(sizeof(struct node));
p->item= atoi(argv[i]); p->next= head;
head= p;
}
for(p= head; p!=NULL; p= p->next){   //1
printf("%d ", p->item);
} printf("\n");

for(p= head; p!=NULL; p= p->next){   //2
p = reverse(head);
printf("%d ", p->item);
}
}
引用返信 編集キー/
■62629 / inTopicNo.2)  Re[1]: 関数を使ったリストの反転
□投稿者/ NF64 (6回)-(2011/10/23(Sun) 07:25:26)
2011/10/23(Sun) 07:35:27 編集(投稿者)
reverse()は一度だけ実行すれば良いと思うのですが。
以下、本題とは関係ないですが指摘です。

    ・main()が戻り値を返していません。
    ・変数jは使われていないようです。
    ・malloc()で確保した領域はfree()を使用して解放するべきです。

あと、ソースコードを貼り付ける時は図表モードを選択するとインデントが保たれます。

引用返信 編集キー/
■62631 / inTopicNo.3)  Re[2]: 関数を使ったリストの反転
□投稿者/ りすと (2回)-(2011/10/23(Sun) 12:05:30)

返信と指摘、ありがとうございます。
(2)のfor文をはずして実行してみたのですが、最初の文字しか出力できません。
reverseを入れるのは全てのfor文をぬけてから、と考えたのですが、考え方がおかしいのでしょうか。

引用返信 編集キー/
■62632 / inTopicNo.4)  Re[3]: 関数を使ったリストの反転
□投稿者/ NF64 (8回)-(2011/10/23(Sun) 13:41:27)
逆順にしたリストの内容を出力するために(2)のfor文があるはずです。

reverse()の挙動を理解されていますか?
どのような処理が行われ、どのような値が返されるのかを把握すれば、答えは見出せるかと思います。

引用返信 編集キー/
■62634 / inTopicNo.5)  Re[4]: 関数を使ったリストの反転
□投稿者/ りすと (3回)-(2011/10/23(Sun) 16:18:45)
reverse()に関して、
3つの変数があり、rははじめは空。yに続く節点はt。
そこでyはrに、tはyに、と置き換えをしてひとつづつずらしていく・・・・
戻り値はr、つまり空の部分に返す。
という風に考えているのですが、
自分でもよく整理できていません。
教えていただきたいです。
引用返信 編集キー/
■62636 / inTopicNo.6)  Re[5]: 関数を使ったリストの反転
□投稿者/ NF64 (9回)-(2011/10/23(Sun) 17:43:24)
reverse()関数は教科書を参考にされたとの事ですが、詳細な説明は載っていないのでしょうか。

reverse()関数を実行して返される値は、逆順に繋ぎかえられたリストの先頭要素を示すポインタです。
従って、以下のように書き換えればお望みの挙動が得られるかと思います。

	head = reverse(head);
	for(p= head; p!=NULL; p= p->next)
	{//2
		printf("%d ", p->item);
	}

引用返信 編集キー/
■62640 / inTopicNo.7)  Re[6]: 関数を使ったリストの反転
□投稿者/ りすと (4回)-(2011/10/23(Sun) 23:35:34)
教科書には簡単な説明しかのっていませんでした。
無事、できました。
ご親切にどうも有難うございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -