多项式相加
来源:互联网 发布:货运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;}