2
CAR *removing(int *numberofstructures,CAR *first)
{
    char categorytoerase[51];
    CAR *helpnode,*actual;
    int i;
    int number_1=0;
    helpnode=(CAR*)malloc(sizeof(CAR));
    actual=(CAR*)malloc(sizeof(CAR));
    actual=first;
    number_1=*numberofstructures;
    helpnode=NULL;
    scanf("%s",categorytoerase);
    for(i=1;i<=number_1;i++)
    {
        if (actual->znacka==categorytoerase)
        {
            if (helpnode != NULL) {
                helpnode->next=actual->next;
                free((void *)actual);
                actual=helpnode->next;
            }
            else
            {
                first = actual -> next;
                free((void *)actual);
                actual = first;
            }
        }
        else{
            helpnode=actual;
            actual=actual->next;
        }
    }
    return first;
}

リンクされたリストからノードを削除する関数を作成したいのですが、最初に文字列を入力する必要があります。入力された文字列のような車のカテゴリ名を持つノードを消去する必要があります。

4

2 に答える 2

1

これは宿題のように見えます....だから、あなたのために答えを書かないそのディックであるという精神で、ノードを削除するという考えをあなたに話します。

ノードには、データと次のノードを指すアドレスが含まれています。

それを知っているので、次のメソッドを作成できます...

先頭から開始し、現在のノードと前のノードへの参照を持ちます

削除する必要があるノードのリストを検索すると、現在および以前のノード変数が常に循環しています。

探しているノードが見つかったら、前のノードの次のアドレス ポインターを、削除しようとしているノードの次のアドレス ポインターに設定します。

頑張れチーフ!

于 2013-02-08T03:04:40.643 に答える
0

AMR そうですね。双方向にリンクされたリストがある場合は、ノードを削除するのが簡単になるため、ノードの構造体に前と次の両方のポインターを含めます。基本的に、疑似コードで削除が行われる方法は次のとおりです (削除するノードへのポインターがあることがわかった後)。

IF todelete.prev != NULL THEN
   todelete.prev.next = todelete.next
ELSE
   list.head = todelete.next
END IF
IF todelete.next != NULL THEN
   todelete.next.prev = todelete.prev
ELSE
   list.tail = todelete.prev
END IF

FREE todelete

if 条件は重要です。そうしないと、プログラムがクラッシュし、ロジックが実際には機能しません。存在しないものをうまく置き換えることはできません。

于 2013-10-28T09:25:35.743 に答える