多项式操作(单链表)

写了个基于单链表的多项式加法与乘法操作,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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值