如何在函数内编写函数(list_map)

oJM*_*86o 4 c linked-list

您好我最近在C中的链接列表上询问了一些问题.链接在
这里找到

首先,我要感谢大家帮助我.但我有一个我无法理解的问题.我甚至问过教授,但他给我发了回信,但没有提供足够的信息.基本上我在C中写一个链表(见上面的链接).教授在头文件中给我们的一点是:

void list_map( INTLIST *list, void (*f)(void *) );
/*Applies a function to each element of the list */
Run Code Online (Sandbox Code Playgroud)

所以我给他发了电子邮件,并说:

另一个问题,在头文件中你没有定义一个排序函数,我们是否需要用原型编写一个排序函数,最后是什么是list_map

他回答说:

您被要求实现一个排序函数f,它通过list_map(list,f)调用.希望它能清除你的疑虑.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我知道专家们可能会说这不是最有效的,我知道现在我只是在学习并试图让事情发挥作用.我可以清理后来......等我的问题.

我的问题是我有排序功能(在教授的情况下,他称之为f).当签名为:时,如何调用此排序函数:

void list_map(INTLIST* list, void (*f) (void*));
Run Code Online (Sandbox Code Playgroud)

我只想说:

list_map(myList, f()); //apply function f to the current linked list
Run Code Online (Sandbox Code Playgroud)

或者我真的需要在某处定义list_map吗?我不是那种寻找某人工作的典型学生.我真的想尽力理解这一点.

感谢大家.

[编辑部分]

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

"因此,你的工作是创建一个你将传递给list_map的排序函数.请注意,传递它的正确语法将是:"

我的代码应该只是这样:

在.h文件中我将函数原型化为:

void myCustomSort(void*);
Run Code Online (Sandbox Code Playgroud)

然后在.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; 
} 
}
Run Code Online (Sandbox Code Playgroud)

而在主要调用它我会做:

list_map(myListPointer, &myCustomSort); 
Run Code Online (Sandbox Code Playgroud)

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

eph*_*ent 6

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

void list_map(INTLIST *list, void (*f)(void *)) {
    INTLIST *node;
    for (node = list; node; node = node->next)
        f(node);
}
Run Code Online (Sandbox Code Playgroud)

您可以实现选择排序

void list_sort(INTLIST *list) {
    list_map(list, swap_head_with_smallest);
}
Run Code Online (Sandbox Code Playgroud)

其中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 */
}
Run Code Online (Sandbox Code Playgroud)

  • @Max:如果没有至少一个令人困惑(或可能混淆)的教授,这不是一个合适的CS程序.如果他是部门主席,奖励积分. (2认同)