-3

線形単一リンクリストから特定のノードを削除する次のコードがあります。このプログラムを改善できるかどうか、いつ壊れるか知りたい

   struct node
    {
      int num;
      struct node *next;
    } ;


   typedef struct node s;

    void delete(struct node *first)
     {
            int flag = 0;
            s *ptr, *lastNodePtr = NULL, *deleteNode;
            deleteNode = (s*) malloc(sizeof(s));
            printf("enter the node value to delete");
            scanf_s("%d",&deleteNode->num);
            deleteNode->next = NULL;

            for (ptr=first;ptr!=NULL;ptr=ptr->next) //at least one element exist
            {
              if(deleteNode->num == ptr->num)
              {
                flag=1;
                if(ptr==first) //need to delete at first place
                {
                  free(ptr);
                  first = null; //i dont think we need to do this as it points to ptr and ptr is already null.
                }
                else // need to delete some where middle.it can be last as well.
                {
                  lastNodePtr->next=ptr->next;
                  free(ptr);
                }

                printf("successfully deleted..");
                break;
              }

              lastNodePtr=ptr; // taking note of last node visited..
            }

            if (flag==0)
            {
              printf("\n Couldn't find the node");
              return;
            }
      }
4

2 に答える 2

1

ptr が削除するリスト内の最初の要素である場合、ptr の次ではなく、最初に null を設定します。(副作用: リストの残りを解放することはできません)

EDITH: delete は新しい Head を返す必要があります。それを構造体ノードにすることをお勧めします **最初の要素が削除された場合に最初の要素を変更する最初のパラメータ

ところで: malloc の結果を決してキャストしないでください。

ところで2つ。なぜループを使用するのですか? 誰もがリンクされたリストでwhileループを使用します

ところで 3: リンクされたリストの通常の変数名は、"head"、"list"、"next"、"prev"、"last" で、良い副作用があります。それらはすべて同じ長さなので、きれいに整列されます。

于 2013-09-08T12:53:21.977 に答える