多项式相加

来源:互联网 发布:货运app软件 编辑:程序博客网 时间:2024/04/29 01:10
/*    说明:共有三个文件main.c,Polynomial.h,Polynomial.c    实例输入:    4    7 0    3 1    9 8    5 17    3    8 1    22 7    -9 8*///main.c#include <stdio.h>#include <stdlib.h>#include "Polynomial.h"int main(void){    int choice;    Polynomial p1, p2;    Init(&p1);    Init(&p2);    Create(&p1);    Create(&p2);    while (1)    {        printf("please enter choice:\n");        scanf("%d", &choice);        switch(choice)        {            case 1:Add(&p1, &p2);break;            case 2:Traverse(&p1);break;            case 0:exit(1);break;        }    }    Destroy(&p1);    Destroy(&p2);    return 0;}//Polynomial.h#define OK 1#define ERROR 0typedef int Status;typedef struct ElemType{    float coefficient;    int index;}ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;}LNode, *LinkList, *Position;typedef struct{    LinkList head;    int length;}Polynomial;Status compare(ElemType, ElemType);//初始化Status Init(Polynomial*);//建立Status Create(Polynomial*);//取得头结点Position GetHead(Polynomial*);//返回下一个Position NextPos(Polynomial*, LinkList);//取得数据元素的值ElemType GetCurElem(LinkList);//设置数据元素的值Status SetCurElem(LinkList*, ElemType);//删除第一个结点,但是,并不释放空间Status DelFirst(LinkList, LinkList*);//释放void FreeNode(LinkList*);//插入在第一个结点之前Status InsFirst(LinkList, LinkList);//判断是否为空Status ListEmpty(Polynomial);//添加Status Append(Polynomial*, LinkList);//加Status Add(Polynomial*, Polynomial*);//遍历Status Traverse(Polynomial*);//销毁Status Destroy(Polynomial*);//Polynomial.c#include "Polynomial.h"#include <stdlib.h>#include <stdio.h>Status compare(ElemType a, ElemType b){    if (a.index == b.index)    {        return 0;    }    else if (a.index > b.index)    {        return 1;    }    else    {        return -1;    }}Status Init(Polynomial *p){    p->head = (LinkList)malloc(sizeof(LNode));    p->head->data.coefficient = 0.0;    p->head->data.index = -1;    p->head->next = NULL;    p->length = 0;    return OK;}Status Create(Polynomial *p){    int i = 0;    LinkList h = p->head;    LinkList q;    printf("please enter p->length:\n");    scanf("%d", &(p->length));    for (i = 0; i < p->length; ++i)    {        q = (LinkList)malloc(sizeof(LNode));        printf("please enter coefficient and index:\n");        scanf("%f", &(q->data.coefficient));        scanf("%d", &(q->data.index));        q->next = h->next;        h->next = q;        h = q;    }    return OK;}Position GetHead(Polynomial *p){    return p->head;}Position NextPos(Polynomial *p, LinkList l){    return l->next;}ElemType GetCurElem(LinkList l){    ElemType data;    data.coefficient = l->data.coefficient;    data.index = l->data.index;    return data;}Status SetCurElem(LinkList *l, ElemType data){    (*l)->data.coefficient = data.coefficient;    (*l)->data.index = data.index;    return OK;}Status DelFirst(LinkList h, LinkList *p){    LinkList q = h->next;    (*p) = q;    h->next = q->next;    return OK;}void FreeNode(LinkList *l){    free(*l);    return ;}Status InsFirst(LinkList h, LinkList p){    p->next = h->next;    h->next = p;    return OK;}Status ListEmpty(Polynomial p){    return p.length;}Status Append(Polynomial *p, LinkList l){    LinkList h = p->head;    while (h->next)    {        h = h->next;    }    h->next = l;    return OK;}Status Add(Polynomial *pa, Polynomial *pb){    Position ha = GetHead(pa);    Position hb = GetHead(pb);    Position qa = NextPos(pa, ha);    Position qb = NextPos(pb, hb);    ElemType a;    ElemType b;    ElemType sum;    while (qa && qb)    {        a = GetCurElem(qa);        b = GetCurElem(qb);        switch(compare(a, b))        {            case -1:            ha = qa;            qa = NextPos(pa, ha);            break;            case 0:            sum.coefficient = a.coefficient + b.coefficient;            sum.index = a.index;            if (0.0 != sum.coefficient)            {                SetCurElem(&qa, sum);                ha = qa;            }            else            {                DelFirst(ha, &qa);                FreeNode(&qa);            }            DelFirst(hb, &qb);            FreeNode(&qb);            qb = NextPos(pb, hb);            qa = NextPos(pa, ha);            break;            case 1:            DelFirst(hb, &qb);            InsFirst(ha, qb);            qb = NextPos(pb, hb);            ha = NextPos(pa, ha);            break;        }    }    if (!ListEmpty(*pb))    {        Append(pa, qb);        free(hb);    }    return OK;}Status Traverse(Polynomial *p){    LinkList h = p->head->next;    while (h)    {        printf("%fx(%d)\n", h->data.coefficient, h->data.index);        h = h->next;    }    return OK;}Status Destroy(Polynomial *p){    LinkList h = p->head;    LinkList q = NULL;    while (h)    {        q = h->next;        free(h);        h = q;    }    return OK;}