【发布时间】:2019-05-03 22:05:02
【问题描述】:
大家早上好/晚上好, 我想在脑海中澄清以下关于链表函数的概念(在这种情况下是递归的)。
让我们采用以下程序,递归地消除链表中的重复项:
ElementoDiLista* deleteDuplicates(ElementoDiLista* head)
{
if (head == NULL)
{
return NULL;
}
if (head->next == NULL)
{
return head;
}
if (head->info == head->next->info)
{
ElementoDiLista *tmp;
tmp = head->next;
head->next = head->next->next;
free(tmp);
return deleteDuplicates(head);
}
else
{
head->next = deleteDuplicates(head->next);
return head;
}
}
使用我的结构定义并以这种方式列出:
struct el {int info; struct el *next;};
typedef struct el ElementoDiLista;
typedef ElementoDiLista *ListaDiElementi;
然后我主要以这种方式调用函数:
Lista1 = deleteDuplicates(Lista1);
Lista1 声明如下:ElementoDiLista Lista1 = NULL
我的问题是,我习惯于声明无效或依赖于单一类型的函数(int、float ecc...) 我想澄清两件事:
为什么函数被声明为
ElementoDiLista* deleteDuplicates(ElementoDiLista* head),因为对我来说它更直观ListaDiElementi deleteDuplicates (ListaDiElementi *head),但不幸的是,它不起作用。我不太清楚为什么函数返回 head 或 NULL 值,但这就是我认为为什么在主 Lista1 中取函数值的原因,因为函数会修改列表本身,我我对吗?
很抱歉,如果这些问题不是很令人兴奋,我只是在努力理解一般的列表并且非常困难, 任何帮助或建议将不胜感激,
还是谢谢大家!
【问题讨论】:
-
该函数修改了列表的头部,所以它需要以某种方式将信息返回给调用者。出错时返回 NULL。可以是
void deleteDuplicates(ElementoDiLista **head),您可以在其中修改函数内部的头指针。你想返回指针,而不是数据。 -
ElementoDiLista *等同于ListaDiElementi,因此您可以使用这些声明中的任何一个。 -
ElementoDiLista* deleteDuplicates(ElementoDiLista **head) 有效吗?
-
注意:不鼓励在 typedefs 中隐藏指针。所以不鼓励
typedef ElementoDiLista *ListaDiElementi;(因为现在还不清楚它是否与指针有关)。 -
@PaulOgilvie 很抱歉可以更具体吗?
标签: c function recursion linked-list singly-linked-list