【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21699

構造体の削除
投稿者---千石(2005/06/29 16:11:42)


次のようなプログラムで構造体 Del を削除したいです。
if の中は条件が入っています。条件にあった時に削除します。
Date も構造体です。しかし、free(Del)の下に printf で
Del を出力させると Del が消えていません。
なぜだかわかる人教えてください。

while(Date != NULL){
if(条件文){
Del = Date->next;
Date->next = Date->next->next;
free(Del);
}
Date = Date->next;
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体の削除 21700 まきじ 2005/06/29 16:21:09
<子記事> Re:構造体の削除 21718 REE 2005/06/29 19:03:17


No.21700

Re:構造体の削除
投稿者---まきじ(2005/06/29 16:21:09)


>Date も構造体です。しかし、free(Del)の下に printf で
>Del を出力させると Del が消えていません。

何が表示されますか?
free() する前に格納されてた値が表示されますか?


この投稿にコメントする

削除パスワード

No.21701

Re:構造体の削除
投稿者---千石(2005/06/29 16:23:17)


free() する前に格納されてた値が表示されます。



この投稿にコメントする

削除パスワード

No.21702

Re:構造体の削除
投稿者---まきじ(2005/06/29 16:25:00)


>free() する前に格納されてた値が表示されます。

一部だけでは解りませんので、ソース全体を提示してください。


この投稿にコメントする

削除パスワード

No.21703

Re:構造体の削除
投稿者---千石(2005/06/29 16:42:31)


一行を削除してファイルに書き込むプログラムです。
全て書くと何百行になるので必要なところだけ書きます。
構造体 Date には関数でリスト構造でデータは上から下まで入ってます。
構造体 Top は Date は一番上のデータを持ってきていて Top に
いれたのでリスト構造の一番上にあるデータです。
INPUT_FILE_NAME は一番上で定義してあります。
fp はファイルのアドレスを示しています。
k は配列です。
printf でどこで出力しても Date も Top も Del も
ちゃんと出力されるのですが free の後でも Del は消えません。
リスト構造の一番最後のデータを入力した時だけ
free の後に Del が消えます。
どういうことでしょうか?

fp = fopen(INPUT_FILE_NAME,"w");
scanf("%s",&k);
Top = Date;
if(strcmp(Date->name,k) == 0){
Del = Date;
Date = Date->next;
free(Del);
}
while(Date != NULL){
if(strcmp(Date->next->name,k) == 0){
Del = Date->next;
Date->next = Date->next->next;
free(Del);
}
Date = Date->next;
}
Date = Top;
while(Date != NULL){
fprintf(fp,"%s\n",Date->name);
Date = Date->next;
}


この投稿にコメントする

削除パスワード

No.21704

Re:構造体の削除
投稿者---まきじ(2005/06/29 16:56:46)


>一行を削除してファイルに書き込むプログラムです。
>全て書くと何百行になるので必要なところだけ書きます。

必要な部分は、全部です。
free() してる部分だけ提示されてる様ですが、
他に原因があるかもしれませんので、全部、提示して下さい。

Data、Del、Top は、構造体へのポインタですか?


この投稿にコメントする

削除パスワード

No.21706

Re:構造体の削除
投稿者---千石(2005/06/29 17:03:25)


Data、Del、Top は、構造体へのポインタです。
削除に関するプログラムはこれで全部です。


この投稿にコメントする

削除パスワード

No.21705

Re:構造体の削除
投稿者---おでん(2005/06/29 17:01:36)


ちょっと見ですが、解放時にnextをクリアしていないのが問題かと?

Del = Date->next;
Date->next=NULL ;

実際にメモリが開放されるのは、OSの都合ですからプログラム走行中に
データが残っていることは珍しくありません。


この投稿にコメントする

削除パスワード

No.21707

Re:構造体の削除
投稿者---千石(2005/06/29 17:11:03)


教えてもらったプログラムで Del が消えました。
しかし Date->next が消えると Date->next 以降のデータも
消えてしまうのではないですか?
どのように対処すればよいのですか?




この投稿にコメントする

削除パスワード

No.21708

Re:構造体の削除
投稿者---まきじ(2005/06/29 17:18:27)


>しかし Date->next が消えると Date->next 以降のデータも
>消えてしまうのではないですか?

参照を切っただけですので、影響はないはずです。


この投稿にコメントする

削除パスワード

No.21711

Re:構造体の削除
投稿者---千石(2005/06/29 17:32:27)


Date->next = NULL; を(1)に入れた場合は
Date,Date->next が消えてしまいました。
(2)に入れた場合はDate->next が消え、
Date->next->next も消えてしまいます。
そして Date だけは残っていました。

Del = Date->next;
 (1)
Date->next = Date->next->next;
(2)
free(Del);


この投稿にコメントする

削除パスワード

No.21714

Re:構造体の削除
投稿者---千石(2005/06/29 17:47:40)


Date->next = NULL; を(1)に入れた場合は
Date,Date->next が消えてしまいました。
(2)に入れた場合はDate->next が消え、
Date->next->next も消えてしまいます。
そして Date だけは残っていました。

Del = Date->next;
 (1)
Date->next = Date->next->next;
(2)
free(Del);


この投稿にコメントする

削除パスワード

No.21716

Re:構造体の削除
投稿者---まきじ(2005/06/29 17:58:08)


>Date->next = NULL; を(1)に入れた場合は
>Date,Date->next が消えてしまいました。
>(2)に入れた場合はDate->next が消え、
> も消えてしまいます。

消えたのではなく、Data -> next、Date->next->next
を参照してる変数がないだけです。

ノードの繋ぎ変えの問題です。
必要なノードは、参照させておかないと、
参照することが出来なくなります。


この投稿にコメントする

削除パスワード

No.21710

Re:構造体の削除
投稿者---おでん(2005/06/29 17:30:38)


>教えてもらったプログラムで Del が消えました。
>しかし Date->next が消えると Date->next 以降のデータも
>消えてしまうのではないですか?
>どのように対処すればよいのですか?
>
普通は、削除する前にリンクの張り替えをします。

┌───┬─→┌───┬─→┌───┬─→
│      │    │      │    │      │
│      │    │      │    │      │
└───┘    └───┘    └───┘

┌───┬────────→┌───┬→
│      │ p→┌───┬→  │      │
│      │    │      │    │      │
└───┘    │      │    └───┘
              └───┘

free(p)
┌───┬────────→┌───┬→
│      │                  │      │
│      │                  │      │
└───┘                  └───┘




この投稿にコメントする

削除パスワード

No.21712

Re:構造体の削除
投稿者---おでん(2005/06/29 17:33:22)


参考までに
http://www.mybrain.jp/java/DS/DS_linkedList_delete.html


この投稿にコメントする

削除パスワード

No.21715

Re:構造体の削除
投稿者---千石(2005/06/29 17:51:04)


ありがとうございました。見させてもらいました。
しかし、そうなると下のようなプログラムでいい気がするんですが、
free の後に Del が表示されてしまいます。
初心者なものでたびたびすみませんが教えてください。

Del = Date->next;
Date->next = Date->next->next;
Del->next = NULL;
free(Del);




この投稿にコメントする

削除パスワード

No.21717

Re:構造体の削除
投稿者---まきじ(2005/06/29 18:34:15)


>しかし、そうなると下のようなプログラムでいい気がするんですが、

>Date->next = Date->next->next;

で、Data -> next を Date->next->next に
してるにも関わらず、次で、

>Del->next = NULL;

とするのは、意味がないと思いませんか?

>free の後に Del が表示されてしまいます。

free() していれば問題ないでしょう。
free() してないよりマシです。
環境依存か処理系依存ってところではないでしょうか?


この投稿にコメントする

削除パスワード

No.21718

Re:構造体の削除
投稿者---REE(2005/06/29 19:03:17)


>Date も構造体です。しかし、free(Del)の下に printf で
>Del を出力させると Del が消えていません。

freeした後で、その領域を参照してはいけません。
freeはノードを削除する関数ではなく、メモリを解放する関数です。
解放したものは、もう使えません。

リスト構造の場合、そのノードへのリンクが他のどのノードからも無くなれば、削除したことになります。




この投稿にコメントする

削除パスワード

No.21723

Re:構造体の削除
投稿者---千石(2005/06/29 20:42:33)


削除した後は参照してはいけないということですね。
ということはこの Del が出力されないことがファイルを
削除できない原因ではないと思うので他の原因を考えたいと思います。
このままではすごく長くなってしまいそうなので
自分で考えてみたいと思います。
答えてもらった方、ありがとうございました。





この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