多项式相乘(链表实现)

来源:互联网 发布:2016网络春晚 编辑:程序博客网 时间:2024/04/30 03:46

直接上代码,一个晚上的成果

/******************************************************************多项式乘法链表实现*******************************************************************************/#define LIST_OK 1#define LIST_FAIL 0typedef struct node{   int coef;   //系数   int power;  //次数   struct node *next;}list;/*****链表初始化,实际就是创建一个头结点(不存储数值)****/int init_list(list **p){      if( NULL!=*p )  //传递过来一个空指针    {          printf("链表初始化失败!\n");          return LIST_FAIL;      }      *p=(list*)malloc( sizeof(list) );      if( NULL==*p )      {          printf("分配内存出错!\n");          return LIST_FAIL;      }      (*p)->next=NULL;     //关键的一句      printf("链表初始化完毕!\n");     return LIST_OK;}  /*********输入(添加)一个结点**************/int insert_node(list *p,list *node){    if( NULL==p )      {          printf("链表还没有初始化,无法插入节点!\n");          return LIST_ERROR;      }      while( NULL!=p->next )      {          p=p->next;      }      p->next=(List*)malloc(sizeof(List));      if( NULL==p )      {          printf("分配内存出错!\n");          return LIST_FAIL;      }    p=p->next;    p=(list*)malloc( sizeof(list) );    p->coef=node->coef;    p->power=node->power;    p->next=NULL;    printf("添加节点成功!\n");     return LIST_OK; }  /*************降幂排序*****************/void sort_list(list **head){    list *p;    list *q;    int a,b;    for(p=head->next;p->next!=NULL;p=p->next){        //同冒泡排序        for(q=head->next;q->next!=NULL;q=q->next)           {               if(q->power<q->next->power){               a=q->power;               b=q->coef;               q->coef=q->next->coef;               q->power=q->next->power;               q->next->coef=a;               q->next->power=b;               }            }     }}/***********合并同类项*****************//***********合并即free*****************/void union_poly(list *head){    list *p;    list *q;    list *last;    list *tmp;    for(p=head->next;p->next!=NULL;p=p->next){         last=p;        for(q=p->next;q!=NULL; ){             if(q->power==p->power){                p->power+=q->power;                                tmp=q->next;                free(q);                last->next=tmp;                q=tmp;           //q指针向后推移指向下一结点            }            else{                last=q;                q=q->next;            }        }     }}                /*******dest和src分别是两个待乘的多项式********/int mul_poly(list **dest,list **src){    list data;    list *pNew=NULL;    init_list(&pNew);      //链表初始化,实际就是创建一个头结点    list *head1=*dest;    list *head2=*src;    while((*dest=(*dest)->next)!=NULL){         while((*src=*src->next)!=NULL){             data.coef=(*dest)->coef * (*src)->coef;             data.power=(*dest)->power + (*src)->power;             data.next=NULL;             insert_node(pNew,&data);         }           *src=head2;     }           sort_list(pNew);     //次数降幂排序,并合并同类项     union_poly(pNew);          *dest=pNew;          return LIST_OK;}

0 0
原创粉丝点击