具有链表C的递归映射函数



你好,我正在尝试制作一个映射函数,它接受一个链表,并接受每个整数并将其自身相乘,所以从当前列表中,我期望1、4、9、16、25。我已经做了平方函数,并将其分配给一个变量,并试图通过映射函数传递列表X和函数,我的错误是什么?

#include <stdio.h> /* printf */
#include<stdlib.h> /* free */
typedef struct node
{
int value;
struct node* next;
} node;
node SENTINEL = {0, 0};
node * make_node(int v, node * q)
{
node* p = (node*) malloc(sizeof(node));
p->value = v;
p->next = q;
return p;
}
int square(int x)
{   
return x * x;
}
int map(node* X, int x)
{
if (X == NULL)
{
printf("List is empty");
return 0;
}

while (X != &SENTINEL)
{
x = sf(X->value);
printf("%d,", x);
X = X->next;
}
}
int main(void)
{
int (*sf)(int);
node* X =   
make_node(1,
make_node(2,
make_node(3,
make_node(4,
make_node(5, &SENTINEL)
)
)
)
);
sf = square;
int x;
x = map(X);
free(X);

return 0;
}

您可能忽略了程序的某些部分—不必为函数map传递两个参数,而是声明一个局部变量。

并且您的函数指针声明CCD_ 2应该是out-side-main,以便您在map函数中访问。

int map(node* X)//, int x)
{
int x = 0;

if (X == NULL)
{
printf("List is empty");
return 0;
}

while (X != &SENTINEL)
{
x = sf(X->value);
printf("%d,", x);
X = X->next;
}
}

。。。并试图通过映射函数传递列表X和函数

您的函数定义为:

int map(node* X, int x)

因此函数是而不是期望函数指针。它期待着int

将功能更改为:

void map(node* X, int (*sf)(int))
{
int x;

并称之为:

map(X, square);

BTW:free(X)将只释放列表中的第一个元素。您需要释放循环中的每个元素。

BTW:在链表中使用sentinel并不常见。通常,最后一个元素的下一个指针只设置为NULL。

把它放在一起,可能是:

#include <stdio.h>
#include<stdlib.h>
typedef struct node
{
int value;
struct node* next;
} node;
node * add_front(int v, node * q)
{
node* p = malloc(sizeof *p);
p->value = v;
p->next = q;
return p;
}
int square(int x)
{   
return x * x;
}
void map(node* X, int (*sf)(int))
{
while (X != NULL)
{
printf("%d,", sf(X->value));
X = X->next;
}
}
int main(void)
{
node* X = NULL;
for (int i = 5; i > 0; --i)
{
X = add_front(i, X);
}
map(X, square);
while(X != NULL)
{
node* t = X;
X = X->next;
free(t);
}
return 0;
}

最新更新