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

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

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

#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. junit基础学习之-简介(1)

    JUnit介绍 JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成. 1  JUnit简介 JUnit主要用来帮助开发人员进行Java的单元测试, ...

  2. springboot+thymeleaf项目中使用th:replace访问templates子目录下的模板,会报错找不到模板路径

    解决方法: 先将模板路径放置templates目录下,发现可以访问,说明th:replace是可以用的. 那可能是出现在路径问题上面. 于是我开始调错,改路径. 后来在网上查找资料.说了很多种方法. ...

  3. java菜鸡循环练习

    While 循环练习  输入3次密码,则打印密码锁定 package com.lv.test; import java.util.Scanner; public class DemoPass { pu ...

  4. s5pc100开发板linux内核移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y 应用于FSC100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc linux-2.6 ...

  5. zabbix_server

    http://www.linuxidc.com/Linux/2014-11/109909.htm [root@localhost zabbix]# service iptables stop  关闭i ...

  6. idea新建java项目

    盘符下新建一个目录: 打开idea: Open -> 新建的目录: 右击目录 -> new -> module: 填写模块名 -> finish: file -> pro ...

  7. 实验吧web-中-简单的sql注入

    页面显示:到底过滤了什么东西? 所以我们先试试到底是过滤了什么 1 显示正常 1' 不正常 (直接输入的关键字均会被过滤) 1 union select 显示:1 select 1 union sel ...

  8. consul配置

    参考:https://blog.csdn.net/achenyuan/article/details/80389410 gcp: consul安装目录:/usr/local/bin/consul co ...

  9. matplotlib画图实例-day1

    matplotlib主要用于根据数据画各种图表 官网:https://matplotlib.org/gallery/index.html 例1:画一天中每个两个小时温度变化趋势图 #!/usr/bin ...

  10. settings配置数据库和日志

    数据库的配置: 一.mysql配置 pip下载pymysql,用于mysql和django的连接. 在init.py上配置pymsqy. import pymysql pymysql.install_ ...