【问题标题】:C Issue #4 - Double-Linked List Delete All Odd Numbers From a Doubly Linked ListC 问题 #4 - 双链表从双链表中删除所有奇数
【发布时间】:2023-03-16 03:25:02
【问题描述】:

我正在尝试从双向链表中删除所有奇数。 我理解粗略的概念,但在 C 中实现它时遇到了麻烦。 希望有人能帮我解决这个问题!

这是我为此编写的代码。万事如意!

typedef struct lista
{
    int broj;
    struct lista *prev;
    struct lista *next;
}Lista;

Lista *MakeNew ();
Lista *AllocateNode ();
void AddOnEnd ( Lista **p);
int DeleteOddNumbers( Lista **p );
void PrintList ( Lista *p);

int main()
{
    int i, n; printf("N: "); scanf("%d", &n); putchar('\n');
    Lista *lista_brojeva;
    for ( i = 0; i < n; i++ ) 
        AddOnEnd(&lista_brojeva);
    
    int a; 
    a = DeleteOddNumbers(&lista_brojeva);
    PrintList(lista_brojeva);
}

int DeleteOddNumbers( Lista **p )
{
    Lista *tmp = *p;

    if ( tmp != NULL && tmp->broj % 2 != 0 )
    {
        *p = tmp->next;
        free(tmp);
        return 1;
    }
    else
    {
        while ( tmp != NULL && tmp->broj % 2 != 0 )
            tmp = tmp->next;
        
        if ( tmp == NULL ) return 0;
        
        tmp->prev->next = tmp->next;
        free(tmp);
    }
}

【问题讨论】:

  • 如果是我,我会写一个函数来删除你当前所在的节点并返回一个指向下一个节点的指针。然后你可以做一个循环说“如果节点是奇数,则不在末尾,删除我。”
  • 另外,请参阅 thisthis 以便能够提出问题以实际帮助他人。
  • 我认为您的代码的主要问题不在于 C 实现,而在于您的设计。看,你在if 语句和else 语句的第一个while 循环中使用了完全相同的条件。如果您仔细检查流程,您应该会看到此类问题。在询问之前,我真的会检查设计。如果你真的在努力,你还会有一个更具体的问题要问,如果你还有问题的话。
  • 嗨 Dario 和 Jerry,我不知道你发给我的 2 个链接,我刚刚打开堆栈溢出,正在练习,不知道如何解决某些问题,所以我在这里问并完成了很多工作!正如@JerryJeremiah 解释的那样,感谢您的帮助,我已经解决了这个问题,但我对设计和我提出问题的方式更加体贴,谢谢你,Dario Rodriguez!

标签: c linked-list doubly-linked-list


【解决方案1】:

一个简单的解决方案是分配一个新列表并将每个偶数节点推回它,然后释放第一个列表。 这样,您的DeleteOddNumbers 函数应该非常简单:

void delete_odd_numbers(t_lst **lst)
{
    t_lst   *new_lst = NULL;
    t_lst   *tmp = *lst;

    while (tmp)
    {
        if (tmp->value % 2 == 0)
            push_back(&new_lst, tmp->value);
        tmp = tmp->next;
    }
    free_lst(*lst);
    *lst = new_lst;
}

【讨论】:

  • 非常感谢!一定会试试这个,一切顺利!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2016-06-11
  • 2016-10-09
  • 2018-09-16
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
相关资源
最近更新 更多