您的位置:首页 > 其它

多项式操作(单链表)

2014-10-09 15:05 330 查看
写了个基于单链表的多项式加法与乘法操作,C的,欢迎各位指正。

#include<stdlib.h>
#include<stdio.h>
typedef struct Node *PraToNode;
typedef struct Node{
float Coefficient;
int Exponent;
PraToNode Next;
};

typedef PraToNode Polynomial;

Polynomial InitPoly(){
Polynomial P;
P = (Polynomial)malloc(sizeof(struct Node));
if(P==NULL){
printf("内存分配出错!\n");
exit(0);
}
memset(P,0,sizeof(P));
printf("初始化成功\n");
return P;
}

void Create(Polynomial P){
printf("每次输入一组数,第一个为系数,第二个为次数\n(次数必须为整数)\n");
Polynomial PNode,TempHead;
PNode = (Polynomial)malloc(sizeof(struct Node));
memset(PNode,0,sizeof(struct Node));
TempHead = P;
scanf("%f%d",&PNode->Coefficient,&PNode->Exponent);
while(PNode->Coefficient != 0){
TempHead->Next = PNode;
TempHead = TempHead->Next;
PNode = (Polynomial)malloc(sizeof(struct Node));
if(PNode==NULL){
printf("内存分配出错!\n");
exit(0);
}
scanf("%f%d",&PNode->Coefficient,&PNode->Exponent);
PNode->Next = NULL;
}
printf("%d",PNode->Exponent);
free(PNode);
PNode = NULL;
printf("多项式链表构造成功!\n");
}

void PrintPoly(Polynomial P){
P = P->Next;
if(P==NULL){
printf("未初始化\n");
return;
}

printf("%.3f",P->Coefficient);
if(P->Exponent==0)
printf("");
else if(P->Exponent==1)
printf("x");
else if(P->Exponent>1)
printf("x^%d",P->Exponent);
else
printf("x^(%d)",P->Exponent);
P = P->Next;
while(P != NULL){
if(P->Coefficient>0)
printf("+");
printf("%.3f",P->Coefficient);
if(P->Exponent==0)
printf("");
else if(P->Exponent==1)
printf("x");
else if(P->Exponent>1)
printf("x^%d",P->Exponent);
else
printf("x^(%d)",P->Exponent);
P = P->Next;
}
printf("\n");
}

void SortPoly1(Polynomial p1){
/*插入排序*/
if(p1->Next==NULL || p1->Next->Next==NULL){
printf("链表长度小于2,无须排序!\n");
return;
}
Polynomial NonSort, BeforNS, SNode;
BeforNS = p1->Next;
NonSort = BeforNS->Next;
while(NonSort != NULL){
SNode = p1;
while(SNode->Next!=NonSort){
if(SNode->Next->Exponent>NonSort->Exponent){
BeforNS->Next = BeforNS->Next->Next;
NonSort->Next = SNode->Next;
SNode->Next = NonSort;
NonSort = BeforNS->Next;
break;
}
SNode = SNode->Next;
}
if(SNode==BeforNS){
BeforNS = BeforNS->Next;
NonSort = BeforNS->Next;
}
}
}

void SortPoly2(Polynomial p1){
/*选择排序*/
if(p1->Next==NULL || p1->Next->Next==NULL){
printf("链表长度小于2,无须排序!\n");
return;
}
Polynomial LastNode, CmpNode, BeforeNode, SmNode;
LastNode = p1;
while(LastNode->Next != NULL){
BeforeNode = LastNode;
SmNode = LastNode->Next;
CmpNode = SmNode;
while(CmpNode->Next!=NULL){
if(CmpNode->Next->Exponent<SmNode->Exponent){
BeforeNode = CmpNode;
SmNode = CmpNode->Next;
}
CmpNode = CmpNode->Next;
}
BeforeNode->Next = SmNode->Next;
SmNode->Next = LastNode->Next;
LastNode->Next = SmNode;
LastNode = LastNode->Next;
}
}

