• ベストアンサー

アルゴリズム

アルゴリズムについて勉強しているのですが、この問題が解けませんでした。 リンクによるリストに対して、ルーチンmovenexttofront(struct node *t)を実現せよ。 ここで、この手続きはtがさす接点の次の接点をリストの先頭に移すものである。 この問題を解ける人、ぜひ教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • banamil
  • ベストアンサー率50% (5/10)
回答No.2

リスト構造でのノードの移動ってやつですね。 まずリスト構造について勉強してください。 それだけでは不親切なので、 たとえばnode構造体が次のような形だとしたら、 struct node { int idata; /* ノードが持つデータ */ struct node *next; /* 次のノードへのポインタ */ } movenexttofrontは次のようになります。 リスト構造の先頭ノードへのポインタが struct node *frontとグローバル変数で宣言されているとして、 void movenexttofront(struct node *t) { struct node *f; /* 先頭に移動するノードへのポインタ宣言 */ f = t->next; /* 先頭に移動するノードへのポインタを保存 */ t->next = f->next; /* *tの次のノードを*fの次のノードに変更。これでfはリストから削除される。 */ f->next = front; /* *fの次のノードを現在の先頭ノードに変更。これでfがリストの先頭ノードとなる。*/ front = f; /* 先頭のノードとなった*fへのポインタをfrontに保存. } これで解らなければデータ構造をじっくり勉強してください。大体のCの参考書には載っていると思います。

参考URL:
http://water.si.hirosaki-u.ac.jp/~slmizu/is2000/is2000/node3.html

その他の回答 (1)

回答No.1

なんらかの外部変数が先頭の節点のポインタを保持しているとする なら、ポインタのつけかえだけですね。 つけかえの手順はいろいろありますが、例をあげるなら、 1. tの次の節点のポインタをどこかに保存 ... tmp とする 2. tの次の次の節点がtの次となるように変更 3. 先頭の節点が tmp の次となるように変更 4. tmp が先頭になるように外部変数を変更 となります。 これだけ見て、なんのことやらさっぱりなら、かなりわかっていな いと自覚して勉強してください。

関連するQ&A