最初のノードには前のノードがなく、最後のノードには次のノードがないため、最初のノードの前のノードと最後のノードの後のノードのアドレスを 0 と考えてください。トラバーサルを開始するにはこれで十分です。 traverse では常に前のノードのアドレスを手元に持っているため、後続のノードのアドレスを決定できます。このようなリストをトラバースしてデータを出力する例を次に示します... 最初または最後のノードのアドレスを printxorlist に渡すと、順方向または逆方向に出力されます。
void printxorlist(struct LinkNode* node)
{
struct LinkNode* prev = NULL;
while (node)
{
printf("%d\n", node->data);
struct LinkNode* next = (struct LinkNode*)((intptr_t)node->ptrdiff ^ (intptr_t)prev);
prev = node;
node = next;
}
}
node->ptrdiff
実際には正しい型を持っていないため、キャストする必要があることに注意してください。それを正しく宣言する方が良いでしょう:
struct LinkNode
{
int data;
intptr_t ptrdiff;
}
それから
void printxorlist(struct LinkNode* node)
{
struct LinkNode* prev = NULL;
while (node)
{
printf("%d\n", node->data);
struct LinkNode* next = (struct LinkNode*)(node->ptrdiff ^ (intptr_t)prev);
prev = node;
node = next;
}
}