关于使用静态链表实现一元多项式的相加&&乘积
一元多项式的相加类似于两条链表的合并
当然前提是链表中的幂指数是按顺序排列的
此题中的链表采用的是升序排列,输出也是按升序输出的
#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);
}
关于使用静态链表实现一元多项式的相加&&乘积的更多相关文章
- 单链表之一元多项式求和C++实现
单链表之一元多项式求和 一元多项式求和单链表实现伪代码 1.工作指针 pre.p.qre.q 初始化2.while(p 存在且 q 存在)执行下列三种情况之一: 2.1.若 p->exp < ...
- PHP数据结构之四 一元多项式的相加PHP单链实现
<?php /** *一元多项式的表示和相加 *一元多项式的表示采用单链表的形式 **/ header("content-type:text/html;charset=gb2312&q ...
- 关于leetcode中链表中两数据相加的程序说明
* Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ ...
- 使用C语言描述静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...
- 静态链表 C语言描述
静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...
- 03静态链表_StaticLinkList--(线性表)
#include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...
- java与数据结构(2)---java实现静态链表
结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...
- 静态链表实现 (A-B)U(B-A)
图中黄色部分为(A-B)U(B-A)的实际意义,用结构数组做静态链表来实现该表达式 大致流程是先建立A链表,接着将挨个输入的B中元素在A链表中遍历.如果没找到,就加到A链表结尾下标为endpointe ...
- C链表之创建简单静态链表
C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...
随机推荐
- redis十-对快照模式分析
复制自:http://www.cnblogs.com/huangxincheng/p/5010795.html 一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是 ...
- spring监听器+定时任务
背景:在原SSM项目中,拟定在每晚的23:59:59执行一个批处理任务. 设计思路:用jdk自带的定时器触发任务执行,设置下次执行间隔为24小时.定时任务由spring的监听器去启动. jdk版本:1 ...
- Android数据库(sqlite)之Room
说在前面: 1.使用Room需要添加的依赖: dependencies { def room_version = "2.2.3" implementation "andr ...
- LightOJ - 1282 Leading and Trailing (数论)
题意:求nk的前三位和后三位. 分析: 1.后三位快速幂取模,注意不足三位补前导零. 补前导零:假如nk为1234005,快速幂取模后,得到的数是5,因此输出要补前导零. 2.前三位: 令n=10a, ...
- C++ #if 1
当注释掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/** ...
- Java算法练习——最长回文子串
题目链接 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1 输入: "babad" 输出: "bab" ...
- InstrumentationTextCase 测试
<instrumentation android:name="android.test.InstrumentationTestRunner" an ...
- typeof()与Object.prototype.toString.call()
用typeof方法只能初步判断number string undefined boolean object function symbol这几种初步类型 使用Object.prototype.toSt ...
- URAL_1018 Binary Apple Tree 树形DP+背包
这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...
- pyCharm中设置查看运行过程中的变量实时情况
1.点击运行栏的这个灰色向下剪头: 2.单击“Edit Configurations”, 3.在出现的窗口上,勾选上:“Show command line afterwards” 或 “run wit ...