
自分には、難しい内容なので、色々教えていただけると嬉しいです。
リスト構造で、データの入れ替え・ポインタの付け替えを行っているのですが、どこのサイトを見てもどれが、参考になるのか分かりませんでした。
例えば、宣言でgFront→a1→a2→a3→a4→a5→NULLのすでに連結されたリストがあります。
先頭には、ダミー(gFront)のセルがあり、そこからたどって入れ替えていくというものです。
a1からa5の中には、数字が入っているものとします。
a2とa5の入れ替えを行うと仮定して話します。
そして、a2をpreとして、a5をnewとして、preの一つ前をprepreとし、newの1つ前をprenewとして、ひとつ前のnextを調べてポインタの付け替えを行います。
4か所のポインタの付け替え後の結果を、gFront→a1→a5→a3→a4→a2→NULLとしたいです。
swapを使ったリストの中身入れ替えではなく、ポインタの付け替えでリスト自体の入れ替えを行いたいと考えています。
この付け替えの部分がいまいちプログラムの書き方と言いますか、よく理解できていないので、教えていただけないでしょうか?
文章だけでは、分かりにくいところが多々あるかとは思いますが、宜しくお願いいたします。
A 回答 (11件中1~10件)
- 最新から表示
- 回答順に表示
No.11
- 回答日時:
「入れ替え→表示」ということがしたい, って言われてもなぁ.
「入れ替え」ってことは, その対象が (複数) 存在するんだよね. その対象はどこで誰が指定するの? それがわからないとプログラムなんか組みようがありません.
これは #7 あたりで既に指摘されていて「あなたがどう思っているのか」が問われているんだけど, わかってる?
この回答への補足
どう思っているのかというと、
例えば、a2とa5の入れ替えならば、
a1->next=a5;
a5->pre=a1;
a5->next=a3;
a2->pre=a4;
a2->next=NULL;
このようにソースを書いてしまうと、
a2とa5の入れ替えしかできません。
これだと、入れ替え処理ごとにプログラムの
量が増えますよね?
入れ替え対象は、ソース上で指定しておきます。
入れ替え処理をkと仮定します。
---------------------------------------
k(a2,a5);
printf("入れ替え前:gFront→a1→a2→a3→a4→a5→NULL");
printf("入れ替え後:gFront→a1→a5→a3→a4→a2→NULL",a2,a5);
k(a1,a5);
printf("入れ替え前:gFront→a1→a5→a3→a4→a2→NULL");
printf("入れ替え後:gFront→a5→a1→a3→a4→a2→NULL",a1,a5);
k(a3,a4);
printf("入れ替え前:gFront→a1→a5→a3→a4→a2→NULL");
printf("入れ替え後:gFront→a5→a1→a4→a3→a2→NULL",a3,a4);
k(a2,a1);
printf("入れ替え前:gFront→a1→a5→a3→a4→a2→NULL");
printf("入れ替え後:gFront→a5→a2→a4→a3→a1→NULL",a2,a1);
・
・
・
-------------------------------------------
このように行っても、入れ替え処理の書き換え(変更)をしないで済むようにしたいんです。
プログラムの書き方は変ですが、伝えやすいイメージだと思うので、このようなプログラムを書いたことをお許しください・・・
No.10
- 回答日時:
>双方向リストとして考えないでも不可能なのでしょか?
今回の話は、単方向にしろ双方向にしろ、リスト構造を使うことが前提なのですよね?
リスト構造を使うからには、次のノードや前のノードを指すためのポインタを必ず使うことになります。
そういうポインタを使わずにリスト構造を使うことは、できません。
質問者さんが本当にしたいことは何なのか、よくわからなくなってきました。
この回答への補足
リスト構造は使用します。
最終的に求める結果は、
入れ替え→表示
さらに入れ替え→表示
さらに入れ替え→表示
さらに入れ替え→表示
さらに入れ替え→表示
終了としたいんです…
No.7
- 回答日時:
>入れ替え(ポインタの付け替え)の処理を繰り返し行えるようにしたいんです。
繰り返した結果、最初の
>gFront→a1→a2→a3→a4→a5→NULL
がどうなることを期待していますか?
また、どのポインタを入れ替えるかを、どのように指定するのですか?
No.5
- 回答日時:
struct cell {
int nData;
struct cell *prev;
struct cell *next;
};
といった具合の構造体でいいように思いますよ
a1ならば a1.prevがNULL、a1.nextが &a2
a2ならば a2.prevが&a1、a2.nextが &a3
a5ならば a5.prevが&a4、a2.nextが NULL
といった具合になっています
a2とa5の入れ替えならば
struct cell* temp;
temp = a2.prev; // &a3(a3のポインタ)をtemp
a2.prev = a5.prev; // &a4をa2のprevへ
a5.prev = temp; // tempを a5のprev … つまりa3のポインタ
で a2,a5が指している前の要素の入れ替えができます
tmp = a2.next;
a2.next = a5.next;
a5.next = tmp;
で a2,a5が指している後ろの要素の入れ替えができます
No.4
- 回答日時:
>どうなっているとは、どういう事でしょうか?
当該の構造体の定義内容を見せてください、ということです。
struct 何とか、という部分がありますよね?
これで伝わりますか?
この回答への補足
typedef struct *cell{
struct cell *pre;/*入れ替え要素*/
struct cell *prepre;/*preの1つ前の要素*/
struct cell *new;/*入れ替え要素*/
struct cell *prenew;/*newの一つ前の要素*/
struct cell *next; /*次のcellへのポインタ*/
}LIST_CELL;
LIST_CELL *p1;
多分めちゃくちゃだと思います。
わけわからなかったら、無視してください・・・
No.3
- 回答日時:
「ひとつ前のnext」が、リストの次要素を指し示す構造体メンバーのことなら、
1)prepreとprenewのnextを交換。
2)preとnewのnextを交換。
でいけるかと。
図にするとこんな感じ。
// 図を既に書いてみたけど分からないというなら、ごめんなさい。

この回答への補足
osamuyさん 回答ありがとうございます。
osamuyさんのように書いた図は、かなり書いていて、プログラムも書いているんですが、リストプログラムの記述の順番かコード自体が間違っていて、うまく動作しません。
入れ替え(ポインタの付け替え)なので、2つだけの処理じゃ足りないんじゃないでしょうか?;;
また、a1とa5の入れ替えをする場合、つながらないですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Excel(エクセル) 範囲指定をした中で、住所の列をユーザー設定の並べ替えをしたい 3 2022/05/15 13:51
- Excel(エクセル) Excelで漢字人名が勝手に並び変わる(続) 4 2023/03/21 21:28
- 会計ソフト・業務用ソフト Excelマクロに詳しい方教えてください 1 2023/06/29 16:18
- 引越し・部屋探し 引っ越しのコツを教えて下さい 3 2023/01/09 00:01
- Excel(エクセル) エクセルでキーリストからデータを取り出して1枚1枚印刷するには? 11 2022/06/27 09:52
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- その他(Microsoft Office) 1の行を固定した上でVBAを用いて日付順に自動並べ替え 2 2022/06/06 15:09
- Excel(エクセル) 【エクセル】並び替えからの並び替え方法 7 2022/07/22 09:46
- Visual Basic(VBA) VBAで自動集計(特定セルコピー月ごとに値貼り付け)したい。 6 2023/06/25 11:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
プーさんのマウスポインタを教...
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
自作DLLの引数について、ポイン...
-
NULLポインタが0でない処理系と...
-
TCHAR文字列内の検索について
おすすめ情報