【发布时间】:2021-12-31 00:26:41
【问题描述】:
目前我正在研究一个删除我选择的列表元素的最后出现次数的函数。我通过实现一个删除最后一个列表元素的函数,我想知道如何编写我的最后一个函数。
删除最后一次出现的特定元素的功能:
void DeleteLastOccurence(int x, List *l)
{
List *p = l;
List *m = NULL;
while(*p != NULL)
{
if((**p).number == x)
{
m = p;
}
p = &(**p).next;
}
if(m != NULL)
{
depile(m);
}
}
我的列表结构:
typedef struct Block
{
int number;
struct Block *next;
} Block;
typedef Block *List;
depile 子函数,删除参数中列表的第一个元素:
void depile(List *L)
{
List tmp = *L ;
*L = Lnext(*L) ;
free(tmp) ;
}
和 Lnext 子函数,返回一个新的 List 对应于一个 in 参数没有它的第一个元素:
Liste Lnext(List l)
{
return l->next;
}
我用列表 [2;1;1;2;4;4;4;4] 和 x = 2 测试我当前的功能,我得到 [2;1;1;4;4;4; 4]。
我的终端屏幕:
我想我需要添加一个整数 k 来删除元素的最后 k 个匹配项。
在我的最后一个函数中,使用相同的列表,x = 4 和 k = 3,我应该得到列表 [2;1;1;2;4]。
所以我想知道我是否可以稍微修改一下这个函数以获得最终版本?
例如,之前我实现了一个删除第一次出现的列表元素的功能:
void DeleteFirstOccurence(int x, Liste *l)
{
if(isEmpty(*l))
{
return;
}
else
{
if(x == firstElement(*l))
{
depile(l);
}
else
{
DeleteFirstOccurence(x, &(*l)->suivant);
}
}
}
带有 FirstElement 和 isEmpty 子函数:
int FirstElement(List l)
{
return l->number ;
}
bool isEmpty(List l)
{
return l == NULL ;
}
通过使用它,我能够实现消除前 k 次出现的功能:
void DeleteKfirstsOccurrences(int x, int k, List *l)
{
if(isEmpty(*l))
{
return;
}
else
{
for(int i = 0; i < k; ++i)
{
if(x == FirstElement(*l))
{
depile(l);
}
else
{
DeleteFirstOccurence(x, &(*l)->next);
}
}
}
}
x = 0 和列表 [4;2;0] 的 DeleteFirstOccurence 和 x = 5、k = 5 和列表 = 2 1 1 2 4 4 4 4 的 DeleteKFirstsOccurences:
如果有可能对我的第一个函数执行类似的过程以获得所需的结果,知道结构不一样并且我个人没有成功。
P.S : 在我的不同函数中,如果 k > x 在列表中的出现次数,则删除所有出现。
感谢您的宝贵时间和不同的建议,
真诚的。
(对不起我的英语水平,我通常不会写这么多)
【问题讨论】:
-
我喜欢
depile,但它可能更符合pop的习惯。
标签: c list algorithm recursion iteration