数据结构:多项式链表的操作

本文探讨了如何对多项式链表进行冒泡排序和归并排序,同时详细阐述了链表的释放过程。
摘要由CSDN通过智能技术生成

 包括对链表的冒泡排序,归并排序,链表的释放

#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);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值