C语言数据结构之一元多项式的求导

//一元多项式的求导
#include<stdio.h>
#include<malloc.h>//动态申请空间的函数的头文件
typedef struct node   //定义节点类型
{
	float coef;         //多项式的系数
    int expn;           //多项式的指数
    struct node * next; //结点指针域
}PLOYList;
void insert(PLOYList *head,PLOYList *input)   //查找位置插入新链节的函数,且让输入的多项式呈降序排列
{
    PLOYList *pre,*now;
    int signal=0;
    pre=head;
    if(pre->next==NULL) {pre->next=input;} //如果只有一个头结点,则把新结点直接连在后面
    else 
	{
		now=pre->next;//如果不是只有一个头结点,则设置now指针
        while(signal==0)
     {
	   if(input->expn < now->expn)
      {
		  if(now->next==NULL)
	     {
			 now->next=input;
             signal=1;
         }
          else
         {
             pre=now;
             now=pre->next;//始终让新输入的数的指数与最后一个结点中的数的指数比较,小于则插在其后面
         }
       }
       else if( input->expn > now->expn )
      {
		  input->next=now;
          pre->next=input;
          signal=1;
      }//若新结点中指数比最后一个结点即now中的指数大,则插入now之前
       else//若指数相等则需合并为一个结点,若相加后指数为0则释放该结点
      {
		  now->coef=now->coef+input->coef;
          signal=1;
          free(input);
          if(now->coef==0)
	     {
			 pre->next=now->next;
             free(now);
         }
      }//else
	} //while
	}//else
}//void

PLOYList *creat(char ch)   //输入多项式
{
   PLOYList *head,*input;
   float x;
   int y;
   head=(PLOYList *)malloc(sizeof(PLOYList));   //创建链表头
   head->next=NULL;
   scanf("%f %d",&x,&y);//实现用户输入的第一个项,包括其指数和系数
   while(x!=0)//当用户没有输入结束标志0时可一直输入多项式的项,且输入一个创建一个结点
  {
     input=(PLOYList *)malloc(sizeof(PLOYList));  //创建新链节
     input->coef=x;
     input->expn=y;
     input->next=NULL;
     insert(head,input);  //每输入一项就将其排序,是的链表中多项式呈降序排列
     scanf("%f %d",&x,&y);
  }
return head;
}
PLOYList *der(PLOYList *head)//多项式求导
{
	PLOYList *p;
	p = head -> next;
	while (p)
	{
		p -> coef = p -> coef * p -> expn;
		p -> expn = p -> expn--;
		p = p -> next;
	}
	return head;
}//将多项式的每项系数和指数相乘得到新的系数,指数减一得到新的指数即完成求导


void print(PLOYList *fun)  //输出多项式,fun指要输出的多项式链表的表头
{
    PLOYList *printing;
    int flag=0;
    printing=fun->next;
    if(fun->next==NULL)//若为空表,则无需输出
   {
      printf("0\n");
      return;
   }
    while(flag==0)
    {
        if(printing->coef>0&&fun->next!=printing)
        printf("+");
        if(printing->coef==1);
        else if(printing->coef==-1)
        printf("-");
        else
        printf("%f",printing->coef);
        if(printing->expn!=0) printf("x^%d",printing->expn);
        else if((printing->coef==1)||(printing->coef==-1))
        printf("1");
        if(printing->next==NULL)
        flag=1;
        else
        printing=printing->next;
     }
printf("\n");
}
void main()
{
	PLOYList *f;
		 printf(" 注:输入多项式格式为:系数1 指数1 系数2 指数2 …… ,并以0 0 结束:\n");
		  printf("请输入一个一元多项式:");
		  f = creat('f');
		  printf("这个多项式为:f(x)= ");
		  print(f);
          printf("求导结果为:F(x)=f'(x)= ");
		  f=der(f);
		  print(f);
          printf("\n\n");
          
}

posted @ 2015-09-23 22:39  Joe.Smith  阅读(1448)  评论(0编辑  收藏  举报