实现多项式的加法和乘法运算

不知道为啥,自己编程运行可以,一到PTA上运行就报错。不过算应该是没错的

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 /*使用链表实习多项式的加法运算*/
  4 typedef struct linkList{
  5     int xiShu;
  6     int ciShu;
  7     struct linkList *next;
  8 }list,*pList;
  9
 10
 11 pList init_linkList(){
 12     pList head;
 13     head = (pList)malloc(sizeof(list));
 14     if(head){
 15         head->next = NULL;
 16     }
 17     return head;
 18 }
 19
 20 int insert(pList *rear,int xiShu,int ciShu){
 21     if((*rear)==NULL){
 22        printf("head node is null,don‘t allow insert element\n");
 23        return 0;
 24     }else{
 25         pList newNode = (pList)malloc(sizeof(list));
 26         newNode->xiShu=xiShu;
 27         newNode->ciShu=ciShu;
 28         newNode->next = (*rear)->next;
 29         (*rear)->next = newNode;
 30         *rear = newNode;
 31         return 1;
 32     }
 33 }
 34
 35
 36 void toString(pList list){
 37     pList p = list->next;
 38     printf("\ntoString:");
 39     while(p!=NULL){
 40         printf("%dx^%d ",p->xiShu,p->ciShu);
 41         p=p->next;
 42     }
 43     printf("\n");
 44 }
 45
 46 void print(pList list){
 47     pList p = list->next;
 48     int flag=0;
 49     if(!list){
 50         print("0 0\n");
 51         return;
 52     }
 53     while(p!=NULL){
 54         if(!flag){
 55             flag=1;
 56         }else{
 57             printf(" ");
 58         }
 59         printf("%d %d",p->xiShu,p->ciShu);
 60         p=p->next;
 61     }
 62     printf("\n");
 63 }
 64
 65 int compare(pList p1,pList p2){
 66     if(p1->ciShu>p2->ciShu){
 67         return 1;
 68     }else if(p1->ciShu<p2->ciShu){
 69         return -1;
 70     }else{
 71         return 0;
 72     }
 73 }
 74
 75 void attach(int xiShu,int ciShu,pList *rear){
 76     pList p = (pList)malloc(sizeof(list));
 77     p->ciShu=ciShu;
 78     p->xiShu=xiShu;
 79     p->next=(*rear)->next;
 80     (*rear)->next=p;
 81     (*rear)=p;
 82 }
 83
 84
 85
 86 pList polyAdd(pList list1,pList list2){
 87     int sum;
 88     pList rear = init_linkList();
 89     pList font = rear;
 90     pList p1 =list1->next;
 91     pList p2 = list2->next;
 92     while(p1 && p2){
 93         switch(compare(p1,p2)){
 94             case 1:
 95                 attach(p1->xiShu,p1->ciShu,&rear);
 96                 p1=p1->next;
 97                 break;
 98
 99             case -1:
100                 attach(p2->xiShu,p2->ciShu,&rear);
101                 p2 = p2->next;
102                 break;
103             case 0:
104                 sum = p1->xiShu+p2->xiShu;
105                 if(sum){
106                     attach(sum,p1->ciShu,&rear);
107                 }
108                 p1 = p1->next;
109                 p2 = p2->next;
110                 break;
111         }
112
113     }
114
115     for(;p1;p1=p1->next){
116         attach(p1->xiShu,p1->ciShu,&rear);
117     }
118
119     for(;p2;p2=p2->next){
120         attach(p2->xiShu,p2->ciShu,&rear);
121     }
122     rear->next=NULL;
123     return font;
124 }
125
126 pList mult(pList p1,pList p2){
127     pList p,rear,t1,t2,t;
128     int c,e;
129     if(!p1 || !p2){
130         return NULL;
131     }
132     t1=p1;
133     t2=p2;
134     p = (pList)malloc(sizeof(list));
135     p->next = NULL;
136     rear =p;
137     while(t2){//先用p1的第一项乘以p2,得到p
138         attach(t1->xiShu*t2->xiShu,t1->ciShu+t2->ciShu,&rear);
139         t2 = t2->next;
140     }
141     t1=t1->next;
142     while(t1){
143         t2=p2;
144         rear=p;
145         while(t2){
146             e=t1->ciShu+t2->ciShu;
147             c=t1->xiShu*t2->xiShu;
148             while(rear->next && rear->next->ciShu>e){
149                 rear=rear->next;
150             }
151             if(rear->next && rear->next->ciShu==e){
152                 if(rear->next->xiShu+c){
153                     rear->next->xiShu+=c;
154                 }else{
155                     t=rear->next;
156                     rear->next = t->next;
157                     free(t);
158                 }
159             }else{
160                 t = (pList)malloc(sizeof(list));
161                 t->ciShu=e;
162                 t->xiShu=c;
163                 t->next=rear->next;
164                 rear->next=t;
165                 rear=rear->next;
166             }
167             t2 = t2->next;
168         }
169         t1=t1->next;
170     }
171
172     return p;
173 }
174
175 pList readLine(){
176     int n,i,xiShu,ciShu;
177     scanf("%d",&n);
178     pList list = init_linkList();
179     pList listRear = list;
180     for(i=0;i<n;i++){
181         scanf("%d %d",&xiShu,&ciShu);
182         insert(&listRear,xiShu,ciShu);
183     }
184
185     return list;
186 }
187
188
189 void main(){
190     /*
191     pList list1 = init_linkList();
192     pList list2 = init_linkList();
193     pList list1Rear = list1;
194     pList list2Rear = list2;
195     insert(&list1Rear,3,4);
196     insert(&list1Rear,-5,2);
197     insert(&list1Rear,6,1);
198     insert(&list1Rear,-2,0);
199     //insert(&list1Rear,-1,0);
200
201     insert(&list2Rear,5,20);
202     insert(&list2Rear,-7,4);
203     insert(&list2Rear,3,1);
204     //insert(&list2Rear,1,1);
205     //toString(list1);
206     //toString(list2);
207     */
208     pList list1 = readLine();
209     //toString(list1);
210     pList list2 = readLine();
211     pList result = polyAdd(list1,list2);
212     pList p = mult(list1->next,list2->next);
213     print(p);
214     print(result);
215 }

