1

ノードのインデックス番号(シリアル番号)によって、リンクされたリストから特定のノードを削除したい。したがって、関数でやろうとしたことは、最初にインデックス番号のユーザー入力を取得したことです。次に、2 つのノード タイプ ポインタtempとを使用しcurrentました。リストのトラバースを開始しcurrent、ノードのインデックス番号がユーザー入力と一致すると、ノードを削除しようとしました。ここまでは正しいです。削除ロジックに問題があります。これが私が試したコードです:

void delete_node(struct node **start,int index_no)
{    
    int counter=0;
    struct node *temp, *current;

    temp=(struct node *)malloc(sizeof(struct node));
    current=(struct node *)malloc(sizeof(struct node));
    current=*start;

    while(current->next!=NULL)
    {
        counter++;
        if(counter==index_no)
        {
            temp= current->next;
            free(current);
            /*I guess some code is missing here. Help me finding the logic.*/
        }
        else
        {
            printf("\n The index number is invalid!!");
        }
    }
}

コメント部分には削除ロジックがありません。また、このコードはスペースと時間の効率が悪いと感じています。もしそうなら、もっとコンパクトにする方法を提案してください。

4

2 に答える 2

1

リンクされたリストからの削除は、実際には次のとおりです。

  • 私たちを指すポインタを見つけてください
  • (見つかった場合)代わりに.nextポインターを指すようにします
  • ノードを削除します。

私たちを指すポインターを変更するには、それへのポインター、つまりポインターへのポインターが必要です。幸いなことに、最初の引数はすでにポインターへのポインターであり、おそらく最初のリスト項目を指すヘッドポインターを指しています。

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

void delete(struct node **pp, int num) {
    struct node *del;
    int counter;

    for (counter=0; *pp; pp= &(*pp)->next) {
        if(counter++ == num) break;
        }

    if (!*pp) { printf("Couldn't find the node(%d)\n", num); return; }

    /* if we get here, *pp points to the pointer that points to our current node */

    del = *pp;
    *pp = del->next;
    free(del);
  }
于 2013-09-11T19:28:06.097 に答える
1

delete 関数で 2 つのノードを割り当てて、メモリ リークを発生させているのはなぜですか? startそれらは、またはその後続のいずれかに初期化する必要があるようです。

nextまた、前の要素のポインターを更新する必要がありstart、削除された要素が最初の要素 (つまり ) である場合は、リストの (ヘッド)も更新する必要がありますindex_no == 1

->nextまた、ポインターを持つノードのみが削除対象と見なされるため、最後のノードを削除できないというオフバイワン エラーもあります。

推奨読書: A Tutorial on Pointers and Arrays in C

于 2013-09-11T19:08:38.570 に答える