-1
NODE* insertNode (NODE* head, NODE* pre, DATA item)
{
//Local Declaration
NODE* curr;

//Statement
if (!(curr = (NODE*)malloc(sizeof(NODE)))
    printf("\amemory overflow in insert\n");

curr->data = item;
if (pre == NULL)
{
   //inserting before first node or to empty list
   curr->next = head;
   head = curr;
}
else 
{
   //inserting in middle or at the end
   curr->next = pre->next;
   pre->next = curr;
}

return head;
}

これは、私が読んでいる本に従って、既存のリストの途中にノードを挿入する方法です。preしかし、ここでどのように定義されているかは実際にはわかりません(先行ノードを指しています)。先行ノードを指すようにポインターpreを定義するにはどうすればよいですか?pre

4

1 に答える 1

2

このリンクは、IMHO、リンクリストのマスター紹介です。

この本が説明しているのは「3ステップリンク」です...

{a、b、c}がa ==> b ==> c==>NULLのような構造体/ノードある仮定ます

次に、最初のリンクの直後にNEWを挿入ます。NEW == > b (最初に、 'ポインターを最初にリセットすると、 bに到達するのに深刻な問題が発生するためです。

次に、aをNEWのようにリンクします... a ==> NEW ...したがって、a ==> NEW ==> b ==> c ==> NULL


これを行うには、ノードにポインタが含まれている必要があります...次のようなものです。

struct node{
  int i;
  struct node* next; // this is the value that will be changed
};

ご覧のとおり、ノードに別のノードへのポインタが含まれている限り、ノードの正確な定義は重要ではありません。


curr現在のノードを指します...したがって、「前」を取得するには、質問にあると思いますが、別のノードへの補完的なポインタを作成できます。 NODE* pre

->ただし、演​​算子を使用するだけで複数のポインターを使用するよりもはるかに簡単なので、実際には不要です。他のノードを指すためにも使用できます。

したがって、私の{a、b、c}の例では、を想定しa、すべてが一意でbあり、前に示したように接続されています。cstruct node

struct node* curr = a;   // a pointer to the head of the list
struct node NEW = malloc(sizeof(struct node)); // make a new node

NEW->next = curr->next;  // set NEW's next to point to b through `curr->next`
/* note that defining previous isn't necessary, b/c it is defined @ curr->next */
curr->next = NEW;        // set curr (a) to point to NEW instead of b

curr単一リンクリストで操作する必要のあるノードの前に設定することを忘れないでください。

于 2013-03-23T20:19:46.740 に答える