【问题标题】:i need to remove same elements from list in c [closed]我需要从 c 中的列表中删除相同的元素 [关闭]
【发布时间】:2014-03-26 13:19:31
【问题描述】:

有人可以结束这个算法吗?

void trinti_pasikartojancius(struct el * *prad, struct el * *pab, struct el * elem){
    struct el *g, *elemk;
    int i =1;
    g = *prad;
    elem= elem->kitas;
        if(g->duom == elem->duom){
            elem->kitas->pries = elem->pries;
            elem->pries->kitas = elem->kitas;
            free(elem);
            if( g->kitas != NULL){
                g = g->kitas;
                g->pries = NULL;
                free( *prad );
                *prad = g;
            }
            else{
                free ( *prad );
                *prad = NULL;
                *pab = NULL;
            }
        }
}

(通过谷歌翻译将变量名称翻译成英文。我相信这个问题的意思是“有人可以完成这个算法吗?”)

void delete_duplicate (struct e ** start, struct ** e end, struct elem * e) {
    struct e * g * elemk;
    int i = 1;
    g = * start;
    elem = elem-> next;
        if (g-> conn == elem-> data) {
            elem-> next-> v = elem-> before;
            elem-> v-> next = elem-> next;
            free (items);
            if (g-> next! = NULL) {
                g = g-> next;
                g-> before = NULL;
                free (* start);
                * start = g;
            }
            else {
                free (* start);
                * start = NULL;
                * end = NULL;
            }
        }
}

【问题讨论】:

  • 问题是什么?
  • 上下文是什么?什么是阻塞?为什么变量名称不透明?
  • OP:为清楚起见,我建议您将变量名称从立陶宛语更改为英语。

标签: c list linked-list


【解决方案1】:

假设(正如 Google 告诉我的)prieskitas 是立陶宛语的“上一个”和“下一个”,那么我们有一个双向链表,我猜想我们正在删除一个元素。

问题似乎是您的if/else 周围没有循环。在编写程序时,如果没有循环,g->duom == elem->duom 不可能为真,除非prad(开始)是elem

但既然您已经知道要删除的节点 (elem),为什么还要寻找它呢?从这个开始:

elem->kitas->pries = elem->pries;
elem->pries->kitas = elem->kitas;
free(elem);

这会将elem 从它所在的任何列表中删除。

但是,您可能还需要注意两个条件。 elem 可以是列表的开头 (prad) 或列表的结尾 (pab) 或两者兼而有之。因此,如果这些很重要(有时不重要),请单独检查。

如果您想/需要偏执,您还应该遍历列表(就像一个搜索例程,我假设您已经编写过)以确保 pradpabelem都是同一个列表的一部分。

如果您需要更完整的流程指南,可以使用full sample program 来实现每个列表操作。它可能不适用于您的应用程序,但至少可以在您迷路时为您指明前进的方向。

编辑:我对翻译尝试进行了更深入的研究,现在我知道发生了什么。删除 elem 参数的重复项更有意义。

我的第二段是重要的。你需要一个循环。您生成的代码甚至有 space 用于循环,缩进看起来很奇怪。它应该类似于:

while (g != NULL) {
    /* Your existing, indented code here */
    g = g->kitas;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2013-01-13
    相关资源
    最近更新 更多