自分には、難しい内容なので、色々教えていただけると嬉しいです。
リスト構造で、データの入れ替え・ポインタの付け替えを行っているのですが、どこのサイトを見てもどれが、参考になるのか分かりませんでした。
例えば、宣言で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.1
- 回答日時:
線形連結リストの基本的な操作なので、リストの仕組みを理解していれば、簡単ですよ。
newとかprenewとか難しく考えすぎているみたい。
前のノードがpre、後のノードがnextとすると
a1->next=a5;
a5->pre=a1;
a5->next=a3;
a2->pre=a4;
a2->next=NULL;
一般化する場合は、現状リンクしているノードを覚えておくことを忘れずに。
この回答への補足
p1というポインタを使ってたどっていくので、もっと複雑になりませんか?
入れ替えを複数回行いたいので、
a1->next=a5;
のように固定して書けません・・・
No.3
- 回答日時:
「ひとつ前のnext」が、リストの次要素を指し示す構造体メンバーのことなら、
1)prepreとprenewのnextを交換。
2)preとnewのnextを交換。
でいけるかと。
図にするとこんな感じ。
// 図を既に書いてみたけど分からないというなら、ごめんなさい。
この回答への補足
osamuyさん 回答ありがとうございます。
osamuyさんのように書いた図は、かなり書いていて、プログラムも書いているんですが、リストプログラムの記述の順番かコード自体が間違っていて、うまく動作しません。
入れ替え(ポインタの付け替え)なので、2つだけの処理じゃ足りないんじゃないでしょうか?;;
また、a1と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.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.10
- 回答日時:
>双方向リストとして考えないでも不可能なのでしょか?
今回の話は、単方向にしろ双方向にしろ、リスト構造を使うことが前提なのですよね?
リスト構造を使うからには、次のノードや前のノードを指すためのポインタを必ず使うことになります。
そういうポインタを使わずにリスト構造を使うことは、できません。
質問者さんが本当にしたいことは何なのか、よくわからなくなってきました。
この回答への補足
リスト構造は使用します。
最終的に求める結果は、
入れ替え→表示
さらに入れ替え→表示
さらに入れ替え→表示
さらに入れ替え→表示
さらに入れ替え→表示
終了としたいんです…
お探しの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を探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
LPSTR型の初期化について
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
NULLとブランクの違い
-
str[i] は *(str + i) と同義で...
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
型変換について
-
参照型で受け取った引数をポイ...
-
[C言語] NULLは必ず0(番地)です...
-
C言語の関数と配列に関する質問
-
IStream / VBA
-
どうしてエラーになるかわかり...
-
DelphiでCreateProcessがうまく...
-
配列アドレスの減算
-
C言語でのconstを返す関数
-
Voidポインタで受け取った変数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
NULLとブランクの違い
-
エラーの意味
-
DLL<->VB間での受け渡し(文字...
-
ハンドル、アドレス、ポインタ...
-
【C言語】戻り値が構造体の関数
おすすめ情報