#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
typedef struct
{
float coe;
int exp;
}term;
typedef struct LNode
{
term date;
struct LNode *next;
}*LinkList;
//
/**** 比 较 函 数 **************************************/
int compare(term e1,term e)
{
if(e1.exp==e.exp)
return 0;
else
return (e1.exp-e.exp)/abs(e1.exp-e.exp);
}
/**** 初 始 化 **************************************/
int InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)
return 0;
L->next=NULL;
return 1;
}
/**** 确 定 位 置 **************************************/
int LocateList(LinkList L,term e,LinkList &p,int (*compare)(term,term))
{
int k;
LinkList q;
q=L->next;
p=L;
while(q)
{
k=compare(q->date,e);
if(k==0) // 合并
{
p=q;
return 0;
}
else if(k==1)
{
q=q->next;
p=p->next;
}
else
return -1; // 要插入
}
return 1; // 加在最后
}
/**** 获 取 前 驱 **************************************/
void PriorList(LinkList L,LinkList p,LinkList &q)
{
q=L;
while(q->next!=p)
q=q->next;
}
/**** 创 建 链 表 **************************************/
int CreateList(LinkList &L,int m)
{
LinkList p,s,q;
term e;
int i,k;
if(InitList(L)) //初始化
printf("请输入%d组数据:\n",m);
loop:
for(i=0;i<m;i++)
{
scanf("%f%d",&e.coe,&e.exp);
if(0.0==e.coe)
{
printf("系数不能为0\n请重新输入: ");
goto loop;
}
k=LocateList(L,e,p,compare); // p带回e在L中的位置
if(1==k) // 加在结尾
{
s=(LinkList)malloc(sizeof(LNode));
s->date=e;
s->next=NULL;
p->next=s;
p=s;
}
else if(-1==k) // 插入
{
s=(LinkList)malloc(sizeof(LNode));
s->date=e;
s->next=p->next;
p->next=s;
}
else
{
p->date.coe+=e.coe; //合并
if(0==p->date.coe)
{
PriorList(L,p,q);
q->next=p->next;
free(p);
p=q->next;
}
}
}
return 1;
}
/**** 输 出 链 表 **************************************/
void PrintList(LinkList L)
{
printf("****************************************************************************\n");
if(!L->next)
{
printf("0\n");
return ;
}
LinkList q;
q=L->next;
while(q->next)
{
printf("%.2f X^ %d + ",q->date.coe,q->date.exp);
q=q->next;
}
printf("%.2f x^ %d\n",q->date.coe,q->date.exp);
printf("****************************************************************************\n");
}
/**** 加 法 **************************************/
void AddPolyn(LinkList &L1,LinkList &L2)
{
int k;
LinkList p1,p2,q1,q2;
p1=L1; // p2 的前驱
p2=L1->next; // 当前元素
q1=L2; // q2 的前驱
q2=L2->next; // 当前元素
while(p2 && q2)
{
k=compare(p2->date,q2->date);
switch(k)
{
case -1:
q1->next=q2->next;
p1->next=q2;
q2->next=p2;
p1=q2;
q2=q1->next;
break;
case 0:
p2->date.coe+=q2->date.coe;
if(0==p2->date.coe)
{
p1->next=p2->next;
free(p2);
p2=p1->next;
}
q1->next=q2->next;
free(q2);
q2=q1->next;
break;
case 1:
p1=p2;
p2=p2->next;
break;
}
}
if(!p2)
p1->next=q2;
free(L2);
}
/**** 乘 法 **************************************/
void MutiplyPolyn(LinkList L1,LinkList L2,LinkList &L)
{
LinkList p1,p2,p,s;
term e;
int k;
p1=L1->next;
p2=L2->next;
while(p1)
{
while(p2)
{
e.exp=p1->date.exp+p2->date.exp;
e.coe=p1->date.coe * p2->date.coe;
k=LocateList(L,e,p,compare); // p带回e在L中的位置的前驱
if(1==k) // 加在结尾
{
s=(LinkList)malloc(sizeof(LNode));
s->date=e;
s->next=NULL;
p->next=s;
p=s;
}
else if(-1==k) // 插入
{
s=(LinkList)malloc(sizeof(LNode));
s->date=e;
s->next=p->next;
p->next=s;
}
else
p->date.coe+=e.coe; //合并
p2=p2->next;
}
p1=p1->next;
p2=L2->next;
}
}
/**** 销 毁 链 表 **************************************/
void DestroyList(LinkList &L)
{
LinkList p,q;
p=L;
while(p)
{
q=p;
p=p->next;
free(q);
}
}
int main()
{
int m,S;
LinkList L,L1,L2;
system("CLS"); //清屏函数
printf("输入多项式的项数: "); // 创建
scanf("%d",&m);
CreateList(L1,m);
printf("输入多项式的项数: ");
scanf("%d",&m);
CreateList(L2,m);
printf("\n你输入多项式为:\n\n"); // 显示
PrintList(L1);
printf("\n");
PrintList(L2);
loop1:
printf("\n\n\t1.相加\t\t2.相乘\t\t3.重新输入\t\t4.退出\n\n\t\t请选择你的操作: ");
scanf("%d",&S); // 选择操作
while(S<1 || S>4)
{
printf("\t\t输入操作不合法!\n\t\t请重新输入:");
scanf("%d",&S);
}
switch(S)
{
case 1:
AddPolyn(L1,L2);
printf("相加的结果为:\n");
PrintList(L1);
printf("\n\t\t按1重新输入\t\t其他数字键退出");
scanf("%d",&S);
if(1==S)
{
DestroyList(L1);
main();
}
else
break;
case 2:
InitList(L);
MutiplyPolyn(L1,L2,L);
printf("相乘结果为:\n");
PrintList(L);
goto loop1;
case 3:
DestroyList(L1);
DestroyList(L2);
if(L)
DestroyList(L);
main();
case 4:
break;
}
}
河南理工大学数据结构期末上机考试参考代码
最新推荐文章于 2023-02-09 12:29:16 发布