自分には、難しい内容なので、色々教えていただけると嬉しいです。
リスト構造で、データの入れ替え・ポインタの付け替えを行っているのですが、どこのサイトを見てもどれが、参考になるのか分かりませんでした。
例えば、宣言で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も見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
リスト構造のソートで悩んでます。。。
C言語・C++・C#
-
C言語のポインターに関する警告
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタ変数のサイズについて...
-
自作関数の引数
-
自分のIID_IUnKnown取得について
-
c言語のポインタについて初心者...
-
#define NULL ((void *)0) の弊害
-
アプリを32bitから64bit移行
-
Run-Time Check Failure #3とい...
-
C言語習得のレベル.
-
C言語 関数の戻り値と自動変数
-
c言語で任意のファイルから読み...
-
^と*の違いについて
-
別のDLLのダイアログを・・・
-
クラスの参照渡しとメンバ変数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
ハンドルはポインタか
-
C言語でのconstを返す関数
-
デバイスハンドルとは?
-
Cで作成したDLL関数をVBから呼...
-
popenした子プロセスのプロセス...
-
c言語で任意のファイルから読み...
-
[excel vba] マウスポインタの...
-
パスからファイル名を抽出
-
プーさんのマウスポインタを教...
-
基本アルゴリズムの『返す』の...
おすすめ情報