很简单。略。
之所以不用单链表是因为线性表得数组形式“下标对应指数,数据元素对应系数”,理所当然成为处理多项式的首选。
#include#include #define N 20 typedef int ElemType; typedef struct{ ElemType *elem; int length; }List_Sq; //顺序表初始化函数 List_Sq* InitList_Sq(List_Sq* L){ L->elem = (ElemType*)malloc(sizeof(ElemType)*N); L->length = 0; return L; } //顺序表建立函数 void CreateList_Sq(List_Sq* L,int n){ int i; for(i = 0;i < n;i++){ printf("请输入x^%d的系数:",i); scanf("%d",&(L->elem[i])); } L->length = n; } //顺序表销毁函数 void DestroyList_Sq(List_Sq *L){ if(L->elem) free(L->elem); } //多项式相加函数 List_Sq* AddList_Sq(List_Sq* Laa,List_Sq* Lbb,List_Sq* Lcc,int nc){ ElemType *Laa_last,*Lbb_last,*pa,*pb,*pc; Lcc->elem = (ElemType*)malloc(sizeof(ElemType)*nc); Lcc->length = nc; pa = Laa->elem; pb = Lbb->elem; pc = Lcc->elem; Laa_last = &Laa->elem[Laa->length-1]; Lbb_last = &Lbb->elem[Lbb->length-1]; while(pa<=Laa_last && pb<=Lbb_last){ *pc = *pa + *pb; pa++; pb++; pc++; } while(pa<=Laa_last){ *pc = *pa; pa++; pc++; } while(pb<=Lbb_last){ *pc = *pb; pb++; pc++; } return Lcc; } //多项式相减函数 List_Sq* SubtractList_Sq(List_Sq* Laa,List_Sq* Lbb,List_Sq* Lcc,int nc){ ElemType *Laa_last,*Lbb_last,*pa,*pb,*pc; Lcc->elem = (ElemType*)malloc(sizeof(ElemType)*nc); Lcc->length = nc; pa = Laa->elem; pb = Lbb->elem; pc = Lcc->elem; Laa_last = &Laa->elem[Laa->length-1]; Lbb_last = &Lbb->elem[Lbb->length-1]; while(pa<=Laa_last && pb<=Lbb_last){ *pc = *pa - *pb; pa++; pb++; pc++; } while(pa<=Laa_last){ *pc = *pa; pa++; pc++; } while(pb<=Lbb_last){ *pc = *pb; pb++; pc++; } return Lcc; } //多项式相乘函数 List_Sq* MultiplyList_Sq(List_Sq* Laa,List_Sq* Lbb,List_Sq* Lcc,int nc){ int i,j; Lcc->elem = (ElemType*)malloc(sizeof(ElemType)*nc); Lcc->length = nc; for(i = 0;i elem[i] = 0; } for(i = 0;i length;i++){ for(j = 0;j length;j++){ Lcc->elem[i+j] += Laa->elem[i]*Lbb->elem[j]; } } return Lcc; } //多项式显示函数(只是为了显示得符合常规,没有必要) void DisplayList_Sq(List_Sq* L){ int i,sign; sign = 0; for(i = 0;i < L->length;i++){ if(i == 0){ if(L->elem[i]!=0) printf("%d",L->elem[i]); else sign++; } else if(i == 1){ if(L->elem[0] == 0){ if(L->elem[i] == 1) printf("x"); else if(L->elem[i]<0||L->elem[i]>1) printf("%dx",L->elem[i]); else sign++; } else{ if(L->elem[i] == 1) printf("+x"); else if(L->elem[i]>1) printf("+%dx",L->elem[i]); else if(L->elem[i]<0) printf("%dx",L->elem[i]); else sign++; } } else{ if(sign == i){ if(L->elem[i] == 1) printf("x^%d",i); else if(L->elem[i]<0||L->elem[i]>1) printf("%dx^%d",L->elem[i],i); else sign++; } else{ if(L->elem[i] == 1) printf("+x^%d",i); else if(L->elem[i]>1) printf("+%dx^%d",L->elem[i],i); else if(L->elem[i]<0) printf("%dx^%d",L->elem[i],i); else sign++; } } } printf("n"); } void main(){ List_Sq La,Lb,Lc; List_Sq *Laa,*Lbb,*Lcc; int na,nb,nc; Laa = &La; Lbb = &Lb; Lcc = &Lc; printf("建立多项式1:n"); printf("请输多项式项数:"); scanf("%d",&na); Laa = InitList_Sq(Laa); CreateList_Sq(Laa,na); printf("多项式1为:"); DisplayList_Sq(Laa); printf("建立多项式2:n"); printf("请输多项式项数:"); scanf("%d",&nb); Lbb = InitList_Sq(Lbb); CreateList_Sq(Lbb,nb); printf("多项式2为:"); DisplayList_Sq(Lbb); nc = na>nb?na:nb; Lcc = AddList_Sq(Laa,Lbb,Lcc,nc); printf("相加结果为:"); DisplayList_Sq(Lcc); DestroyList_Sq(Lcc); Lcc = SubtractList_Sq(Laa,Lbb,Lcc,nc); printf("相减结果为:"); DisplayList_Sq(Lcc); DestroyList_Sq(Lcc); nc = na + nb; Lcc = MultiplyList_Sq(Laa,Lbb,Lcc,nc); printf("相乘结果为:"); DisplayList_Sq(Lcc); }



