/*
说明:共有三个文件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 0
typedef 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;
}
多项式相加
最新推荐文章于 2022-03-04 10:31:39 发布