一元多项式的相加类似于两条链表的合并

当然前提是链表中的幂指数是按顺序排列的

此题中的链表采用的是升序排列,输出也是按升序输出的

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define ok 1
#define error 0
typedef int Status;
typedef struct{
int x;
int z;
}ElemType;
typedef struct PNode{
ElemType data;
struct PNode *next;
}PNode;
typedef struct{
PNode *head;
}Pmial;//由结点组成的链表,只需要一个带头结点的指针
Status InitP(Pmial *P)
{
P->head=(PNode *)malloc(sizeof(PNode));
if(P->head==NULL)
return error;
P->head->next=NULL;
return ok;
}
Status input(Pmial *P)
{
int x,z;
PNode *newnode,*rear=P->head;
while(scanf("%d%d",&x,&z)!=EOF)
{
if(x==-&&z==-)
break;
newnode=(PNode *)malloc(sizeof(PNode));
newnode->data.x=x;
newnode->data.z=z;
newnode->next=rear->next;
rear->next=newnode;
rear=newnode;
}
return ok;
}
/*Status destroy(Pmial *P)
{
PNode *p=P->head->next;
while(p)
{
P->head->next=p->next;
free(p);
p=P->head->next;
}
free(P->head);
P->head=NULL;
}*/
Status add(Pmial P1,Pmial P2,Pmial *P3)
{
PNode *p1=P1.head->next,*p2=P2.head->next;
PNode *newnode,*rear=P3->head;
ElemType e;
while(p1||p2)//当两者有一个不为空时 //当两者全为空结束
{
if((!p2)||(p1&&p2->data.z<p1->data.z)){//p2为空节点取p1
e=p1->data;//或者p1不为空&&p2的指数小于p1的指数
p1=p1->next;
}
else if((!p1)||(p2&&p1->data.z<p2->data.z)){//p1为空节点取p2
e=p2->data;//或者p2不为空&&p1的指数小于p2的指数
p2=p2->next;
}
else{//两者指数相等
e.x=p1->data.x+p2->data.x;
e.z=p1->data.z;
p1=p1->next;
p2=p2->next;
if(e.x==)
continue;
}
newnode=(PNode *)malloc(sizeof(PNode));
newnode->data=e;
newnode->next=rear->next;
rear->next=newnode;
rear=newnode;
}
}
Status Mutiply(Pmial P1,Pmial P2,Pmial *P3)
{
PNode *p1=P1.head->next,*p2=P2.head->next;
Pmial pmutil,psum;//临时多项式用来记录中间项
PNode *rear,*newnode;
ElemType e;
while(p1){//依次取出P1的节点依次与P2节点相乘
p2=P2.head->next;
InitP(&pmutil);//pmutil用来存放每次p1依次与p2相乘的乘积项
rear=pmutil.head;
while(p2){
e.x=p1->data.x*p2->data.x;
e.z=p1->data.z+p2->data.z;
newnode=(PNode *)malloc(sizeof(PNode));
newnode->data=e;
newnode->next=rear->next;
rear->next=newnode;
rear=newnode;
p2=p2->next;
}
InitP(&psum);//pum用来存放每乘一次就得相加的pmutil
psum.head->next=P3->head->next;
P3->head->next=NULL;
add(pmutil,psum,P3);//实现每一次的pmutil与前一次相加
p1=p1->next;
}
return ok;
}
Status output(Pmial P)
{
PNode *p=P.head->next;
if(p==NULL)
printf("");
while(p)
{
if(p->data.x)
printf("%d %d ",p->data.x,p->data.z);
p=p->next;
}
printf("\n");
}
int main()
{
Pmial P1,P2,Psum,Pmutil;
InitP(&P1);
InitP(&P2);
InitP(&Psum);
InitP(&Pmutil);
input(&P1);
input(&P2);
Mutiply(P1,P2,&Pmutil);
output(Pmutil);
}

关于使用静态链表实现一元多项式的相加&&乘积的更多相关文章

  1. 单链表之一元多项式求和C++实现

    单链表之一元多项式求和 一元多项式求和单链表实现伪代码 1.工作指针 pre.p.qre.q 初始化2.while(p 存在且 q 存在)执行下列三种情况之一: 2.1.若 p->exp < ...

  2. PHP数据结构之四 一元多项式的相加PHP单链实现

    <?php /** *一元多项式的表示和相加 *一元多项式的表示采用单链表的形式 **/ header("content-type:text/html;charset=gb2312&q ...

  3. 关于leetcode中链表中两数据相加的程序说明

    * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ ...

  4. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  5. 静态链表 C语言描述

    静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...

  6. 03静态链表_StaticLinkList--(线性表)

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  7. java与数据结构(2)---java实现静态链表

    结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...

  8. 静态链表实现 (A-B)U(B-A)

    图中黄色部分为(A-B)U(B-A)的实际意义,用结构数组做静态链表来实现该表达式 大致流程是先建立A链表,接着将挨个输入的B中元素在A链表中遍历.如果没找到,就加到A链表结尾下标为endpointe ...

  9. C链表之创建简单静态链表

    C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...

随机推荐

  1. 洛谷 P1470 最长前缀 Longest Prefix

    题目传送门 解题思路: 其实思路没那么难,就是题面不好理解,解释一下题面吧. 就是在下面的字符串中找一个子串,使其以某种方式被分解后,每部分都是上面所给集合中的元素. AC代码: #include&l ...

  2. vue插件汇总

    浏览了一下,确实不错,另补充以下几个插件(欢迎大家将自己使用的插件留言给我,共同进步): vue-orgchart  可编辑,可导出 JSON 的树形组织图 的VUE组件 viewerjs  强大的图 ...

  3. JS - 局部方法改变全局变量的值

    var a = "" function aa() {  a="卡卡" } aa()    // 注意,aa() 一定要执行,局部赋值全局变量才会有作用 aler ...

  4. 【LeetCode】克隆图

    [问题]给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). 解释: 节点 的值是 ,它有两个邻居:节点 和 ...

  5. cf 507E. Breaking Good

    因为要求是在保证最短路的情况下花费是最小的,所以(先保证最短路设为S吧) 那么花费就是最短路上的新建边条数A+剩余拆掉边的条数B,而且总的原有好的边是一定的,所以,只要使得A尽量小,那么B就大,所以要 ...

  6. Thread.currentThread()和this的区别

    1. Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用. 2. ...

  7. ucosiii 学习笔记

    OSTaskCreate 的参数中有一个 void *p_ext,这个参数用来传递额外的信息,可以用来传递数组,结构体等等. AppTaskStart --> CPU_Init --> C ...

  8. mybatis+maven+父子多模块进行crud以及动态条件查询

    使用IDEA创建maven项目,File→New→Project→maven→Next→填写GroupId(例:com.zyl)和ArtifactId(mybatis-demo-parent)→Nex ...

  9. pytorch学习问题汇总

    问题六: 问题五:这里是怎么得到的? 问题四:为什么会是如下结果? torch.bernoulli(a)怎么是这个结果? 问题1:torch各个类型数据格式如何转换?数据类型在官方文档torch.Te ...

  10. CodeForces - 686D 【树的重心】

    传送门:http://codeforces.com/problemset/problem/686/D 题意:给你n个节点,其中1为根, 第二行给你2~n的节点的父亲节点编号. 然后是q个询问,求询问的 ...