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

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

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

#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. Git的http与ssh配置

    http 进入git bash 直接clone所需项目 通过http方式 eg:git clone http://xxxxxxxxxx/bk_linux_inspect-master.git 会弹出提 ...

  2. Selenium2Library:Get Matching Xpath Count用法

    Name:Get Matching Xpath CountSource:Selenium2Library <test library>Arguments:[ xpath ]Returns ...

  3. 【程序员面试金典】面试题 01.03. URL化

    题目 URL化.编写一种方法,将字符串中的空格全部替换为%20.假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的"真实"长度.(注:用Java实现的话,请使用字符数组实现 ...

  4. 【Android】家庭记账本手机版开发报告四

    一.说在前面 昨天 对界面显示和逻辑结构进行完善 今天 1.添加菜单(查询.清除所有等) 2.使用滑动删除 问题 1.在做查询时获取SearchView时引 入包错误经过长时间的尝试后才修正 2.滑动 ...

  5. LARGE_INTEGER 64位的输出格式

    %016I64x 第一个016是指当最左边无数据时用00填充:后面的I64x是__int64的前缀要求格式十六进制输出.

  6. java课程之团队开发冲刺阶段2.3

    一.总结昨天进度 1.完成整合功能 二.遇到的问题 1.在整合的过程中,总是发现在switch开关提醒了两次,后来发现是因为我使用了setChecked方法,而这个方法触发onCheckedChang ...

  7. Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask

    多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的. ...

  8. HTML5中的行级标签和块级标签

    行级标签 1.行级标签又称为内联标签,行级标签不会单独占据一行,设置宽高无效. 2.行内内部可以容纳其他行内元素,但不可以容纳块元素.有span.strong.em.b.i.input.a.img.u ...

  9. UVM实战[二]

    本期将讲解UVM环境构成和启动方式.主要参考资料为 http://bbs.eetop.cn/thread-320165-1-1.html http://rockeric.com/ 环境构成 进行仿真验 ...

  10. 反编译查看printf()的方法

    源代码: package test2; public class ExplorationJDKSource { /** * @param args */ public static void main ...