2

C で以下のプロトタイプを使用して最後のノードを削除できますか -: int delete(struct node *head, int item)

注-: ここでの最初の引数は、開始ノードへのポインターではなく、開始ノードへのポインターです。

ありがとう

4

9 に答える 9

9

はい。最初のノードから始めて、単方向リストの最後のノードを削除することができます。

次のコードを試してください。

int delete(struct node *head)
{
  struct node *temp =head;
  struct node *t;
  while(temp->next != NULL)
  {
    t=temp;
    temp=temp->next;
  }
  free(t->next);
  t->next=NULL; 
}  

ただし、リンクされたリストに要素が 1 つしかない場合、その要素を削除した後も、ヘッド ポインターは、delete(). このような場合は、次のバージョンの を使用してdelete()ください。

struct node *delete(struct node *head)
{
  struct node *temp =head;
  struct node *t;
  if(head->next==NULL)
  {
    free(head);
    head=NULL;
  }
  else
  {
     while(temp->next != NULL)
     {
        t=temp;
        temp=temp->next;
     }
     free(t->next);
     t->next=NULL; 
  }    
  return head;
}

delete()次のように関数を呼び出します。

head=delete(head);
于 2013-06-19T06:52:27.057 に答える
2

答えは、質問が正確に何を意味するかによって異なります。

もちろん、リストに複数の要素が含まれている場合は、最後の要素 (= リストの末尾の要素) を簡単かつ安全に削除できます。最後の要素の前の要素に反復し、最後の要素を削除してnext、新しい最後の要素のポインターを更新するだけです。headその場合、呼び出し元のポインターは、有効なリストへの完全に有効なポインターのままであることに注意してください。

ただし、最初にリストに含まれていた要素が 1 つだけの場合 (つまり、head既に最後の要素を指している場合)、もちろん簡単に削除できますが、残念ながら関数head内から呼び出し元のポインターを更新することはできませんdelete。このような削除の後、呼び出し元のheadポインターは無効になります。これは、割り当てが解除されたメモリを指します。つまり、ダングリング ポインタになります。

通常、そのような関数を実装するときは、リストが空になるタイミングを呼び出し元が認識できるようにする必要があります。さまざまな方法で実装できます。たとえば、最初のパラメーターがヘッド ノードへのポインター ツー ポインターとして宣言されている場合、呼び出し元のheadポインターを関数内からアクセスおよび変更できるようにすることができます。delete

int delete(struct node **phead, int item)
...
delete(&head, 42);

またはdelete、更新されたヘッド ポインター値を常に返すように関数を作成することもできます。

struct node *delete(struct node *head, int item);
...
head = delete(head, 42);

あなたの場合、その問題点が重要かどうかはわかりません。head「ポインターツーポインターではない」とあなたが言及しているという事実は、これが実際に重要である可能性があることを示唆しています。

PS質問の「最後」という言葉は、リストの末尾の要素を指すのではなく、リストの最後に残っている要素を指すと思われます。つまり、質問は、要素が 1 つしか残っていない状況に関するものです。その場合、上記を参照してください...

于 2013-06-19T06:56:37.180 に答える
0

このコードは、リンクされたリストの最後の要素を削除するために機能します。

void dellast()
{

r=head;

    struct node* z;
    do
    {
        z=r;
        r=r->next;
        if(r->next==NULL)
        {
            z->next=NULL;
            free(r->next);
        }   
    }while(z->next!=NULL);
}
于 2016-07-30T18:40:45.483 に答える
0

はい、各 list_node->next を循環するだけで、head->next から始めて list_node->next が null になるまで続けることができます。その時点で、現在の list_node が削除されます。あなたの質問を正しく理解していれば...

于 2013-06-19T06:51:47.277 に答える
0

リンクされたリストの最後のノードを削除する方法を探している場合は、このコードが役立ちます:)

int delete(struct node *head, int item)
    {
        if(head==NULL)
        {
            printf("\n\t\t~~~NO NODE PRESENT~~~\n\t\t\t :p\n");
            return 0;
        }
        else
        {
            struct node*temp;
            struct node*temp2;
            temp=head; // just to keep a record of original head.
            while(temp->n->n !=NULL)
            {
                temp=temp->n;
            }
            temp2=temp->n;
            temp->n=NULL;
            free(temp2);
        }
        return 0;
    }
于 2013-06-19T06:53:54.870 に答える
0
void delete_last(){    
    struct node *ptr=start;
    while(ptr->next->next!=NULL){
        ptr=ptr->next;
    }
    ptr->next=NULL;
    free(ptr->next);    
}
于 2017-09-05T04:13:58.517 に答える