質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

解決済

4回答

3426閲覧

連結リストにおいてダミーの必要性がわかりません。

apeirogon0813

総合スコア117

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

0グッド

0クリップ

投稿2018/10/22 08:45

編集2018/10/22 09:17

双方リストや単方向リスト循環リストにおいてダミーの存在意味(メリット)が理解しがたいです。
メリット、デメリットがあるのかご教示願います。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

headがダミーノードだった場合と
ポインタ変数だった場合で

head -> 要素1 -> 要素2 -> tail
のリストで

  • 要素1と要素2の間に要素を挿入する場合
  • 要素1の前に要素を挿入する場合

を考えてみるとわかるかな、と思いますが
headをつなぎ替える場合を特別扱いする必要がなくなるのがメリットです。

デメリットは若干分かりづらい、列挙の場合にダミーを飛ばす必要がある
程度で軽微なものです。

投稿2018/10/22 09:34

編集2018/10/22 09:35
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apeirogon0813

2018/10/22 09:42

headをつなぎ替える場合を特別扱いする必要がなくなるのがメリットです。 がよく理解できないのですが、headのnextを繋ぎかえる場合ということでしょうか?
asm

2018/10/22 09:49

(*head)が要素1だった場合と head->nextが要素1だった場合、どちらが楽かって事です。 ダミーノードを作る必要がないと思うのならば、実際に実装してみるといいです。
Zuishin

2018/10/22 09:53

これは線形リストの説明ですが、質問者さんは循環リストを対象にしています。
dice142

2018/10/22 10:03

> 双方リストや単方向リスト循環リストにおいて と質問文中にあり、循環リストだけではないので間違いではないかと。
Zuishin

2018/10/22 10:05

双方向循環リスト、単方向循環リストのことだと思います。 前回の質問が循環リストだったので。
dice142

2018/10/22 10:09

ああ、たしかに前回の質問が循環リストですね。 そこまで見てなかったです。
apeirogon0813

2018/10/22 10:31

連結リストである全てのリストについてを通しての利便性を伺いたかったのですが、 線形リストと循環リストによってダミーノードの利便性は変わってくるのですね。 やはり、ダミーがない場合一番先頭にノードを追加する操作と先頭以外の場所にノードを追加する操作が少し違ってくるため、ダミーがあった方が操作を統一できて便利というところですかね
退会済みユーザー

退会済みユーザー

2018/10/22 11:00

なるほど、わたしも勉強になりました。ありがとうございます。insert(list, 3, node)というメソッドを書こうと思ったら、ダミーがあるほうがいい感じになりますね。
退会済みユーザー

退会済みユーザー

2018/10/22 12:50

ふと思ったのですが、ダミーを用意する場合、要素はNULLを取りえるようにしておいたほうがいいかもしれません。要素のインスタンスを必須とした場合、そのインスタンスの負荷が仮にデカければメモリを圧迫したりしそうな気がします。
guest

0

ダミーとはheadやtailのことでしょうか?
そういう意味であればheadは最初のノードを示すために使用し、
tailは最後のノードを示すために使います。
循環リストであればtailはなくても問題はないでしょう。

ただ単に前後のノードを繋いでおくのであればheadもtailも不要ですが、
どこが先頭のノードなのかである目印としてheadを用意しておくことが目的です。
最初の目印をheadではなく、最初のノードを直接変数で持っておけば
もちろんheadがなくても問題ないかと思います。


[コメント欄からの追記]

dice142さんがおっしゃているheadは最初のノードを示すためだけであり、ダミーという空リストか否かは関係ないのではないかというところです。

「headは最初のノードを示すため」というのは「headが最初の要素」というのではなく、
head自体は値を持たずリンクのみあるノード」という意味です。
最初の回答では抜けてましたが、値を持っていないことを前提としているので、説明文中のダミーと同義ですね。
あくまでも説明中の言葉としてheadを使っているので、変数名としてのheadではないことをお間違えなきよう。

