そのため、XOR リンク リストを作成しています。新しいノードにメモリを割り当てようとすると、プログラムがクラッシュします。挿入関数のコードは次のとおりです。
void add(DataType value, XORList ** xlist)
{
XORListNode * node;
node = ( XORListNode* )malloc( sizeof (XORListNode) );
printf("node memory allocated\n");
if ((*xlist)->head->prevPNext == NULL && (*xlist)->tail->prevPNext == NULL) //XOR linked list is empty: [ H - T ] + N => [ H<->T<->N ] => [ H<->A<->T ]
{
node->prevPNext = (*xlist)->tail; //new element points to tail
(*xlist)->tail->prevPNext = ( XORListNode * )( (uintptr_t)(*xlist)->head ^ (uintptr_t)(*xlist)->tail ); //tail points to head and new value
(*xlist)->head->prevPNext = (*xlist)->tail;
(*xlist)->tail->value = value;
(*xlist)->tail = node;
}
else //Otherwise: [ H<->A<->B<-...->X<->T ] + N => [ H<->A<->B<-...->X<->T<->N ] => [ H<->A<->B<-...->X<->Y<->T ]
{
node->prevPNext = (*xlist)->tail;
(*xlist)->tail->prevPNext = ( XORListNode * )( (uintptr_t)(*xlist)->tail->prevPNext ^ (uintptr_t)node );
(*xlist)->tail->value = value;
(*xlist)->tail = node;
}
}
これは XORList の定義です:
typedef struct XORList
{
XORListNode * head, * tail;
} XORList;
そして、これは XORListNode の定義です:
typedef struct XORListNode
{
DataType value;
struct XORListNode * prevPNext;
} XORListNode;
私はまだポインターの経験がないので、コードに関する他のコメントもいただければ幸いです。
ご協力ありがとうございました。