设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
————————————————————分割线————————————————————
1.本回答详细解答了对于本代码或者所涉及的链表有可能会出现的一些疑问,是十分友好的回答与代码。
2.本代码易理解、可读性高,不会破坏初始读入的链表并可高效通过所有case。而且似乎是能在网上找到的,该题以链表实现的最简单、最易读的代码(共152行)。
3.本代码的Attach函数非常有趣,是本代码的核心,理解了Attach就OK了。
感谢大家点开我的博客,谢谢大家;在下水平一般,有发现错漏的,敬请在评论区斧正;
目录
链表结构与头文件与定义:
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
typedef struct Node *LinkList;
struct Node
{
ElementType coef; //系数
ElementType expo; //指数
struct Node *next;
} Node;
Node是结点。
LinkList是链表,是指向结点的指针。
LinkList* 是指向链表的指针,是指向结点的指针的指针。
自定义函数:
有同学可能会发现,为什么有一些函数的传链表参数使用的是 LinkList 而有一些使用的是 LinkList* 。
链表在函数要修改传入指针所指向的地址,而不是指针所指的变量的值时,(一开始不指向头结点)用二级指针LinkList*,如Attach函数。传入指针一直指向头结点不变,用一级指针LinkList,如其它三个函数。
基于该函数需要对链表实现的功能不同,所采取的参数就不同。如果传参时指针A(传值),那么在该函数的独立空间中对该指针A的修改,从该函数返回时会被无效化(因为修改的是链表的复制体);而如果我们传入的是二级指针(即指向指针A的指针,传地址),则从函数返回时对指针A的修改将得以保存(因为修改A本身)。
这可以参考向函数中传变量和向函数中传入变量的指针来理解。
LinkList ReadLinkList();
void Attach(ElementType coef, ElementType expo, Li