gpt4 book ai didi

c - 如何在函数中编写函数 (list_map)

转载 作者:太空狗 更新时间:2023-10-29 15:17:11 25 4
gpt4 key购买 nike

你好,我最近问了一些关于 C 中链表的问题。
The link was found here

首先,我要感谢大家帮助我解决这个问题。但是我有一个问题我无法理解。我什至问过教授,但他给我回了一封电子邮件,但信息很少。基本上我正在用 C 编写一个链表(见上面的链接)。教授在头文件中给我们的一件事是这样的:

void list_map( INTLIST *list, void (*f)(void *) );
/*Applies a function to each element of the list */

所以我给他发了邮件说:

Another question, in the header file you did not define a sorting function, do we need to write a sorting function with the prototype and finally what is list_map

他回答说:

You are asked to implement a sorting function f, which is called through list_map(list, f). Hope it clears your doubts.

我唯一的怀疑是这没有得到充分的教导。我可以理解如何对链表进行排序,实际上这是一些伪代码:

tmp=head;

while(tmp!=NULL)
{
tmp2=tmp->next; //pointer to next node
while(tmp2!=NULL)
{
if (tmp2->data < tmp->data)
{
int x = tmp2->data;
tmp2->data = tmp->data;
tmp2->data = x;
}
tmp2=tmp2->next;
}
tmp=tmp->next;
}

我知道专家们可能会说这不是最有效的,而且我知道现在我只是在学习并尝试让事情正常进行。我可以清理后记...等等我的问题。

我的问题是我有排序功能(在教授的例子中他称之为 f)。当签名为:

void list_map(INTLIST* list, void (*f) (void*));

我会说:

list_map(myList, f()); //apply function f to the current linked list

或者我真的需要在某处定义 list_map 吗?我不是典型的学生,只是在找人做我的工作。我真的在尽我所能去理解这一点。

谢谢大家。

[编辑部分]

我想补充一点 Kaleb P. 说的其中一张海报

"Thus, your job is to create a sorting function that you will pass in to list_map. Note that the correct syntax for passing it in will be:"

那么我的代码应该是这样的:

在 .h 文件中,我将函数原型(prototype)化为:

void myCustomSort(void*);

然后在 .cpp 中它变成:

void myCustomSort(void*f)
{
tmp=f->head;

while(tmp!=NULL)
{
tmp2=tmp->next; //pointer to next node
while(tmp2!=NULL)
{
if (tmp2->data < tmp->data)
{
int x = tmp2->data;
tmp2->data = tmp->data;
tmp2->data = x;
}
tmp2=tmp2->next;
}
tmp=tmp->next;
}
}

要在 main 中调用它,我会这样做:

list_map(myListPointer, &myCustomSort); 

但是我不需要在任何地方定义 list_map 吗?因为它在 .h 文件中,所以我不必定义它吗?

最佳答案

假设list_map是这样实现的,按顺序给f每个节点,

void list_map(INTLIST *list, void (*f)(void *)) {
INTLIST *node;
for (node = list; node; node = node->next)
f(node);
}

你可以实现一个selection sort

void list_sort(INTLIST *list) {
list_map(list, swap_head_with_smallest);
}

其中 void swap_head_with_smallest(void *) 将给定节点的数据与列表中它后面的任何节点的最小数据交换。


因为这是家庭作业,所以我尽量不泄露整个解决方案。

void swap_head_with_smallest(void *list) {
INTLIST *head = list;
INTLIST *smallest;

/* set smallest the smallest node of
head, head->tail, head->tail->tail, etc. */

/* swap head->datum and smallest->datum */
}

关于c - 如何在函数中编写函数 (list_map),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2119558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com