【问题标题】:Recursive map function with linked list C [closed]带有链表C的递归映射函数[关闭]
【发布时间】:2021-02-27 18:01:48
【问题描述】:

您好,我正在尝试制作一个映射函数,它接受一个链表并接受每个整数并将其相乘,所以从当前列表中我期望 1、4、9、16、25。我已经制作了平方函数和将它分配给一个变量并尝试通过 map 函数传递列表 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 中的x 参数有什么意义?将指针传递给square 函数会更有意义。 (另外,你没有在那里传递参数,所以我看不到它是如何编译的)
  • sf,在map中使用,这里没有声明。
  • dint 你得到这个x = map(X); 的任何编译错误,正如定义所说的int map(node* X, int x)
  • 你的编译器应该是complaining a lot关于这段代码。为什么不仔细阅读错误并修复它们?我认为这应该被关闭,因为它需要更多的关注而不是“它不起作用”。
  • 为变量命名 Xx 对您来说可能很清楚,但对于世界其他人来说却不是。

标签: c recursion linked-list


【解决方案1】:

...并尝试通过map函数传递列表X和函数

你的函数定义为:

int map(node* X, int x)

所以函数需要一个函数指针。它期待一个int

将函数改为:

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

然后这样称呼它:

map(X, square);

顺便说一句:free(X) 只会释放列表中的第一个元素。您需要在循环中释放每个元素。

顺便说一句:在链表中使用哨兵并不常见。通常,最后一个元素的 next-pointer 只是设置为 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;
}

【讨论】:

    【解决方案2】:

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

    并且您的函数指针声明 int (*sf)(int); 应该在 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-13
      • 2019-08-13
      • 2014-12-27
      • 1970-01-01
      • 2013-01-18
      • 2023-04-05
      • 2020-04-06
      • 2021-06-24
      相关资源
      最近更新 更多