私はCで双方向リンクリストを作成していましたが、データとして3つの変数(typedef int boolを投げた後、2つのintとbool)と2つのポインターnextとprevを持っていました。ざっくり言った機能で奥まで挿入してみた
void insert(list *l, int x, int y, bool z)
{
node *n = makeNode(x, y, z);
if(isEmpty(*l))
l->head = l->tail = NULL;
else
{
l->tail->next = n;
n->prev = l->tail;
l->tail = n;
}
}
そして、私の makeNode 関数は次のように言いました:
node *makeNode(int x, int y, bool z)
{
node *n = malloc(sizeof(n));
n -> x = x;
n -> y = y;
n -> z = z;
n -> next = NULL;
n -> prev = NULL;
return n;
}
それで、次のようなものでそれを印刷します:
void printList(list l)
{
node *i;
for(i = list.head; i != NULL; i = i -> next)
printf("%d %d %d\n", i -> x, i -> y, i -> z);
printf("\n");
}
それは完全に機能しましたが、それから私は持っていました
void reversePrintList(list l)
{
node *i;
for(i = list.tail; i != NULL; i = i -> prev)
printf("%d %d %d\n", i -> x, i -> y, i -> z);
printf("\n");
}
そして、その 1 つのセグメンテーション違反。コードをいじった後、奇妙な理由で、「次の」ポインターは毎回そのままでしたが、「前の」ポインターは、最初に指していたノードを指していませんでした。明らかに、それらはNULLを指していませんでした。また。
さらに、以前は循環二重リンクリストとして実装しようとしていましたが、何らかの理由で次のポインターは正常に機能しましたが、前のポインターは再び奇妙な場所を指していました。
しかし、これが本当に奇妙なのは、ノードに int が 1 つしか含まれていない場合、すべてが線形および循環二重リンク リストの両方で完全に機能することです。そして、コードを C++ に変換するためにいくつかの構文変更を行うと、より大きなノードで完全に機能します。私は全体を見渡しましたが、挿入関数の外側で prev ポインターを変更するはずのコードはありませんでした。では、C でより大きなノードを使用したときに、prev ポインターと prev ポインターのみを台無しにするために何が起こっているのでしょうか?
ありがとう!
復讐のオタク
PSここに私の構造体があります
typedef struct node{
int x;
int y;
bool z;
struct node *next;
struct node *prev;
} node;
typedef struct list{
node *head;
node *tail;
} list;