void Set(Polynomial P){
Polynomial Head;
Head = P;
P = P->Next;
if(P==NULL){
printf("未初始化\n");
return;
}

Polynomial TempNode;
while(P->Next != NULL){
if(P->Exponent == P->Next->Exponent){
P->Coefficient = P->Coefficient+P->Next->Coefficient;
TempNode = P->Next;
P->Next = P->Next->Next;
free(TempNode);
TempNode = NULL;
}
else{
P = P->Next;
}
}
while(Head->Next != NULL){
if(Head->Next->Coefficient==0){
TempNode = Head->Next;
Head->Next = Head->Next->Next;
free(TempNode);
TempNode = NULL;
}
else
Head = Head->Next;
}
}

Polynomial AddPoly(Polynomial p1, Polynomial p2){
/* 多项式加法 */
Polynomial AddPoly,Head;
AddPoly = (Polynomial)malloc(sizeof(struct Node));
if(AddPoly==NULL){
printf("内存分配出错!\n");
exit(0);
}
memset(AddPoly,0 ,sizeof(struct Node));
Head = AddPoly;

p1 = p1->Next;
p2 = p2->Next;
while(p1!=NULL && p2!= NULL){
Polynomial NewPoly;
NewPoly = (Polynomial)malloc(sizeof(struct Node));
NewPoly->Next=NULL;
if(AddPoly==NULL){
printf("内存分配出错!\n");
exit(0);
}
if(p1->Exponent > p2->Exponent){
NewPoly->Exponent = p2->Exponent;
NewPoly->Coefficient = p2->Coefficient;
p2 = p2->Next;
}
else if(p1->Exponent < p2->Exponent){
NewPoly->Exponent = p1->Exponent;
NewPoly->Coefficient = p1->Coefficient;
p1 = p1->Next;
}
else{
NewPoly->Exponent = p1->Exponent;
NewPoly->Coefficient = p1->Coefficient+p2->Coefficient;
p1 = p1->Next;
p2 = p2->Next;
}
AddPoly->Next = NewPoly;
AddPoly = AddPoly->Next;
}
if(p1==NULL && p2== NULL){
return Head;
}
else{
Polynomial TempPoly;
TempPoly = ((p2==NULL)?p1:p2);

while(TempPoly!=NULL){
Polynomial NewPoly;
NewPoly = (Polynomial)malloc(sizeof(struct Node));
if(AddPoly==NULL){
printf("内存分配出错!\n");
exit(0);
}
NewPoly->Next=NULL;
NewPoly->Exponent = TempPoly->Exponent;
NewPoly->Coefficient = TempPoly->Coefficient;
AddPoly->Next = NewPoly;
AddPoly = AddPoly->Next;
TempPoly = TempPoly->Next;
}
}
return Head;
}

Polynomial MulPoly(Polynomial p1, Polynomial p2){
Polynomial AddPoly,Head;
AddPoly = (Polynomial)malloc(sizeof(struct Node));
if(AddPoly==NULL){
printf("内存分配出错!\n");
exit(0);
}
memset(AddPoly,0 ,sizeof(struct Node));
Head = AddPoly;
Polynomial p22;
p22 = p2;
while(p1->Next!=NULL){
p1 = p1->Next;
p2 = p22;
while(p2->Next!=NULL){
p2 = p2->Next;
Polynomial NewPoly;
NewPoly = (Polynomial)malloc(sizeof(struct Node));
if(AddPoly==NULL){
printf("内存分配出错!\n");
exit(0);
}
NewPoly->Exponent = p1->Exponent+p2->Exponent;
NewPoly->Coefficient = (p1->Coefficient)*(p2->Coefficient);
NewPoly->Next = NULL;
AddPoly->Next = NewPoly;
AddPoly = AddPoly->Next;
}
}
SortPoly2(Head);
Set(Head);
return Head;
}

Polynomial CreatePoly(){
Polynomial P;
P = InitPoly();
Create(P);
printf("输入的多项式:");
PrintPoly(P);
SortPoly2(P);
Set(P);
printf("化简后的多项式:");
PrintPoly(P);
return P;
}

int main(){

Polynomial P1,P2,P3,P4;
P1 = CreatePoly();
P2 = CreatePoly();
P3 = AddPoly(P1,P2);
printf("多项式相加:");
PrintPoly(P3);
P4 = MulPoly(P1,P2);
printf("多项式相乘:");
PrintPoly(P4);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: