一元稀疏多項式加減法計算器
實驗一:一元稀疏多項式計算器
[問題描述]:
設計一個一元稀疏多項式簡單計算器。
[基本要求]:
一元稀疏多項式簡單計算器的基本功能是:
(1)輸出並建立多項式;
(2)輸出多項式,輸出形式為整數序列:n,c1,e1,c2,e2,...,cn,en,其中n是多項式的項數,ci和ei分別是第i項的係數和指數,序列按指數降序排列;
(3)多項式a和b相加,建立多項式a+b;
(4)多項式a和b相減,建立多項式a-b;
[測試資料]
(1)(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);
(2)(6x^(-3)-x+4.4x^2-1.2x^9)-(-6x^(-3)+5.4x^2-x^2+7.8x^15)=(-7.8x^15-1.2x^9+12x^(-3)-x);
(3)(x+x^3)+(-x-x^3)=0;
(4)(x+x^2+x^3)+0=x+x^2+x^3;
(由於篇幅原因,只選取了具有代表性的4組測試資料)
[實現提示]
用帶表頭節點的單連結串列儲存多項式。
一:程式設計流程:
1.建立兩個帶頭節點的單連結串列A、B。
2.將A、B兩個連結串列連線成一個新連結串列 C;
3.用冒泡法對C中連結串列進行排序。
4.把C連結串列中指數項相同節點合併。
二:程式原始碼:
#include "stdlib.h"
#include "string.h"
typedef struct PolyNode
{
float coef; //係數
int exp; //指數
struct PolyNode *next;
} PolyNode;
typedef PolyNode *Polynomial;
Polynomial CreateList(){
float co;
int ex;
Polynomial head,p,l;
head = (Polynomial)malloc(sizeof(PolyNode));
p = head;
scanf("%f%d",&p->coef,&p->exp); //設定頭結點,並且設定第一個節點,為了保證表不為空
if(head->coef==0&&head->exp==0){ //如果頭結點資料元素均為0,則為單節點連結串列
head->next=NULL;
}else{
p->next=(Polynomial)malloc(sizeof(PolyNode));
p=p->next;
while(1){
scanf("%f%d",&co,&ex);
if(co==0&&ex==0) break; // x=0並且y=0 代表結束輸出
p->coef=co;
p->exp =ex;
l=p;
p->next =(Polynomial)malloc(sizeof(PolyNode));
p=p->next;
}
l->next = NULL;
}
return head;
}
void Sortlist(Polynomial L){ // 用冒泡法對連結串列L中的節點按指數降序排列。
Polynomial a,b;
float temp_co; //設定中間變數來交換連結串列元素的值;
int temp_ex;
b =L;
a =L;
for(a;a!=NULL;a=a->next){
b= L ;
for(b;b->next!=NULL;b=b->next){
if(b->exp<b->next->exp){
temp_co=b->coef;
temp_ex=b->exp;
b->coef=b->next->coef;
b->exp =b->next->exp;
b->next->coef =temp_co;
b->next->exp =temp_ex;
}
}
}
return;
}
void Display(Polynomial p){
Polynomial Pointer;
Pointer =p;
do{
printf("%.2fx^%d ",Pointer->coef,Pointer->exp);
Pointer=Pointer->next;
}while(Pointer!=NULL);
}
Polynomial LinkList(Polynomial A,Polynomial B,int n) //連結連結串列A B,在這裡設定B的頭指標為連線後的頭指標 n=1表示加法,n=2表示減法;
{
Polynomial tail_b,C,op_pointer; // op_pointer 用來取反連結串列B cof 的數值。
tail_b =B;
op_pointer =B;
for(op_pointer;op_pointer!=NULL;op_pointer=op_pointer->next){
if(n==2){
op_pointer->coef = -op_pointer->coef;
//printf("%.2f %d\n",op_pointer->coef,op_pointer->exp);
}
};
for(tail_b;tail_b->next!=NULL;tail_b=tail_b->next); // 連線 B A 連結串列,以B連結串列頭為合併後的表頭
tail_b->next=A;
C=B;
Sortlist(C);
return C;
}
void MergeList(Polynomial C){ // 合併C中exp數值相同的節點.
Polynomial C1,C2;
C1=C;
C2=C1->next;
while(C2!=NULL){
if(C1->exp == C1->next->exp){
C1->coef=C1->next->coef+C1->coef;
C1->next=C1->next->next;
free(C2);
C2=C1->next;
}else{
C1=C1->next;
C2=C2->next;
}
}
}
void main(){
Polynomial A,B,Com;
int s;
printf("\n請輸入連結串列A的資料:格式為 coeffient exp 以空格分開\n");
A = CreateList();
Display(A);
printf("\n請輸入連結串列B的資料:格式為 coeffient exp 以空格分開\n");
B = CreateList();
Display(B);
printf("請選擇加法還是減法\n");
printf("輸入1代表加法\n");
printf("輸入2代表減法\n");
scanf("%d",&s);
if(s==1||s==2){
Com = LinkList(A,B,s);
MergeList(Com);
Display(Com);
}else{
printf("輸入了非法字元\n");
}
}
三、測試資料
1.(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);
2.(6x^(-3)-x+4.4x^2-1.2x^9)-(-6x^(-3)+5.4x^2-x^2+7.8x^15)=(-7.8x^15-1.2x^9+12x^(-3)-x);
3.(x+x^3)+(-x-x^3)=0;
4.(x+x^2+x^3)+0=x+x^2+x^3;
相關文章
- 一元多項式操作
- java的多項式的加減乘除和賦值Java賦值
- 【oracle】日期加減計算Oracle
- 33:計算分數加減表示式的值
- 一元多項式的應用
- 36:計算多項式的值
- 用單連結串列實現多項式加,減,乘,簡單微分
- 詳解線性結構 —— 一元多項式的乘法與加法運算
- Oracle計算時間函式(對時間的加減numtodsinterval、numtoyminterval)Oracle函式
- excel日期加減計算方法 excel計算日期時間差Excel
- mysql查詢中時間、日期加減計算MySql
- 超大整數的加減乘除計算方法
- LeetCode_0224. 基本計算器,帶括號和空格的加減法算式LeetCode
- ACM 分數加減法ACM
- 十六進位制減法計算
- 如何用位運算實現整數的加減法
- SDUST OJ 時間類的加、減法賦值運算賦值
- JavaScript浮點數加減乘除精確計算JavaScript
- 計算機組成原理浮點數加減計算機
- JavaScript加減乘數運算JavaScript
- SQL中時間的加減法SQL
- 演化計算(例項:多峰函式最值) (轉)函式
- MongoDB 中的【加減乘除】運算MongoDB
- 位運算實現加減乘除
- N位二進位制數加減法運算圖靈機圖靈
- golang time 時間的加減法Golang
- JSF的加減法與SeamJS
- JS 加減乘除 尤其是減法精度問題JS
- 大資料的運算加減乘除大資料
- timestamp型別的加減運算型別
- 基礎實驗3-2.1 一元多項式求導 (20分)求導
- 請寫一個整數計算器,支援加減乘三種運算和括號。Python版本Python
- java 日期加減天數、月數、年數的計算方式Java
- NumPy 簡單算術:加減乘除及其他運算
- 從一個加減法運算程式碼理解特殊運算子的過載
- 1010 一元多項式求導 (25分)/c++實現求導C++
- Verilog實現加減乘除運算
- 演算法搜狗筆試題加減法演算法筆試