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 ,找到下一个结点
本期完!