プロが教える店舗&オフィスのセキュリティ対策術

ある本にリストについてのっていたのですが、その本に
ソースがのっていたのですが、わかりません。
ソースは、下記に載せたのがすべてです。

リストについてですが、char line[256];は、データの部分で
すか?p->prev->next = p->next;これは、かなり複雑ですね
こんな参照の方法ありましたっけ?
p->next->prev = p->prev;これも同じです。

p->next = c
c->prev = p
c->prev->next = p;

上記の3つですが、pとcを代入していますよね、pとcというのは
要素のどの部分でもないですよね。
prevやnextだったら、要素の部分なのでそれをつなぎ換えたり
して、リストを組むというのは想像がつくのですが、pとcっていう
のは、ただ漠然としていますよね。どこを指しているかわかりま
せんよね。char ptr[20];と同じようにptrには、先頭のアドレスが
入っていたように、pとcには、何か具体的な情報が入っている
のでしょうか?

/* 両隣へポインターをつなぐ */
p->prev = c->prev;
p->next = c;
/* 両隣のポインターをつなぎ換える */
c->prev->next = p;
c->prev = p;
上記も複雑ですね・・・
解説お願いします・・・
free(p);はメモリの解放ですか?

リスト

*prevは前の要素へのポインター
*nextは後ろの要素へのポインター

typedef struct list_t {
char line[256];
struct list_t *prev;
struct list_t *next;
} LIST;

delete_line(LIST *p)
{
p->prev->next = p->next;
p->next->prev = p->prev;
free(p);
}

insertt_line(LIST *c, LIST *p)
{
/* 両隣へポインターをつなぐ */
p->prev = c->prev;
p->next = c;
/* 両隣のポインターをつなぎ換える */
c->prev->next = p;
c->prev = p;
}

ご指導よろしくお願いします。

A 回答 (4件)

同じような質問があり、回答がたくさん出てます、参考にどうぞ。



http://www2.realint.com/cgi-bin/tarticles.cgi?po …

参考URL:http://www2.realint.com/cgi-bin/tarticles.cgi?po …
    • good
    • 0

>pとcっていうのは、ただ漠然としていますよね。

どこを指しているかわかりませんよね。
>char ptr[20];と同じようにptrには、先頭のアドレスが入っていたように、pとcには、何か具体的な情報が入っているのでしょうか?

漠然としていていいのです。
例えばprintfにしても、何を表示するかが決まっているわけではありませんよね?
具体的な情報は、呼び出す側が引数で指定するのです。

insertt_lineの場合、100行目と101行目の間に1行挿入させたければ、cには101行目のデータのアドレスを、pには挿入するデータのアドレスを渡すという決まりが存在する事になります。
    • good
    • 0

> マルチポストですか?



日下部陽一さんって、あのヘミ猫のvoidさんなんですかね?
だとしたら初心者向けに易しく解説するなんてことはきっとないでしょう。参考書を変えてみたらどうですか。

そうじゃなくても、何冊か読んで色々と試しているうちになんとなくわかってくるものだと思います。
    • good
    • 0

>リストについてですが、char line[256];は、データの部分ですか?



そうです。

わからないときは、図を描いてみましょう。

このリストの要素(構造体)は、次の要素へのポインタと、ひとつ前の要素へのポインタと(今回とくに関係ないデータ)を持っています。
それぞれの要素のイメージは、「 ←|p|→ 」こんな感じ。これの左右に同じような要素が連なります。

リストがつながっているなら、右向き、左向きの矢印が一本づつ、計2本が要素と要素の間にはさまれた感じになります。

>p->prev->next = p->next;
これはリストから要素pを消す作業でしょう。「pの1個前の要素から見て、次の要素はpの次の要素」といえばいいのかな?

>pとcっていうのは、ただ漠然としていますよね
pやcはリストの要素(を示すポインタ)です。

printf("%x",p);や、printf("%x",p->next);
などすると、16進数でアドレスが表示されますから、見てみましょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!