今天是第二天,今天遇到一个题:本题要求实现一个函数,求单链表L
结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int
范围内。
首先考虑这个题目本身不难,鉴于本人刚学习数据结构,题目中已给代码的单链表的创建值得我考虑。题目中给的是头插法代码如下:分析一下这段代码
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; }
首先是建立一个空单链表,接着输入N个数作为单链表的长度。for循环里面,创建一个p空间,输入数据,将L赋给P的Next域,接着L的地址替换为输入的P,完成单链表第一个元素的建立,第二个是同理,将新建立的结构体P的Next域付给L (使P指向上一个L),这时将P付给L,L->next也指向了上一个L;之后以此类推完成N个元素的单链表创建。该方法就是头插法建立单链表。
既然都说到这了,那也来看看我做的题。代码如下:
1 int FactorialSum(List L){ 2 int sum=0; 3 int mul=1; 4 int i; 5 while(L != NULL){ 6 for(i=1;i<= L->Data;i++) 7 { 8 mul *= i; 9 } 10 sum+=mul; 11 mul=1; 12 L=L->Next; 13 } 14 return sum; 15 }
逐次访问单链表L,直至单链表为空。for循环将1到L->的值依次相乘,完成阶乘操作。执行完一次L,将mul加给sum, 同时也是关键的地方每次循环将mul置1.
最后便是返回sum。满分。
明日将奉上尾插法实现单链表。