-1

私は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;
4

3 に答える 3

1

これは何ですか????

int i;
for(i = list.tail; i != NULL; i = i -> prev)
  printf("%d %d %d\n", i -> x, i -> y, i -> z);  /* WTF??? */

私はもっ​​と次のようなものを期待します:

struct mystruct {
  int value;
  struct mystruct *next;
  struct  mystruct *prev;
};
...

  struct mystruct *s;
  ...
  while (s != NULL) {
      printf("value=%d next=%x prev=%x\n", s->value, s->next, s->prev);
      ...

PS: 「リスト」と「ノード」の定義のコードを投稿していただけますか? 彼らは有望に見えるかもしれません...

于 2012-06-04T02:16:10.803 に答える
1
node *n = malloc(sizeof(n));

これは意味がありません。ノードへのポインターではなく、ノードを保持するのに十分なバイトを割り当てたい。試す:

node *n = malloc(sizeof node);
于 2012-06-04T03:02:48.390 に答える
0

挿入関数の else 部分に小さなことに気付きました。
行 l->tail=n の後、 l->tail->next = NULLにする必要があると思います
。これは、最後のノードの次のノードを NULL に割り当てるためのものです。あなたのコードに欠けているようです。

于 2012-06-04T04:19:24.520 に答える