#include <stdio.h>
#include <stdlib.h>
typedef struct /*多項式節點,存盤系數和指數**/
{
float c; float e;
}Element;
typedef struct Node /*多項式鏈表**/
{
Element data; struct Node* Next;
}*PolyList,*Position;
void CreatPoly(PolyList *L)/*構建 M 項多項式**/
{
if(*L==NULL)/*頭節點多項式系數 0.0,指數-1**/
{
*L=malloc(sizeof(struct Node ));
(*L)->Next=NULL;
(*L)->data.c=0.0;
(*L)->data.e=-1;
}
Position Tmp=*L;
float c,e;
while(scanf("%f",&c)&&scanf("%f",&e))/*讀入系數和指數**/
{
Position NewNode=malloc(sizeof(struct Node ));
NewNode->Next=NULL;
NewNode->data.c=c;
NewNode->data.e=e;
Tmp->Next=NewNode;/*尾部插入新節點*/
Tmp=NewNode;
}
}
void ShowPoly(PolyList *L)
{
Position Tmp=*L;
if(Tmp->Next==NULL)
printf("\n多項式為空");
else
{
while(Tmp->Next!=NULL )
{ if(Tmp->Next->Next==NULL)/*最后一項**/
printf(" %.1fx^%.0f",Tmp->Next->data.c,Tmp->Next->data.e);
else
printf(" %.1fx^%.0f+",Tmp->Next->data.c,Tmp->Next->data.e);
Tmp=Tmp->Next;
}
}
printf("\n");
}
void InsertsortedPoly(PolyList *L, Position NewNode)/*有序將節點插入多項式,多項式必須有頭節點**/
{
//將第二個鏈表里的節點插入到鏈表一中
Position Tmp=*L;
while(Tmp->Next!=NULL)
{
if(Tmp->Next->data.e==NewNode->data.e)
{
Tmp->Next->data.c+=NewNode->data.c;
return;
}
else if(Tmp->Next->data.e<NewNode->data.e)
{
Tmp=Tmp->Next;
}
else/*插入新節點**/
{
NewNode->Next=Tmp->Next;
Tmp->Next=NewNode;
return;
}
}
Tmp->Next=NewNode;/*將新節點插入到多項式開始或者末尾**/
}
void InisortedPoly(PolyList *L)/*構建 M 項有序多項式,可任意輸入**/
{
if(*L==NULL)/*生成頭節點多項式系數 0.0,指數-1**/
{
*L=malloc(sizeof(struct Node ));
(*L)->Next=NULL;/*非常重要**/
(*L)->data.c=0.0;
(*L)->data.e=-1;
}
Position Tmp=*L;
float c,e;
while(scanf("%f",&c)&& scanf("%f",&e))/*讀入系數和指數**/
{
// scanf("%f%f",&c,&e) if(e<0.0) continue;
Position NewNode=malloc(sizeof(struct Node ));
NewNode->Next=NULL;/*非常重要**/
NewNode->data.c=c;
NewNode->data.e=e;
InsertsortedPoly(&Tmp, NewNode);
}
}
void AddPolynomian(PolyList *A,PolyList *B) //將兩個鏈表中的同類項合并
{
Position Pa ,Pb,Tmp;
Pa=*A;Pb=*B;
while(Pa->Next!=NULL && Pb->Next!=NULL)
{ if(Pa->Next->data.e==Pb->Next->data.e)
{
Pa->Next->data.c+=Pb->Next->data.c;
Tmp=Pb->Next;
Pb->Next=Tmp->Next;
Tmp->Next=NULL;
free(Tmp);
Pa=Pa->Next;
}
else if(Pa->Next->data.e<Pb->Next->data.e)
{
Pa=Pa->Next;
}
else/*將 Pb 后繼節點插入到 Pa 之后**/
{
Tmp=Pb->Next;
Pb->Next=Tmp->Next;
Tmp->Next=Pa->Next;
Pa->Next=Tmp;
} }
if(Pa->Next==NULL)
{
Pa->Next=Pb->Next;
Pb->Next=NULL;
}
}
PolyList mul(PolyList *A,PolyList *B)
{
Position p1,p2,p3,L,Lm;
L=(PolyList)malloc(sizeof(struct Node));
p1=(*A)->Next;
p2=(*B)->Next;
L->Next=NULL;
if(p1&&p2){
for(p1=(*A)->Next;p1;p1=p1->Next){
Lm=(PolyList)malloc(sizeof(struct Node));
Lm->Next=NULL;
p3=Lm;
for(p2=(*B)->Next;p2;p2=p2->Next){
PolyList p4=(PolyList)malloc(sizeof(struct Node));//尾插法
p4->Next->data.c=p1->Next->data.c*p2->Next->data.c;
p4->Next->data.e=p1->Next->data.e+p2->Next->data.e;
p3->Next=p4;
p3=p4;
}
p3->Next=NULL;//若不寫,則記憶體出錯
}
}
return Lm;
}
int main(int argc, const char * argv[])
{
PolyList L=NULL;
PolyList M=NULL;
PolyList N;
// IniPoly(&L);
// ShowPoly(&L);
InisortedPoly(&L);
ShowPoly(&L);
fflush(stdin);
InisortedPoly(&M);
ShowPoly(&M);
printf("------------------\n\n\n");
N=mul(&L,&M);
ShowPoly(&N);
return 0;
}
麻煩大佬看一下,我想做一個多項式乘法,但是乘法那個函式有問題,沒辦法顯示結果,我也不知道哪里不對,誰能幫我編一下這個函式,真的跪了
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/142018.html
標籤:新技術前沿
上一篇:那個空怎么錯了
