包括对链表的冒泡排序,归并排序,链表的释放
#include "stdio.h"
typedef struct Elem
{
double coeff;
double exp;
}Pair;
typedef struct poly
{
Pair data;
struct poly *next;
}*pPolyList,PolyList;
//比较两个数的大小,按结果返回
int cmp(double a,double b)
{
if(a > b )
return 1;
else if(a==b)
return 0;
return -1;
}
//初始化多项式链表,按组输入,直到输入的为两个 0 0 表示链接结束
void Init_Poly( pPolyList* ha)
{
double coeff;
double exp;
pPolyList pa;
coeff=0;
exp=0;
(*ha)=(pPolyList)malloc( sizeof(struct poly) );
memset(*ha,0,sizeof(PolyList));
(*ha)->next=NULL;
while(1)
{
scanf("%lf %lf",&coeff,&exp);
if(coeff ==0.0 && exp==0.0)
break;
pa=(pPolyList)malloc(sizeof(struct poly));
(pa->data).coeff=coeff;
(pa->data).exp = exp;
pa->next=(*ha)->next;
(*ha)->next=pa;
}
}
//打印多项式链表
void Print_List(pPolyList ha)
{
pPolyList pa;
pa=ha;
if(!ha || !ha->next )
return;
if(ha->data.coeff==0.0)
pa=ha->next;
printf(" \n");
while(pa)
{
printf("%0.2lfX%0.2lf ",pa->data.coeff,pa->data.exp);
pa=pa->next;
}
}
//释放多项式链表
void FreeList(pPolyList* ha)
{
pPolyList pa,t;
pa=*ha;
if(!pa)
return;
t=pa;
do
{
t=pa;
pa=pa->next;
free(t);
}while(pa);
*ha=NULL;
t=NULL;
}
//将两个多项式链表(已经排序),归并排序
void MergeList(pPolyList ha,pPolyList hb,pPolyList* hc)
{
pPolyList pa,pb,pc;
*hc=(pPolyList)malloc(sizeof(PolyList));
memset((*hc),0,sizeof(PolyList));
pa=ha->next;
pb=hb->next;
pc=*hc;
while(pa && pb)
{
if( pa->data.exp < pb->data.exp )
{
pc->next=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pb=pb->next;
}
pc=pc->next;
}
pc->next=pa ? pa:pb;
}
//将多项式链表按照指数的大小排序
void Sort_List(pPolyList ha)
{
pPolyList t,p,middle;
middle=NULL;
p=ha;
if(!ha || !ha->next)
return;
while(ha->next->next != middle)
{
t=ha;
p=t->next;
while(1)
{
if(t->next->data.exp > p->next->data.exp )
{
t->next=p->next;
p->next=t->next->next;
t->next->next=p;
}
else
{
p=p->next;
}
t=t->next;
if( (p->next) == middle )
{
middle=p;
break;
}
}
}
}
//两多项式相加,
void Add_Polynomial(pPolyList ha,pPolyList hb)
{
pPolyList pa,pb,qa,qb,t;
int flag;
double sum;
pa=ha; //pa为得到的相加之后的链表的游标
pb=hb;
qa=ha->next;
qb=hb->next;
while( qa && qb )//开始的时候qa,qb分别指向ha,hb的两个链表的第一个数据元素,
{
//比较两个系数的大小,进行不同的操作
switch( cmp(qa->data.exp,qb->data.exp) )
{
case -1:
pa->next=qa;
qa=qa->next;
pa=pa->next;
break;
case 0:
sum=qa->data.coeff+qb->data.coeff;
if( 0.0 != sum)
{
pa->next=qa;
pa->next->data.coeff=sum;
qa=qa->next;
pa=pa->next;
//系数相同,将系数放到qa上,删除当前qb节点
t=qb->next;
free(qb);
qb=t;
}
else //如果两个指数相同,且系数加起来为0,那么就的删除两个节点
{
t=qa->next;
free(qa);
qa=t;
t=qb->next;
free(qb);
qb=t;
}
break;
case 1:
pa->next=qb;
qb=qb->next;
pa=pa->next;
break;
}//switch
}//while
pa->next=qb?qb:NULL;
}
void main()
{
pPolyList hc=NULL;
pPolyList ha=NULL;
pPolyList hb=NULL;
Init_Poly(&ha); //初始化两个链表
Init_Poly(&hb);
Print_List(ha);
Print_List(hb);
Sort_List(ha); //对两个链表排序
Sort_List(hb);
Print_List(ha); //打印排序后的两个多项式链表
Print_List(hb);
//MergeList(ha,hb,&hc); //对两个
Add_Polynomial(ha,hb);
Print_List(ha);
FreeList(&ha);
}