题解 | #牛牛的单链表求和#
牛牛的单链表求和
https://www.nowcoder.com/practice/a674715b6b3845aca0d5009bc27380b5
#include <stdio.h>
#include <stdlib.h>
typedef struct node{ //定义类型:单链表节点
int data;
struct node *next;
}node;
node *createnode() //创建头节点,不需要传参数,创建完之后返回头节点指针
{
node *head = malloc(sizeof(node)); //动态分配头节点内存
if (head == NULL) { //判断是否分配成功
printf("out of memory");
exit(1);
}
head->next = NULL; //把头节点的指针域置为NULL
return head; //创建完成返回头节点指针
}
node *add_node(node *head, int data) //增加节点,需要穿入参数头指针,插入节点的数据元素,返回头指针
{
node *newnode = malloc(sizeof(node)); //给新节点动态分配内存
if (newnode == NULL) { //判断是否分配成功
printf("out of memory");
exit(1);
}
newnode->data = data; //给新节点数据域赋值
newnode->next = head->next; //进行插入操作,使用的是头插法,头节点的指针域所指向的元素赋值给新节点的指针域,新节点等于头指针的指针域所指向的元素
head->next = newnode;
return head;
}
int sumnode(node *head) //链表中元素求和,穿入参数头指针,返回值为元素总和
{
int sum = 0;
node *p = head->next; //因为头节点不储存元素,p指向第一个节点(带数据元素)
while (p != NULL) { //如果p指向NULL了说明单链表到达尾部,以遍历结束
sum = sum + p->data;
p = p->next;
}
return sum;
}
int main() {
int n;
scanf("%d", &n);
int arr[n];//要输入n个元素到数组,所以要先声明一个数组
node *head = createnode(); //创建头节点返回头节点指针
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]); //标准输入每个数到数组中去
add_node(head, arr[i]); //添加每个数组元素到链表中,调用添加节点函数,先创建节点然后赋值
}
int sum = sumnode(head); //调用求链表节点元素之和,返回求和总数
printf("%d\n", sum);
return 0;
}

