c语言之求单链表结点的阶乘和(含解读)

hello,本期我将会具体介绍求单链表结点的阶乘和的解法,先看题目:

前言:由于题目使用了typedef重定义类型,容易绕晕,可以直接看我的代码,我为了简化逻辑,没有使用typedef重定义结构体指针类型

所以只需要记住 1.题目是求单链表L结点的阶乘和,2.直接看我的代码

本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。


补充:一个结点包括用户所需要的数据和上一个或下一个结点的地址


函数接口定义:

int FactorialSum( List L );

其中单链表List的定义如下:

typedef struct Node *PtrToNode;
struct Node {
    int Data; /* 存储结点数据 */
    PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

裁判测试程序样例:

#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;
}

/* 你的代码将被嵌在这里 */

输入样例:

3
5 3 6

输出样例:

846

大致解题思路:

1.将要存储的数据存入由malloc 动态申请的空间中 并构成链表结构

2.使用FactorialSum求出存入数据的阶乘和

a.分别求出各个数据的阶乘

b.累加

我的代码:

struct Node
{
	int Data;
	struct Node *next;

};

part 1

1.首先定义结构体类型 (相当于一个结点 因为一个结点由数据和下一个结点的地址组成)它的成员包括:

Data (用于存储我们输入的数据 即所求阶乘的数字)

struct Node *next:用于存储下一个结点的地址

part2

int main()
{
	int num = 0;
	scanf("%d", &num);
	int i = 0;
	struct Node* head = NULL;
	struct Node* L = NULL;

	for (i = 0; i < num; i++)
	{
		head = (struct Node*)malloc(sizeof(struct Node));
		scanf("%d", &head->Data);
		head->next = L;
		L = head;
	}
	int ret = FactorialSum(L);
	printf("%d", ret);
		

	return 0;
}

1.num是我们确定存入的数据个数

2.for循环完成将num个数据存入由malloc动态申请的空间中去

malloc前言:

malloc在堆区上动态申请内存空间,malloc申请成功后会返回这个空间的首地址,由于malloc并不知道我们申请的空间用来存放什么类型的数据,故而它会返回void*的指针,而当我们确定要存储数据的类型后就可以将void*强制转化为对应的类型

在for循环内部:

我们用malloc动态申请空间 并将其返回类型void*强制转换为struct Node*类型:表明我们申请开辟了一个结构体类型的空间,然后用我们定义的头指针head(类型为struct Node*)来接收这个结构体空间的地址,这一行代码如下:

head = (struct Node*)malloc(sizeof(struct Node))

然后将要求其阶乘的数字存入这个结构体成员Data内 代码如下:

scanf("%d", &head->Data)

然后在结构体的成员next内 存入下一个结构体的地址  这时候需要定义一个struct Node*类型的L ,用来成为head的临时副本进行偏移遍历操作,(不能直接使用head进行后面的偏移遍历操作,若是直接使用,那将直接改变head指针指向的位置,导致无法找到malloc动态申请的空间。)将其存入结构体成员next内部,然后将头指针head赋给L,代码如下:

head->next = L;
        L = head;

part3

int FactorialSum(struct Node*L)
{
	int sum = 0;
	int i = 0;
	while (L != NULL)
	{
		int t = 1;
		for (i = 1; i <= L->Data; i++)
		{
			t *= i;
		}
		sum += t;
		L = L->next;
	}
	return sum;
}

函数部分:

1.函数将完成计算存入的数字的阶乘和的动作,while循环遍历整个链表,以struct Node* 类型的指针L来进行偏移,从而达成对整个链表的遍历

2.while循环内部的遍历:

for循环用来完成一个结点的所存的一个数据的阶乘计算

然后加在sum里面,然后偏移指针L ,找到下一个结点

本期完!

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值