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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

2942閲覧

ポインタを使った連結リストに対する疑問

reotantan

総合スコア295

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/11/21 20:17

編集2015/11/21 20:51

このようなコードがあって、
for (int i = 1; i < 10; i++) {
p->next = new LinkedList(i);
p = p->next;
}の部分が納得するような納得しないような変な感じがしました。
headポインタと同じところを示すから、一つずつiをあげていけば配列をしますのは分かります。
しかし、p=p->nextの部分がなんだか気持ち悪くて、
ポインタを配列みたいに使うなら、実際に配列にいれたらいいじゃないかと思ってしまいました。
ここの部分を丁寧に説明していただけると、とても助かります。
よろしくお願いします

p->next = new LinkedList(i);
p = p->next;
の部分が具体的にどうなるのか手順を提示してくれると、とても助かります

コード #include <iostream> using namespace std; class LinkedList { public: LinkedList *next; int data; LinkedList(int data); ~LinkedList(); }; LinkedList::LinkedList(int data) { this->next = NULL; this->data = data; cout << "new: " << this->data << ": " << this << endl; } LinkedList::~LinkedList() { cout << "delete: " << this->data << ": " << this << endl; } int main(int argc, char *argv[]) { LinkedList *head = new LinkedList(0); LinkedList *p = head; for (int i = 1; i < 10; i++) { p->next = new LinkedList(i); p = p->next; } for (p = head; p != NULL; p = p->next) { cout << "p->data=" << p->data << endl; } for (p = head; p != NULL;) { LinkedList *tmp = p->next; delete p; p = tmp; } return 0; }

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

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

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

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

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

guest

回答4

0

メリット/デメリットは概ね皆さんの回答の通りですが、もう1つ連結リストを使う重要なメリットとして、追加/削除コストが低いことが上げられます。

配列のような構造の場合、例えば先頭に1つ要素を追加する時、配列に入っている有効な要素を全て1つ後ろへコピーする必要があります。
しかし、連結リストの場合、追加する要素のnextにheadポインタをコピーし、headポインタに追加する要素のアドレスを設定するだけですので、負荷が軽いのです。

先日のサンプルのように順序を気にしないような配列の場合は追加/削除コストは連結リストと大差ないですが、多くの場合順序は重要です。

投稿2015/11/22 01:11

Chironian

総合スコア23272

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

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

0

ベストアンサー

連結リストのメリット:
・あらかじめ連続した最大領域のメモリを確保する必要が無い。
・必要な分だけメモリを確保して行くため、メモリの許す限りデータの追加が可能。

連結リストのデメリット:
・シーケンシャルアクセスしか出来ないため、使用目的によっては低速。
・リンクのための情報保持のための領域が別途必要で、同数のデータのためのメモリ用息は配列より多く必要になる。

配列のメリット:
・データの位置が計算でもとめることができ、ランダムアクセスが可能で高速。
・データの順番を保持する付加情報が不要。

配列のデメリット:
・あらかじめ最大の連続したメモリ領域を確保する必要がある。
・原則、途中で拡張ができない。


p->next = new LinkedList(i);
p = p->next;

今あるレコードの、次のレコードへのポインタ (p->next) に新たなレコードのポインタを格納
その後、最後のレコードを保持するポインタに新たなレコードのポインタ(最終レコードのポインタ)を格納するしています。

投稿2015/11/21 21:35

編集2015/11/21 21:36
T.Kanno

総合スコア915

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

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

0

日本語が難しいですが、ポインタ配列に入れると要素の最大数に制限がかかるから避けています。連結リストとはそういうものです。
インデックスがなく、前(または双方向であれば後ろ)の要素と連結されているだけです。

とはいえ、この例では10個固定なので配列でも良いですね。
もっと要素が増える可能性があると困ったことになります。
例えばスタックメモリの逼迫などです。
関数の中で宣言した変数はスタックメモリから確保され、newした場合はヒープメモリから確保されます。
この辺りは専門書をご参考ください。

投稿2015/11/21 20:39

編集2015/11/21 20:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

まず、配列を使うなら予め配列の数を指定しなければならない。
p->next = new LinkedList(i);
にてメモリーを取りながらnextでリンクしていけばメモリーの許す最大まで配列が作れる。

投稿2015/11/21 20:39

maiko0318

総合スコア876

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問