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