C Linked List - 理解,如何删除列表中的相同元素

C Linked List - understending, how to delete the same element on list

有人可以告诉我,这个功能怎么可能起作用吗? 这是我的结构:

struct el{
    int key;
    struct el *next;
};
typedef struct el elListy;
typedef elListy *list;

这是函数:

void delete(list *l, int zm)
{
    list p, *k;
    k = l;
    while ((*k))
    {
        if ((*k)->key == zm) {
            p = *k;
            *k = (*k)->next;
            free(p);
        }
        else
        {
            k = &(*k)->n;
        }
    }
}

如果有人能说明,那就太棒了。

我没试过,但我很乐意帮助你。让我们来看看。正如其他用户所建议的那样,double typedef 真的很烦人;代码根本不清楚,理解这段代码的作用更加复杂。结构组合是关于键、标签和指向下一个结构的指针。函数 delete() 正在将他的 int zm 作为参数与链表的任何节点进行比较。第二个参数是链表根指针,也就是起始指针。

关于功能: 换句话说,该函数正在读取链表的任何值(键)并将其与 int zm 进行比较。如果 key 不同,(*k) 将是下一个指针。此方法允许从起始节点参数读取每个节点。注意最后一行 n 应该是 next.

如果key和zm相等,函数用free()函数释放链表的节点(因为链表节点通常是用malloc或calloc函数构建的)并设置k的值 -这是一个双指针,第一个指针的值 (*k) 也是一个指针 - 指向下一个指针,以便检查下一个节点并在需要时将其删除。

特别是,如果 zm 等于键,函数:

  • 将指针的值保存在p变量中;

  • 设置k指向下一个struct,因为while条件是配置在k值上的,有可能找到2个或更多具有相同key的节点;

  • 释放 p 指向的正确内存;

重要的是要关注两件事: 1) 设置 k 值指向下一个结构很重要,因为可以防止代码不停止到它找到的第一个值。 2) while条件,(*k),表示你正在检查k的值,它是一个指针,直到它为NULL,这意味着结束。

希望已经足够清楚了,我是来寻求其他帮助的。

风险自负!!!

// sory i have chaged the names, this will make it litle bit clearer

typedef struct elment elment, *p_elment;

typedef p_elment *list;

struct elment{
    int         key;
    p_elment    next;
    p_elment    prev; // you will need it;
};


void delete(list *l, int zm) {

    p_elment    k,p;

    k = (p_elment) *l; // cast to avoid warnings

    while (k){
        p = k;
        k=k->next;

        if (p->key == zm) {

            if (*l == p) 
                  *l=p->next;

            if(p->prev)
                p->prev->next = p->next;

            if(p->next)
                p->next->prev = p->prev;

            free(p);
        }
    }
}