原题链接:蓝桥杯算法提高VIP-复数求和
解题思路:
题目是想求链表中复数之和,那么我们可以从链表入手,我的思路是:将第二个节点就当作是最后要求和的节点,把第二个节点之后的所有节点的数据都加在这个节点上,最后是输出headNode -> next(即第二个节点)。
自定义函数实现功能模块化
1、创捷链表createList
2、创建节点createNode
3、插入节点insertNodeByHead(这里用的是头插入)
4、复数求和
5、链表打印printList
参考代码:
#include <stdio.h>
#include <stdlib.h>
struct Number{
int real; //realPart,实部
int imagin; //imerginaryPart,虚部
};
struct Node{
struct Number data; //数据域
struct Node* next; //指针域
};
//创建链表
struct Node* createList()
{
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); //动态申请内存
headNode -> next = NULL;
return headNode;
}
//创建节点
struct Node* createNode(struct Number data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); //动态申请内存
newNode -> data = data;
newNode -> next = NULL;
return newNode;
}
//插入节点
void insertNodeByHead(struct Node* headNode, struct Number data) //头插法:每次插入节点都是插入在headNode和headNode->next之间
{
struct Node* newNode = createNode(data); //调用创建节点函数
newNode -> next = headNode -> next ; //新节点指向的下一个是原头节点的下一个
headNode -> next = newNode; //头节点指向的下一个节点是新节点
}
//复数求和(我的思路是:直接将第二个节点后面所有节点的数据都加在第二个节点的数据里,最后只打印第二个节点的数据)
void calculataList(struct Node* headNode, struct Number data)
{
struct Node* pMove = headNode -> next -> next; //pMove用于遍历第二个节点后面的所哟节点
while(pMove != NULL)
{
struct Node* taotal = headNode -> next; //total指向headNode -> next, 即第二个节点
taotal -> data.real += pMove -> data.real; //第二个节点后面的所有的节点的实部数据都加在total -> data.real里
taotal -> data.imagin += pMove -> data.imagin; //第二个节点后面的所有的节点的虚部数据都加在total -> data.imagin里
pMove = pMove -> next; //每一个节点的实部和虚部数据加完后,pMove不断后移,直到pMove == NULL循环停止
}
}
//链表打印
void printList(struct Node* headNode, struct Number data)
{
struct Node* taotal = headNode -> next;
printf("%d+%di\n", taotal -> data.real, taotal -> data.imagin); //这里只打印链表中的第二个节点里面的数据,因为所有节点的数据都加在这个节点上了
}
int main()
{
struct Number num; //临时存放读入的数据
struct Node* list = createList(); //调用创建链表函数
int n = 0;
scanf("%d", &n);
for(int i = 0; i < n; i ++) //读取数据
{
scanf("%d %d", &num.real, &num.imagin);
insertNodeByHead(list, num); //调用插入节点函数,每读入一个复数,就要将这个复数存储在节点中,并插入链表
}
calculataList(list, num); //调用复数求和函数
printList(list, num); //调用链表打印函数,并检验
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复