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

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

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

#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. OpenCV学习日志:计算机视觉资源汇总

    1.1 重要会议 (1)机器视觉重要会议 CVPR:Conferenceon Computer Vision and Pattern Recognition, IEEE, 五星 ICCV:Intern ...

  2. PHP基础(9.27 第十三天)

    什么是PHP,为什么要学习PHP:  (1)php是嵌入html页面中的脚本语言   (2)目前最流行的网站开发语言  (3)在几乎所有平台中都可以运行  (4)很多企业都在使用PHP作为开发语言 P ...

  3. Egret Engine 2D - 显示对象

        alpha:透明度 width:宽度 height:高度 rotation:旋转角度 scaleX:横向缩放 scaleY:纵向缩放 skewX:横向斜切 skewY:纵向斜切 visible ...

  4. UVA_11525 树状数组的活用 二分

    我们知道1——k有K!种排列,现在给定k和n,要你按字典序输出 第n种排列的数列 而且题目给的 n是 n=S1(k-1)!+S2(k-2)!+...+Sk-1*1!+Sk*0!(0=<Si< ...

  5. 实验吧Web-中-让我进去(Hash长度扩展攻击、加盐密码及Linux下hashpump的安装使用)

    打开网页,测试开始,注入费老大劲,看了大佬的blog才知道怎么干. bp抓包,观察发现cookie中有个source=0,在repeater中修改为source=1,然go一下,出来了一段源代码. $ ...

  6. GTK入门

    环境准备 官网下载 GTK 源码包,因为本机 GLib 版本不够,下载一个非最新版的 GTK3.8.0 先学习用 直接阅读 "/gtk+-3.8.0/docs/reference/gtk/h ...

  7. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  8. JavaWeb之搭建自己的MVC框架(二)

    1. 前言 在 JavaWeb之搭建自己的MVC框架(一) 中我们完成了URL到JAVA后台方法的最基本跳转.但是实际操作中会发现有一个不方便的地方,现在在com.mvc.controller包中只有 ...

  9. lambda的题

    def num(): return [lambda x: i*x for i in range(4)] print([m(2) for m in num()]) 这个式子,lambda相当于闭包函数, ...

  10. Aras Innovator如何配置SMTP中转Office365

    参考文档:http://www.ebdadvisors.com/blog/2015/7/31/configure-an-smtp-server-in-windows-iis-for-aras-inno ...