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;

你永远不会检查是否有第二个元素。如果列表只有一个元素,则会失败——因此它甚至并不总是适用于第一个元素。

        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 回答
0

我不小心处理了这个问题,直到我找到这种方法来删除给定位置的节点:

void delete (int n) {
  struct node *temp = head;
  if (n == 1) {
    head = temp->next;
    (temp->next)->prev = head;
    free(temp);
    return;
  }
  for (int i = 0; i < n - 1; i++) {
    temp = temp->next;
  }
  if (temp->next != NULL) {
    (temp->next)->prev = temp->prev;
    (temp->prev)->next = temp->next;
  } else {
    (temp->prev)->next = NULL;
  }
  free(temp);
}
于 2021-08-01T16:50:12.440 回答