5
#define TAILQ_ENTRY(type)                       \
struct {                                \
    struct type *tqe_next;  /* next element */          \
    struct type **tqe_prev; /* address of previous next element */  \
}

ポインタからポインタへのポインタを使用する上記のコードを見つけましたが、これだけではありません。なぜそうするのか知りたいですか?ポインタ自体はそれを処理できませんか?

4

1 に答える 1

5

ここでのポイントは要素の削除だと思います。単独でリンクされたリストがあると考えてください。これは、そのノード全体を順方向にナビゲートできることを意味します。

N_jここで、削除したいジェネリック リスト ノード (たとえば) を考えます。それを削除した後、前のノード(たとえばN_{j-1}) をのノード (たとえば)に簡単にリンクしたいとしますN_{j+1}。したがって、それへのポインタ、つまり のポインタへのポインタを必要とtqe_nextする前のノードのフィールドを変更する必要があります。N_{j-1} tqe_prevN_j

つまり、疑似コードの用語では、次のことが成り立ちます。

 *(N_j.tqe_prev) ==  (N_{j-1}).tqe_next

また

 N_j.tqe_prev ==  &(N_{j-1}).tqe_next

.

于 2012-11-18T08:14:07.777 に答える