#include<stdio.h>
#include<stdlib.h>
typedef struct LNode //结点类型
{
int index; //指数
int coe; //系数
struct LNode *next;
}LNode,*Link;
typedef struct //列表类型
{
Link head,tail; //头指针和尾指针
int len;
}LinkList;
int InitList(LinkList *L); //构建空表 成功返回1,失败返回0
int MakeNode(LinkList *L,int index, int coe); //创建结点并存入指数和系数 成功返回1,失败返回0
void Add(LinkList *LA,LinkList *LB,LinkList *LC); //”和多项式"没有重新生成,而是从A,B中摘取到C上
void print(LinkList *L); //用于打印链表
int main()
{
LinkList LA,LB,LC;
int m,index; //输入m个一元多项式
int coe;
InitList(&LA);
InitList(&LB);
InitList(&LC);
printf("输入表A有多少个数据!\n并输入数据的指数和系数\n");
scanf("%d",&m);
for (int i=0;i<m;++i)
{
printf("第%d个多多项式",i+1);
scanf("%d%d",&index,&coe);
MakeNode(&LA,index,coe);
}
printf("输入表B有多少个数据!\n并输入数据的指数和系数\n");
scanf("%d",&m);
for (int i=0;i<m;++i)
{
printf("第%d个多多项式",i+1);
scanf("%d%d",&index,&coe);
MakeNode(&LB,index,coe);
}
Add(&LA,&LB,&LC);
print(&LC);
return 0;
}
int InitList(LinkList *L)
{
int label; //用于标记
LNode *p=(LNode*)malloc(sizeof(LNode));
if (!L->head) label=0;
else
{
L->head=L->tail=p;
L->len=0;
label=1;
}
return label;
}
int MakeNode(LinkList *L,int index, int coe)
{
int label; //用于标记
LNode *p=(LNode*)malloc(sizeof(LNode));
if (!L->head) label=0;
else
{
L->tail->next = p; //把p插入未更新的尾结点后面
L->tail = p; //更新尾指针
p->index = index; //初始化数据
p->coe = coe;
L->len++; //更新计数器
label=1;
}
L->tail->next= NULL;
return label;
}
void Add(LinkList *LA,LinkList *LB,LinkList *LC)
{
Link pa,pb,pc;
Link qa,qb; //用于删去结点
pa = LA->head->next;
pb = LB->head->next;
pc = LC->head;
while (pa!=NULL && pb!=NULL) //进行比较,比较有三种情况,大于 小于 等于
{
if (pa->index < pb->index) //小于
{
pc->next = pa; //接在C表上
pc = pa; //更新pc
pa = pa->next; //pa后移
}
else if (pa->index > pb->index) //大于
{
pc->next = pb; //接在C表上
pc = pb; //更新pc
pb = pb->next; //pb后移
}
else //等于 分为两种情况 系数相加是否为零
{
if (pa->coe+pb->coe == 0)
{
pa = pa->next; //二者均后移
pb = pb->next;
}
else
{
pa->coe = pa->coe+pb->coe;//加给A表,释放B表
pc->next = pa;
pb = pb->next;
}
}
}
if ( pa!=NULL ) //为真则B表已经到尾了
{
pc->next = pa;
}
else //A表到尾
{
pc->next = pb;
}
}
void print(LinkList *L)
{
Link p=L->head->next;
while (p)
{
printf("%d,%d\n",p->index,p->coe);
p = p->next;
}
}
一元多项式的相加(链式实现)
最新推荐文章于 2022-10-25 21:29:29 发布