简体   繁体   English

C 问题 #4 - 双链表从双链表中删除所有奇数

[英]C Issue #4 - Double-Linked List Delete All Odd Numbers From a Doubly Linked List

I am trying to delete all odd numbers from a doubly linked list.我正在尝试从双向链表中删除所有奇数。 I understand the rough concept, but I am having trouble with implementing it in C.我了解粗略的概念,但在 C 中实现它时遇到了麻烦。 Hope someone could help me out with this!希望有人可以帮助我解决这个问题!

This is the code that I wrote for this.这是我为此编写的代码。 All the best!一切顺利!

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

One easy solution would be to allocate a new list and to push each even node back to it, then free the first list.一个简单的解决方案是分配一个新列表并将每个偶数节点推回它,然后释放第一个列表。 This way, your DeleteOddNumbers function should be very simple:这样,您的DeleteOddNumbers function 应该非常简单:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM