C语言题目:链表数据求和操作
题目描述
读入10个复数,建立对应链表,然后求所有复数的和。
输入格式
无
输出格式
无
样例输入
1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 2 3 3 1 1
样例输出
23+23i
代码功能概述
-
createNode
函数:-
创建一个包含 10 个复数节点的链表。
-
每个节点存储复数的实部 (
real
) 和虚部 (image
)。
-
-
sumNode
函数:-
遍历链表,计算链表中所有复数的和。
-
释放链表中的节点内存,并输出最终的求和结果。
-
-
main
函数:-
调用
createNode
创建链表。 -
调用
sumNode
对链表中的复数进行求和。
-
代码解析
1. 头文件和结构体定义
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int real;
int image;
struct Node *next;
} Node;
-
#include <stdio.h>
:包含标准输入输出函数(如scanf
和printf
)。 -
#include <stdlib.h>
:包含内存管理函数(如malloc
和free
)。 -
typedef struct Node
:定义了一个链表节点结构体Node
,包含:-
real
:存储复数的实部。 -
image
:存储复数的虚部。 -
next
:指向下一个节点的指针。
-
2. 创建链表函数 (createNode
)
Node *createNode()
{
Node *head, *p, *q;
head = (Node*)malloc(sizeof(Node)); // 创建头节点
p = head;
for (int i = 0; i < 10; i++)
{
q = (Node*)malloc(sizeof(Node)); // 创建新节点
scanf("%d%d", &q->real, &q->image); // 输入实部和虚部
q->next = NULL; // 新节点的下一节点初始化为 NULL
p->next = q; // 将新节点链接到链表
p = q; // 移动指针到新节点
}
return head; // 返回链表头指针
}
-
head
:链表的头节点。 -
p
和q
:指针变量,用于遍历链表和创建新节点。 -
循环 10 次:创建 10 个复数节点,每次输入一个复数的实部和虚部。
-
链表链接:每个新节点的
next
指向新分配的节点,形成链表。
3. 链表求和函数 (sumNode
)
void sumNode(Node *head)
{
Node *newNode = (Node*)malloc(sizeof(Node));
Node *p = head->next; // 从第一个数据节点开始
Node *q;
newNode->real = 0; // 初始化求和的实部和虚部
newNode->image = 0;
newNode->next = NULL;
while (p != NULL) // 遍历链表
{
newNode->real += p->real; // 累加实部
newNode->image += p->image; // 累加虚部
q = p; // 保存当前节点指针
p = p->next; // 移动到下一个节点
free(q); // 释放当前节点内存
}
printf("%d+%di\n", newNode->real, newNode->image); // 输出求和结果
return newNode; // 返回求和节点指针(注意:返回类型不正确,应该是 void)
}
-
newNode
:用于存储求和结果的新节点。 -
p
:遍历链表的指针,从头节点的下一个节点开始。 -
while
循环:遍历链表中的每个节点,累加实部和虚部。 -
释放内存:每次遍历一个节点时,释放该节点的内存。
-
输出结果:以
实部+虚部i
的格式输出求和结果。
4. 主函数 (main
int main(void)
{
Node *head;
head = createNode(); // 创建链表
sumNode(head); // 求和并输出结果
return 0;
}
-
调用
createNode
创建链表。 -
调用
sumNode
对链表中的复数进行求和并输出结果。
注意事项
-
内存泄漏:
-
sumNode
函数中释放了链表中的所有节点,但没有释放头节点head
。 -
如果需要完整的内存管理,应在
sumNode
函数中添加对head
的释放。
-
-
sumNode
的返回值:-
函数声明的返回类型是
void
,但代码中返回了newNode
,这会导致编译错误。应移除或注释掉return newNode;
。
-
-
用户输入:
-
如果输入的复数个数少于 10 个,程序会崩溃。建议添加输入验证。
-
示例运行
假设输入以下 10 个复数:
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
输出将是:
100+110i
总结
这段代码实现了一个简单的链表复数求和功能,适合初学者学习链表的基本操作。
源代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int real;
int image;
struct Node *next;
}Node;
Node *createNode()
{
Node *head,*p,*q;
head = (Node*)malloc (sizeof(Node));
p = head;
for(int i = 0; i<10; i++)
{
q = (Node*)malloc(sizeof(Node));
scanf("%d%d",&q->real,&q->image);
q->next = NULL;
p->next = q;
p = q;
}
return head;
}
void sumNode(Node *head)
{
Node *newNode = (Node*)malloc(sizeof(Node));
Node *p = head->next;
Node *q;
newNode->real = 0;
newNode->image = 0;
newNode->next = NULL;
while (p != NULL)
{
newNode->real += p->real;
newNode->image += p->image;
q = p;
p = p->next;
free(q);
}
printf("%d+%di\n",newNode->real,newNode->image);
return newNode;
}
int main(void)
{
Node *head;
head = createNode();
sumNode(head);
return 0;
}