1

私のコードは、リンクされたリストの先頭にある要素では機能しますが、途中または最後の要素では機能しません。あなたの助けに感謝!

void remove(){
    if (!head)
        printf("\nNo nodes to delete. List is empty.");
    else{
        int n;
        struct node* help = head;
        printf("Enter an element to delete: ");
        scanf("%d", &n);
        if(head->data == n){
            help-> next->prev = 0;
            head = help -> next;
        } else{
            while(help -> next){
                if(help -> data == n){
                    help -> next -> prev = help -> prev;
                    help -> prev -> next = help -> next;
                }
                else help = help -> next;
            }
        }
    }   
}
4

3 に答える 3

1

まず、NULL を意味するために 0 ではなく NULL を使用します。Cでは、する必要があります。C++ ではオプションですが、質問 C にタグを付けました。

help-> next->prev = 0;

2 番目の要素があるかどうかを確認することはありません。リストに要素が 1 つしかない場合、これは失敗します。したがって、最初の要素に対して常に機能するとは限りません。

        while(help -> next){
            if(help -> data == n){

これにより、最後の要素に到達すると(ただし、処理する前に)リストを見るのをやめるため、最後の要素を削除できなくなります。しかし、そうしなかったとしても、次の行:

                help -> next -> prev = help -> prev;
                help -> prev -> next = help -> next;

後に別の要素があることを確認していないため、最後の要素である場合はクラッシュします。

また、矢印の前後のスペース->はかなり珍しいです。もうそれをしないことをお勧めします。

于 2013-08-29T09:26:31.870 に答える
0
struct node *head, *tail; //global head & tail

int delete_item() {
    int del_data = 0;
    struct node *item = head, *tmp;
    scanf("%d", &del_data);
    while(item){
        if(item->data == del_data){
            tmp = item;
            if(item->next){
                //it's not tail
                item->next->prev = item->prev;
            } 
            else {
                //it's tail
                tail = item->prev;
                if(tail)
                    tail->next = NULL;
            }
            if(item->prev){
                //it's not head
                item->prev->next = item->next;
            }
            else {
                //it's head
                head = item->next;
                if(head)
                    head->prev = NULL;
            }
            //free memory
            free(tmp);
        }
        //move forward
        item = item->next;
    }
return 0;
}
于 2013-08-29T09:48:43.303 に答える