ページ 1 / 1
ポインタ~その2
Posted: 2007年2月02日(金) 12:04
by 大工
こんにちは。
今日はちょっとした疑問を持ってきました。
#include <stdio.h>
#include <stdlib.h>
typedef struct node_tag{
int value;
struct node_tag *next;
}node_t;
void check(node_t *);
node_t * insert_node(node_t *, int );
int main (void){
node_t node1, node2, node3;
node_t fake;
node_t *head = &node1;
fake.value = -1;
fake.next = &node1;
node1.value = 1; node1.next = &node2;
node2.value = 2; node2.next = &node3;
node3.value = 3; node3.next = NULL;
insert_node(&fake, 5);
check(fake.next);
return 0;
}
void check(node_t * com){
node_t * fake;
fake = com;
do{
printf("test: %d\n", fake->value);
fake = fake->next;
}while(fake != NULL);
}
node_t * insert_node(node_t *n, int val){
node_t *new_node;
new_node = (node_t *)malloc(sizeof(node_t));
if(new_node == NULL){
fprintf(stderr, "メモリ確保失敗.");
return NULL;
}
new_node->value = val;
new_node->next = n->next;
n->next = new_node;
return new_node;
}
リストについてなんですが・・・自分で作ってみてダミーノードをfakeとして挿入してみました。
このダミーノードの実装は正解なんでしょうか??意味的に間違っていたらご指摘お願いします。
あと、insert_node関数なんですが、return new_nodeとしてもmain関数内で戻り値を受け取ってません。
でも実行可能なのはなぜなんでしょうか??もしかしたら、プログラム上で必要なければ受け取らなくてもいいんでしょうか??(または、returnを書かなくても ← void関数で使わないのは分かります)
ご協力お願いします。
Re:ポインタ~その2
Posted: 2007年2月02日(金) 12:28
by GPGA
プログラムソースは<pre></pre>を使って
投稿しましょう。(<>は半角で入力)
> 今日はちょっとした疑問を持ってきました。
疑問の内容について書かれていませんが、何が疑問なのでしょう?
Re:ポインタ~その2
Posted: 2007年2月02日(金) 12:44
by 大工
すみません投稿しなおしました。
疑問も足しました。
よろしくお願いします
Re:ポインタ~その2
Posted: 2007年2月02日(金) 12:55
by box
> あと、insert_node関数なんですが、return new_nodeとしてもmain関数内で戻り値を受け取ってません。
> insert_node(&fake, 5);
書かれたとおり、insert_node関数の戻り値を使っていないです。
node = insert_node(&fake, 5);
と書けば、insert_node関数の戻り値を変数nodeに代入していることになります。
Re:ポインタ~その2
Posted: 2007年2月02日(金) 13:05
by GPGA
> すみません投稿しなおしました。
> 疑問も足しました。
この手の修正の場合、最初に投稿したレスを編集して直すのではなく
新しいレスとして、下に追加するようにしましょう。
最初のレスを編集してしまうと、2番目に私が言っている内容と
そぐわなくなってしまうため、後からこのスレッドを見た人の混乱の元になります。
Re:ポインタ~その2
Posted: 2007年2月02日(金) 13:10
by box
> node1.value = 1; node1.next = &node2;
> node2.value = 2; node2.next = &node3;
> node3.value = 3; node3.next = NULL;
せっかくinsert_node関数を作ったのに、ほとんど機能していませんね。
node1~node3に相当する領域の割り当てやvalueメンバーへの値のセット、
他ノードとのポインタの接続なんかを行なうための関数がinsert_nodeです。
上に引用した内容は、本来insert_node関数の仕事であるべきです。
Re:ポインタ~その2
Posted: 2007年2月02日(金) 13:18
by 大工
box>戻り値がなくても関数は成り立つんですね??
ダミーノードについてお尋ねしているんですが??
Re:ポインタ~その2
Posted: 2007年2月02日(金) 13:31
by box
> ダミーノードについてお尋ねしているんですが??
ダミーノードを設けてリストを組み立てることは、
何ら問題ありません。よくあるパターンです。
今回のコードが正しいかどうかとは別の話です。
Re:ポインタ~その2
Posted: 2007年2月02日(金) 13:34
by 大工
では、私のソースではダミーノードが実現できていないということでしょうか???
Re:ポインタ~その2
Posted: 2007年2月02日(金) 14:18
by box
> では、私のソースではダミーノードが実現できていないということでしょうか???
実現できているかどうかといえばできていることになるかもしれませんが、
ポインタの張り替えをmain関数で行なっているあたりはあまり美しくないです。
サンプルコードを載せてみます。他にも、いろんな方法があると思いますけれど。
なお、free_nodeは後始末用の関数です。mallocで確保した領域を開放しています。
#include <stdio.h>
#include <stdlib.h>
typedef struct node_tag {
int value;
struct node_tag *next;
} node_t;
void insert_node(node_t *node, int val);
void check(node_t *node);
void free_node(node_t *node);
int main(void)
{
node_t head;
head.next = NULL;
insert_node(&head, 5);
insert_node(&head, 1);
insert_node(&head, 2);
insert_node(&head, 3);
check(&head);
free_node(&head);
return 0;
}
void insert_node(node_t *node, int val)
{
node_t *new_node;
new_node = (node_t *) malloc(sizeof(node_t));
if (new_node == NULL) {
fprintf(stderr, "out of memory\n");
exit(1);
}
new_node->value = val;
new_node->next = NULL;
for (; node->next; node = node->next)
;
node->next = new_node;
}
void check(node_t *node)
{
for (node = node->next; node; node = node->next)
printf("value=%d\n", node->value);
}
void free_node(node_t *node)
{
node_t *p;
for (p = node; node; p = node) {
node = node->next;
free(p);
}
}
Re:ポインタ~その2
Posted: 2007年2月02日(金) 14:20
by GPGA
大工さんのコードがダミーノードを実現できているかいないか、と聞かれておりますが
ダミーノード以前にノードとして成り立っていないと思います。
本来ノードは、動的確保することにより可変でのデータ追加ができ
動的確保されているからこそ、一括の解放が可能となっています。
ですので、最初の時点で
node_t node1, node2, node3;
node_t fake;
このように、インスタンス化してしまっている時点で、プログラムとして
よろしくありません。
まずはダミーノードのことを考えず、普通のノードの追加や削除から勉強するのが良いと思います。
以下のサイトが参考になると思われるので記載しておきます。
http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds03.html
その後ダミーノードについて勉強する場合は
以下のサイトが参考になると思われるので記載しておきます。(上のサイトの続きです。)
http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds04.html
Re:ポインタ~その2
Posted: 2007年2月02日(金) 15:18
by box
> 以下のサイトが参考になると思われるので記載しておきます。
ご紹介くださった他にも、大いに参考になる内容がありました(ds02~ds09)。
データ構造好きの人には、たまらない内容です。
さっそく、お気に入りに追加しました。
Re:ポインタ~その2
Posted: 2007年2月02日(金) 21:23
by 大工
皆さん、ありがとうございます。頑張って勉強します。
皆さんはどの位の年齢層なんでしょうか?
Re:ポインタ~その2
Posted: 2007年2月02日(金) 21:45
by バグ
皆さんの年令って、私も気になってました(^-^)
ちなみに私は、C言語歴10ヵ月の28才です。
Re:ポインタ~その2
Posted: 2007年2月02日(金) 23:58
by GPGA
3月で23才です。
言語歴
C:4年
C++:1.5年
C#:半年くらい
Java(CLDC & MIDP):2年
スクリプトまで入れると
HPS:3ヶ月(4年前に触れた)
PHP:3ヶ月
最近ですと、仕事はJava、趣味はC++でプログラムをやっています。
Re:ポインタ~その2
Posted: 2007年2月03日(土) 01:23
by keichan
今年の1月で24になりました。
C:5年
C++:3年
C#:数週間
C++/CLI:1日
C系列以外:0日
仕事では専らC++でやってます
あとはスクリプトを少々。。
スクリプト:3ds max(3d系セットアップアプリ)専用 1年
#仕事以外でプログラムしない人なので最近危機感を感じています
Re:ポインタ~その2
Posted: 2007年2月03日(土) 02:56
by バグ
みなさん若いですね~(@_@;)
あ、私も一応プログラム書く仕事をやってます。
仕事ではMFCを利用する事が多いです。趣味ではコンソールアプリばかりいじってますが(苦笑)
Re:ポインタ~その2
Posted: 2007年2月03日(土) 03:22
by 大工
私の年齢は・・・・
ヒミツで(笑)
C言語をやり始めたこわっぱです
Re:ポインタ~その2
Posted: 2007年2月03日(土) 15:21
by 管理人
いつも書き込みが遅くなっています管理人です・・(_ _||)
え~と、
C言語歴は・・いつを基準にしたらいいのか・・、
実質1年半です。
C++歴3日目です・・;
年齢は22です^^
皆さんお若いですね^^
GPGAさん私と1歳しか違わないし、keichanさんは、さらに1歳の違いなのに、スキルの差が歴然・・^^;
バグさんはC言語歴に対してスキルがすごすぎですよw
私は大学の2年まではホントにどうしようもないくらいプログラムの勉強が嫌いな学生だったので、
それこそ丸投げしてでも課題出したいような人間だったのですが^^;
3年の後期にある、刺激的な授業を受けてからプログラムが大好きになりました。
OpenGLでなんちゃって人工知能なロボットを作ったんですが、何かをプログラムで作る事ってこんなにも楽しい事だとは思いませんでした^^
3年の後期にして、関数の使い方や文字列と配列の操作の仕方もわからなかった私がOpenGLでロボットを作るのはホントに大変でしたが、
毎日毎日大学に残って(7人で作るロボットなのに1人で)深夜までいつも書いてると
かなり奥深い物が出来ました^^
それからライブラリを使って何か作る事に目覚め、DXライブラリを使い始めました☆
>私の年齢は・・・・
>ヒミツで(笑)
大工さん!自分で聞いといてそれはないですよw
以前40歳でC言語歴1週間って人もいらっしゃいましたよ^^
12才の人もいらっしゃいましたし。
普段は12才から40才までの年齢層で、普通に会話する事はなかなかないですが、こういう場では普通に話せてしまいますね^^
Re:ポインタ~その2
Posted: 2007年2月03日(土) 17:54
by 大工
私の年齢は・・・・19歳です(・ω・)大学1回生ですね(笑)
C言語歴は大学の後期の長さで(ぇ
プログラミングの魅力は十人十色なとこかなぁ
将来は音声認識関連の分野です
Re:ポインタ~その2
Posted: 2007年2月03日(土) 19:03
by 管理人
あら、、年齢は「↑」なので控えてらっしゃるのかと思いましたが「↓」でしたか^^;
音声認識も楽しいですね☆
私は対話するロボットも作りましたが、楽しかったですよ♪
私のように3年の後期に目覚めなくてよかったですね(T_T
無駄な時間をすごしたと後悔でいっぱいです・・。何故大学にまできて遊びほうけていたんだろう・・(泣;
Re:ポインタ~その2
Posted: 2007年2月03日(土) 20:34
by 大工
私は目覚めてるんだか目覚めてないんだか(笑)
初級 中級 上級 者の境目ってなんなんでしょうね?
Re:ポインタ~その2
Posted: 2007年2月03日(土) 20:58
by 管理人
う~ん、何なんでしょうね^^;
初級=大学の課題が解けずに試行錯誤しているレベル
中級=大学の課題レベルは全て解け、あらゆる関数、ライブラリを使えるレベル
上級=専門にしているプロ
って感じでは・・。いや、その人それぞれによって違うでしょうね^^;
Re:ポインタ~その2
Posted: 2007年2月05日(月) 00:34
by keichan
私の考えでは
初心者=何がわからないのか説明できない人
中級=自分で分からない事をピンポイントで説明できる人
上級=大抵の事は自分で調べて解決できる人
という認識です。
ある程度の知識と意欲があれば何も難しいことはないと思います。
Re:ポインタ~その2
Posted: 2007年2月05日(月) 00:48
by 大工
keichan さんの考えに大賛成です。
今までの考え方は(大学に入ってから思ったことなんで)
初級 = 指定された教科書を読んでコンパイルをしてみて実行できた喜びを味わって楽しいと感じる段階
中級 = コンパイルエラーが出始めて、最初は先輩に聞いていてもだんだんと慣れてきてプログラムのバグを 一人で見つけられる段階
上級 = プログラムの構想をまず考えてからプログラムを書いてそこから改善点があれば改良を加えて、安定 したプログラムを書ける段階。
こんな感じです。(初級から離れれば離れるほど楽しくなくなる、という意味ではありませんので)