今天这道题目呢,对我个人来说,可能是难度比较大的一道题目。

因为C语言的许多语法我还没有提及,还有数据结构部分我也没有复习到,所以做这道题目的时候,一开始我有些无从下手的。

不过后来仔细地分析了这道题目后,我感觉难度其实也还行。

毕竟阶乘和是自己接触过的算法,也知道怎么写。

无非就是单链表结点存储数据的格式该如何写,那么就根据裁判测试程序样例来写即可。

c语言计算3阶行列式(C语言求单链表结点的阶乘和)(1)

梳理逻辑

我们在做编程题目的时候,首先要做的,就是分析题目需求,显然,这道题目的要求是实现一个函数,求单链表L结点的阶乘和。

1、我们之前学过,阶乘就是n!=1x2x3x...xn,0的阶乘是1。

一般是用到一个for循环来写该阶乘。

for(int i = 1;i<= n;i ){ n = i*n;//n的阶乘 }

2、而至于对该阶乘求和,则是定义一个变量sum。

sum=sum n!,同理也要放在for循环当中的。

sum = sum n;//阶乘求和

但显然,这道题目的关键难度并不在于对阶乘求和,因为这个是基础部分的内容了。

关键难度在于如何根据单链表来进行阶乘求和。

3、关于题目中给出的单链表结构体,我们就不细致展开了,题目中也给了就是存储结点数据的Data,和指向下一个结点的指针Next。

因为题目给出的是结构体,我们得来谈一谈一个符号,那就是箭头“->”符号的意思。

它叫做结构体成员运算符,就是使用一个指向结构体或对象的指针访问其内部成员。

通俗点来讲,以这道题目为例:L->Data,就是指向其中的内部元素Data数量。

那么很明确,这道题目的for循环就需要以这个Data为边界点。

就可以写为:

for(int i = 1;i<=L->Data;i ){ n = i*n;//n的阶乘 }

那么在当前结点的数据处理完之后,就要转移到下一个结点,来处理下一个结点的数据。

则需要用到L->Next来表示了。

L = L -> Next;

最后返回sum的值即可。

注意:在完成上面这些事情的前提是L不为空,所以要加一个while循环语句:

while(L!=NULL)

我们来梳理一下这整道编程题目的逻辑关系。

c语言计算3阶行列式(C语言求单链表结点的阶乘和)(2)

代码实现

//求单链表结点的阶乘和 #include <stdio.h> #include <stdlib.h> typedef struct Node *PtrToNode; struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ int FactorialSum( List L ); int main() { int N, i; List L, p; scanf("%d", &N); L = NULL; for ( i=0; i<N; i ) { p = (List)malloc(sizeof(struct Node)); scanf("%d", &p->Data); p->Next = L; L = p; } printf("%d\n", FactorialSum(L)); return 0; } int FactorialSum( List L ){ int sum = 0; int n = 1;//n的阶乘是从1开始的 while(L!=NULL){ for(int i = 1;i<=L->Data;i ){ n = i*n;//n的阶乘 } sum = sum n;//求和 n = 1;//为下一个结点做准备,重新赋值为1 L = L -> Next;//指向下一个结点 } return sum; }

结果测试

c语言计算3阶行列式(C语言求单链表结点的阶乘和)(3)

c语言计算3阶行列式(C语言求单链表结点的阶乘和)(4)

总结

总的来说,这道题目关键还是对C语言的一个基本语法要有一个了解,我正是因为对基本语法没有一个清晰的了解,才导致做这道题目的时候比较困难,需要在网上查阅相关资料,然后再来解决这道题目。

,