ちなみに、ダミーとは空リストではなく、(言葉があるかは知りませんが)空ノード(値を持たないノード)です。
リストはノードで繋がったまとまりを指し、空リストはその繋がりがないものを指します(ダミーは繋がりから除く)。
ただの言い間違いなら問題ないのですが、念のため。

投稿2018/10/22 09:10

編集2018/10/22 10:01
dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apeirogon0813

2018/10/22 09:18

上記に画像を添付しました。これはheadに値するものでしょうか?少し違う気がします
dice142

2018/10/22 09:21

「これ」の指す範囲がわからないのですが、「これ」とは何を示していますか?
apeirogon0813

2018/10/22 09:30

まさに上記の画像の説明のところの「頭」です
dice142

2018/10/22 09:32

そういうことであれば「Yes」です。私のいう「head」と画像の説明の「頭」は同じものだと思われます。
dice142

2018/10/22 09:33

少し違うと思われた理由を述べていただければ補足して回答することができるかと思います。
apeirogon0813

2018/10/22 09:44

dice142さんがおっしゃているheadは最初のノードを示すためだけであり、ダミーという空リストか否かは関係ないのではないかというところです。
dice142

2018/10/22 10:34

解決済みですが回答追記してました。 (回答修正して満足してました。)
guest

0

Wikipedia: 連結リスト

Wikipediaを参考にする限りでは、連結リストというデータ構造にダミー(エントリーポイント?)はそもそも無さそうです。

投稿2018/10/22 09:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apeirogon0813

2018/10/22 09:19

上記に画像を追加しました。 そうなんですね、邪道なのでしょうか
退会済みユーザー

退会済みユーザー

2018/10/22 09:26

ごめんなさい、wikipediaですが、空のリストがダミーにあたる…かもしれません。文章は読んでみましたが年なのか理解が…;; もちっと読んでみます。
apeirogon0813

2018/10/22 09:31

わざわざ申し訳ないです。苦労をかけます。
退会済みユーザー

退会済みユーザー

2018/10/22 09:44 編集

コードが2行書かれている所まで読みました。頭の話ではなく尾の話ですね。利点ですが、あまり感じられません。dlnode*とすればいいところを、typedef *dlnode list としているところを見ると、C#やJavaのインターフェースを意識されていて、その場合、ダミーのノードを新たに生成すると都合がいいのか?とも思ったのですが、その場合でもわざわざダミーのノードを新たに生成する必要もなく、list = &node(リストの最後尾のノード)としとけばよいように思います。
退会済みユーザー

退会済みユーザー

2018/10/22 09:47

2行目以降ですが、これは利点でなはなく諸注意なので読み飛ばしました。
apeirogon0813

2018/10/22 10:32

他の回答者からの受け売りですが、やはり、ダミーがない場合一番先頭にノードを追加する操作と先頭以外の場所にノードを追加する操作が少し違ってくるため、ダミーがあった方が操作を統一できて便利というところですかね
guest

0

問題文を読み間違っている可能性大です。

投稿2018/10/22 08:50

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apeirogon0813

2018/10/22 09:19

上記に課題にある画像を一部添付いたしましたので確認お願いいたします。
Zuishin

2018/10/22 09:40

前の質問ではこの頭を追加したり削除したりしてたので、使い方を間違っています。 頭は追加したり削除したりしてはいけません。 「問題文を読み間違っている」というのは、「頭の使い方が間違っている」という意味です。 使い方が間違っていたらメリットなどわかるはずがありません。 しかし、メリットはこの画像にバッチリ書いてあります。 これを読んで理解したら疑問はなくなると思いますので、それを踏まえて前の問題をもう一度解きなおしてください。 でなければ、「頭を使うように」という問題の意図が解答に表れていないので不正解になります。
Zuishin

2018/10/22 09:46

いや、連結するときには削除する必要があるので、私の方が間違いです。 訂正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問