已知单链表的结点结构定义如下: typedef struct _NODE_ { int data; struct _NODE_ *next; } NODE; 说明:data 为数据域。next 为指针域,指示后继结点。 请编写函数,求带附加头结点的单链表全部数据元素的总和。 函数原型 int Sum(NODE *head); 说明:参数 head 为单链表的头指针。函数值为单链表全部数据元素的总和。 裁判程序 int main() { NODE *h; Create(&h); Input(h); printf("%d\n", Sum(h)); Destroy(&h); return 0; } 说明:Create 函数用于创建链表,Destroy 函数用于销毁链表。Input 函数用于输入链表:首先输入结点数,然后输入这些数据元素。
时间: 2024-02-22 17:00:57 浏览: 96
WM_COPYDATA.zip_CopyData_wm_copy
好的,根据题目要求,我们需要编写一个函数 `Sum`,用于求带附加头结点的单链表全部数据元素的总和。同时,我们还需要编写 `Create`、`Input` 和 `Destroy` 函数,用于创建链表、输入链表和销毁链表。
下面是具体的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct _NODE_ {
int data;
struct _NODE_ *next;
} NODE;
// 创建链表
void Create(NODE **head)
{
int n, i;
NODE *p;
*head = (NODE *) malloc(sizeof(NODE)); // 创建头结点
(*head)->next = NULL;
p = *head;
printf("请输入链表的长度:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
NODE *new_node = (NODE *) malloc(sizeof(NODE)); // 创建新结点
printf("请输入第 %d 个结点的值:", i + 1);
scanf("%d", &(new_node->data));
new_node->next = NULL;
p->next = new_node; // 将新结点插入到链表尾部
p = new_node;
}
}
// 输入链表
void Input(NODE *head)
{
NODE *p = head->next;
printf("链表的元素为:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 销毁链表
void Destroy(NODE **head)
{
NODE *p = *head, *q;
while (p != NULL)
{
q = p->next;
free(p);
p = q;
}
*head = NULL;
}
// 求单链表全部数据元素的总和
int Sum(NODE *head)
{
int sum = 0;
NODE *p = head->next; // 跳过头结点,从第一个结点开始遍历
while (p != NULL)
{
sum += p->data; // 将当前结点的元素值加到计数器中
p = p->next; // 指针后移,继续遍历下一个结点
}
return sum;
}
// 主函数
int main()
{
NODE *h;
Create(&h);
Input(h);
printf("单链表数据元素的总和为:%d\n", Sum(h));
Destroy(&h);
return 0;
}
```
需要注意的是,在 `Sum` 函数中,我们使用了带附加头结点的单链表的头指针作为参数,因此在遍历单链表时,需要先将指针 p 指向第一个结点,也就是 p = head->next。同时,在将当前结点的元素值加到计数器中时,可以根据具体的数据类型进行修改。
阅读全文