你好,我试图制作一个程序,该程序使用递归来获取整数的链表并对整数的平方求和。到目前为止,我已经尝试过了,但是我无法使平方求和的功能起作用。我不知道使用 pow() 是否是最好的方法?
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include<math.h>
typedef struct node
{
int value;
struct node* next;
} node;
/* terminal node at the end of the list */
node SENTINEL = {0, 0};
/* utility functions to create and free lists */
node * make_node(int v, node * q)
{
node* p = (node*) malloc(sizeof(node));
p->value = v;
p->next = q;
return p;
}
int sum_squares(node* list)
{
if(list == 0)
return 0;
else
{
return(pow(&list, 2) + sum_squares(list));
}
}
void free_node(node* p)
{
if(p == &SENTINEL)
return;
else
{
free_node(p->next);
free(p);
}
}
int main(void)
{
int sum;
node* list =
make_node(1,
make_node(2,
make_node(3,
make_node(4,
make_node(5, &SENTINEL)
)
)
)
);
sum = sum_squares(list);
printf("The sum of squares is: %dn",sum);
free_node(list);
return 0;
}
它应该等于当前数字的 55
您应该编辑一些内容!
- 在
sum_squares
函数中,基本情况检查当前节点list
是否等于 0,但您应该检查它是否是哨兵节点。 - 在递归情况下,您应该使用
pow(&list, 2)
。 但是,&list
返回参数list
的地址。您要查找的是节点结构中保存的整数值,您可以使用->
运算符获得该值。&list
变得list->value
. - 最后,当你递归调用下一个函数时,你向它传递同一个节点。这将导致它在同一节点上无限调用自身,并且永远不会实际遍历列表。与其再次传递
list
,不如通过list->next
!
更改应用如下:
int sum_squares(node* list)
{
if (list == &SENTINEL)
return 0;
return (pow(list->value, 2) + sum_squares(list->next));
}