0

これは、リンクされたリストの remove() 関数です。どうすればもっと良くなるでしょうか?またその理由は?

void removeData(void *data, struct accList *theList)
{
  if(theList->head == NULL)                  //nothing can be deleted
    return;
  else if(theList->head == theList->tail)          //there is only one element in the    list
  {
    free(theList->head);
    theList->head = theList->tail = NULL;
  }
  else if(data == theList->head->data)           //the node to be deleted is the head
  {
    struct accListNode *temp = theList->head;
    free(theList->head);
    theList->head = temp;
    theList->head->next = temp->next;
  }
  else if(data == theList->tail->data)      //the node to be deleted is the tail
  {
    struct accListNode *cur;
    for(cur = theList->head; cur->next->next != NULL; cur = cur->next);
    theList->tail = cur;
    free(cur->next);
    cur->next = NULL;
  }
  else                                     //the node to be deleted is any other node
  {
    struct accListNode *cur;
    for(cur = theList->head; cur != NULL; cur = cur->next)
    {  
      if(cur->data == data)     //this is the node we must delete from theList
      {
        struct accListNode *temp = cur->next->next;
        free(cur->next);
        cur->next = temp;
        break;
      }
    }
  }
}

また、free() 関数の詳しい説明を教えてください。「ptr が指すメモリを解放する」という言葉は役に立ちません。

ありがとう

4

1 に答える 1

1

さまざまな特殊なケースをすべてテストする代わりに、リスト要素のポインターへのポインターを操作し、とにかくリストをトラバースしているので、最後に表示された要素を追跡します。

void removeData ( void *data , struct accList *theList ) {
    struct acclist *last = NULL, **finger = &theList->head;
    while ( *finger != NULL ) {
        if ( (*finger)->data == data )
            *finger = (*finger)->next;
        else {
            last = *finger;
            finger = &( (*finger)->next );
            }
        }
    theList->last = last;
    }

このコードは、一致するすべての要素を削除するという点で関数とは異なりますが、一致する最初の要素をdata削除するように簡単に変更できます。data

于 2012-06-23T15:55:47.680 に答える