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



有人能告诉我这个函数是如何工作的吗?这是我的结构:

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;
        }
    }
}

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

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

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

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

特别是,如果zm等于密钥,则函数:

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

  • 设置k指向下一个结构,因为while条件是在k值上配置的,并且可以找到2个或多个具有相同键的节点;

  • 释放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);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新