您好我最近在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文件中,我不必定义它吗?
假设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)