1

私はCが初めてで、リンクされたリストを学ぼうとしています.誰かが私に以下のコードを説明してもらえますか. 一部は理解できますが、すべてではありません。

void deletefrombeginning( node **head, node **tail)
{
  node *temp;
  if(*head==NULL)
    return;
  temp=*head;
  if(*head==*tail) 
            *head=*tail=NULL;
  else
      {
          (temp->next)->prev=NULL;  <-- there is where i get lost.
          *head=temp->next;
       }
        free(temp);
}
4

2 に答える 2

1
(temp->next)->prev=NULL;

この行は、新しいヘッドになるものの前のポインターを NULL にしています。したがって、リンクされたリストの 2 番目のアイテムが新しいヘッドになると、次のようになります。

*head = temp->next;

prev ポインターがないため、新しいヘッドです。

于 2013-02-17T02:55:40.200 に答える
0

             ------              ------         
            |      | <--prev--- |      |
NULL <----- | temp |            | node | -----> ...
            |      | ---next--> |      |
             ------              ------

簡潔な答え:

  • (temp->next)->prev=NULL;node->prev無効なメモリにアクセスしないようにします。
  • *head=temp->next;tempリストの新しい先頭になります。

長い答え:

  • あなたは現在 にいtempます。
  • tempリンクが壊れてしまうため、最初に削除することはできません(何をnode->prev指しているでしょうか?)。
  • これは、最初に に関連するリンクを削除する必要があることを意味しますtemp
  • tempは最初のノードであるため、temp->prevを指す必要がありNULLます。
  • So(temp->next)->prev=NULL; は と同等node->prev = NULL;です。
  • 現時点では存在をnode->prev = NULL;知らないため、直接行うことはできません。node
  • *head=temp->next新しいリスト ヘッドがnode(上記の ascii デモンストレーションで) であることを確認します。
  • 次の手順では、 で使用されているメモリを解放しますtemp

ヒント:あなたが私のように細かいことを気にしている場合は、解放した直後に割り当てtempたいと思うかもしれません。これにより、コードの残りの部分でNULL誤ってアクセスすることがなくなります。tempメモリを解放した後でも、メモリはエラーでアクセスできます。

于 2013-02-17T08:51:48.660 に答える