时间: 2025-01-16 13:47:45

实现多项式的加法和乘法运算的相关文章

链表的应用:单元多项式的加法、减法、乘法

使用链表来实现单元多项式的加法.减法.乘法.一个单元多项式的节点结构无非是这样的:系数域.指数域.链域. 如下图: 我们使用链表来模拟单元多项式的常见运算.其中,加法是其它运算的基础,减法:poly1-poly2=poly1+(-poly2),乘法:poly1*poly2,可用poly1乘以poly2的每一项,相加其乘积结果. 单元多项式的节点结构类型是这样的: typedef struct node { float coef; //系数 int expn; //指数 struct node *

数据结构第二次上机实验【链表实现多项式的加法和乘法】

利用链表实现一元多项式的加法和乘法 #define null 0 #include "stdio.h" #include "stdlib.h" #include "math.h" int op; typedef struct { float coef;//系数 int expn;//指数 }term; typedef struct Lnode { term data; Lnode *next; }*Link,*Linklist; int cmp(

使用qt制作简单的加法,乘法运算。

1.首先构架qt应用项目 2.然后打开使用 Qt desinger打开 Fomr File 里的UI文件进行编辑 3.由于此程序只需点击加号,减号这两个按钮,所以设置了两个信号槽 4.然后是连接信号槽 5.最后是对方法的实现 实现的代码,里面要注意从 QLineEdit 获取的值是  QString 类型,需要转换为所需要的类型,我转换成了double类型的,最后给QLineEdit赋值也必须是QString类型的,所以还要转回来,具体实现,从代码体会.

编写一个菜单选择使用加法和乘法运算

#!/bin/bash#auther:acf #!/bin/basha=$1b=$2sum(){# echo $(($1 + $2))read -p "first num " num1read -p "second num " num2let c=$num1+$num2 } cf(){read -p "first num " num1read -p "second num " num2 let d=$num1*$num2# l

数据结构与算法分析(6)表的应用实例

在这里我介绍四个使用表解决实际中的问题的例子,分别是: 1.多项式的加法和乘法运算: 2.基数排序: 3.表的游标实现: 4.多重表在学生选课系统中的应用.(可选)     (1)多项式的加法和乘法: 多项式的加法和乘法有两个实现方式,第一个是用数组来实现,它适合大多数项都有的稠密的多项式:第二个是用链表来实现,它适用于比较稀疏的多项式.但总体而言,还是链表实现的比较好! 1)下面给出链表实现多项式加法和乘法的范例: 1 //多项式加法乘法的链表实现 2 #include <stdio.h>

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod

南邮OJ 1005 多项式加法

题目描述:线性表是一种最简单.最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算.现给两个一元整系数多项式,请求解两者之和. 题目链接:点击打开链接 代码是借鉴别人的,链接:点击打开链接 <span style="font-size:18px;">#include <iostream> using namespace std; class nodeList; class Node //单链表节点 { pri

使用shell脚本实现加法乘法运算

编写一个shell脚本,实现加法和乘法运算. #!/bin/bash #Function:num1+num2 num3*num4 sum(){read -p "please key in first number:" num1read -p "please key in second number:" num2let num3=${num1}+${num2}echo -e "\033[32m $num1 + $num2 = $num3 \033[0m&qu

[学习笔记] 多项式与快速傅里叶变换(FFT)基础

引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积(或者多项式乘法/高精度乘法), 而代码量却非常小. 博主一年半前曾经因COGS的一道叫做"神秘的常数 $\pi$"的题目而去学习过FFT, 但是基本就是照着板子打打完并不知道自己在写些什么鬼畜的东西OwO 不过...博主这几天突然照着算法导论自己看了一遍发现自己似乎突然意识到了什么OwO然后就打了一道板子题还1A了OwO再加上午考试差点AK