从列表中删除元素

时间:2018-12-12 09:34:36

标签: c list

#include <stdio.h>
#include <malloc.h>

struct el {
    int info;
    struct el* next;
};

struct el* create_el(struct el* Li)
{
    int num;

    printf("\n\nInsert number:\n\n");
    scanf("%d", &num);

    Li = (struct el*)malloc(sizeof(struct el));

    if (Li != NULL) {
        Li->info = num;
        Li->next = NULL;
    }
    return (Li);
}

struct el* push(struct el* L, struct el* e)
{ //inserts the elements from the head of the list
    if (L == NULL)
        return (e);
    else {
        e->next = L;
        L = e;
        return (L);
    }
}

void visualize(struct el* primo)
{
    printf("\n\nList-->");

    while (primo->next != NULL) {
        printf("%d", primo->info);
        printf("-->");
        primo = primo->next;
    }
    if (primo->next == NULL)
        printf("%d-->NULL", primo->info);
}

struct el* cancel(struct el** P, int val)
{ //delete element
    struct el* prec = NULL;
    struct el* curr = (*P);

    if (P == NULL) //case empty list
        return NULL;
    else if (prec == NULL) {
        if (curr->info == val) { //case 2 : if the element is the head
            (*P)->next = curr->next;
            free(curr);
            curr = NULL;
        }
    }
    else {
        while ((curr != NULL) && (curr->info != val)) {
            prec = curr;
            curr = curr->next;
        }
        if (curr->next == NULL && curr->info == val) { // case 3: the elemnt is the last one
            prec->next = NULL;
            free(curr);
            curr = NULL;
            return (prec);
        }
        else {
            if (curr->info == val) { //other cases
                prec->next = curr->next;
                free(curr);
                curr = NULL;
                return (prec);
            }
        }
    }
}

int main()
{
    struct el* head = NULL;
    struct el* element;
    struct el* list = NULL;

    int i, n;
    int elem;

    printf("Insert the number of elements for the list:\n\n");
    scanf("%d", &n);

    for (i = 0; i <= n; i++) {
        element = create_el(head);
        if (element != NULL) {
            list = push(list, element);
        }
    }

    visualize(list);

    printf("\n\nInsert the element that you want to cancel:");
    elem = scanf("%d", &elem);

    cancel(&list, elem);

    visualize(list);
}

我想要做的就是从列表器中删除一个元素,但是在所有过程之后,列表将被打印而没有任何修改。

任何人都可以看到函数cancel中的错误吗(该函数旨在通过包含元素的任何可能位置来删除它)?

1 个答案:

答案 0 :(得分:0)

在您的函数cancel中,P绝对不是NULL(假设操作系统最初为其分配了地址)。 precNULL,执行进入if循环之前。 因此,执行将执行该行

if(curr->info==val)

现在,如果您提供的值valcurr->info不匹配,则执行将退出该函数,而不会删除任何节点。