四时宝库

程序员的知识宝库

C语言求单链表结点的阶乘和,基础编程由此开始(函数篇第六节)

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

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

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

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

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

梳理逻辑

我们在做编程题目的时候,首先要做的,就是分析题目需求,显然,这道题目的要求是实现一个函数,求单链表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)

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

代码实现

//求单链表结点的阶乘和
#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语言的一个基本语法要有一个了解,我正是因为对基本语法没有一个清晰的了解,才导致做这道题目的时候比较困难,需要在网上查阅相关资料,然后再来解决这道题目。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接