链表实操(多项式的创建,加法,减法,求值)

一、链表结构定义:

#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
	float coef;       //系数 
	int expn;         //指数
	struct Lnode *next; 
}Lnode ,*Linklist;

对于多项式的运算,存在系数冲突(删除)和系数不冲突(插入)运算,所以使用链表最为方便。

并且,数据部分要定义一个系数和一个指数,将二者分开来记录。

二、多项式的创建

  与单链表的创建类似,不过相对来说复杂一点,对于多项式可优先采用尾插法。

代码如下:

//尾插法建立多项式单链表 
 Linklist Create(Linklist &L){
 	Linklist rear,s; 
 	L=(Linklist)malloc(sizeof(Lnode));     //申请头结点 
 	L->next=NULL;                          //初始链表置空 
 	rear=L;                                //尾插法的尾指针 
 	float c;   //取系数 
 	int e,num;
	for(int i=1;;i++){
		printf("请输入第%d项的系数:",i);
		scanf("%f",&c);
		printf("请输入第%d项的指数:",i);
		scanf("%d",&e); 
		if(c!=0){
		s=(Linklist)malloc(sizeof(Lnode));  //申请新结点 
		s->coef=c;                         //以下是尾插步骤 
		s->expn=e; 
		rear->next=s;
		rear=s;	
		}else{
			break;   //如果为0则跳出循环结束 
		}
	}
	rear->next=NULL;  //一定要将创建好的最后结点的后续置空,否则系统将误判 
	printf("创建成功!");
	return L;
 } 

运行结果:个人以输入0视为结束,大家可自定。

三、多项式的遍历

 思路:从单链表第一个元素开始,逐项读出系数和指数,按多项式的形式进行输出。

但是,此过程口头叙述有点麻烦。

上图:

代码如下:

//多项式的输出
 void Print(Linklist L){
 	Linklist p=L->next;
 	int flag=1;             //定义标志是为了在第一个项式前不加'+’号 
 	while(p){
 		if(p->coef>0&&flag!=1) {            //输出'+'的条件,除了第一项不用加其余都要加 
 			printf("+");
		 }
 		if(p->coef!=1&&p->coef!=-1){        //条件:系数不为1和-1 
 			printf("%g",p->coef);           //%g用来输出实数,自动选f格式或e格式
 			if(p->expn==1) putchar('X');    
 			else if(p->expn) printf("X^%d",p->expn);
		 }else {
		 	if(p->coef==1){          //条件:系数为1 
		 		if(!p->expn){        
				  putchar('1'); }
		 	    if(p->expn==1){     
				  putchar('X'); }	else{ printf("X^%d",p->expn); }
			}
		 	if(p->coef==-1){       //条件:系数为-1 
		 		if(!p->expn){      
		 			printf("-1");
				 }
				if(p->expn==1){     
					printf("-X");
				} 
				if(p->expn){       
					printf("X%d",p->expn);
				}
			 }
		 }
		 p=p->next;           //结点遍历 
		 flag++;              //标志随项数增加而增加 
	 }
	 printf("\n");
 } 

 运行结果在上面创建时已经出现过。

四、多项式相加:

思路:分别创建好两个多项式,在一个新的链表中保存二者的逐项相加。

相加思路:

 具体代码:

//多项式相加
  Linklist ADD(Linklist A,Linklist B){
  	Linklist C,a,b,c,head;
  	a=A->next;
  	b=B->next;
  	C=(Linklist)malloc(sizeof(Lnode));   //C来存放A与B相加 
  	head=C;
  	//当两个多项式都没有扫描结束时
	 while(a!=NULL&&b!=NULL){
	 	c=(Linklist)malloc(sizeof(Lnode));
	 	if(a->expn<b->expn){    //规则1 
	 		c->coef=a->coef;
	 		c->expn=a->expn;
	 		a=a->next;
		 }else
		if(a->expn>b->expn){   //规则2 
			c->coef=b->coef;
			c->expn=b->expn;
			b=b->next;
		}else
		if(a->expn==b->expn){   //规则3 
			c->coef=a->coef+b->coef;
			c->expn=a->expn;
			a=a->next;
			b=b->next;
		}
		if(c->coef!=0){        //规则4 
			c->next=head->next;
			head->next=c;
			head=c;
		}else{
			free(c);
		}
	} 
	while(a!=NULL){            //A还有剩余的项式,而B没有 
		c=(Linklist)malloc(sizeof(Lnode));
		c->coef=a->coef;
		c->expn=a->expn;
		a=a->next;
		c->next=head->next;
		head->next=c;
		head=c;
	}
	while(a!=NULL){          //B还有剩余的项式,而A没有
		c=(Linklist)malloc(sizeof(Lnode));
		c->coef=b->coef;
		c->expn=b->expn;
		b=b->next;
		c->next=head->next;
		head->next=c;
		head=c;
	}
	head->next=NULL;
	Print(C);
	return C; 
  } 

运行结果:   个人输入多项式均为 y=x+2x^2+3x^3,视觉方便。

 五、多项式相减:

 原理与相加类似。

代码:

 //多项式相减
   Linklist minus(Linklist A,Linklist B){
   	Linklist D,b,head;
   	b=B->next;    
   	while(b){      //把B求相反数 
   		b->coef=b->coef*(-1);
   		b=b->next;
	   }
	head=B;
	ADD(A,head);  //调用相加函数,等价于相减 
	return 0;
   }

运行结果:

 六、多项式求值:

思路:使用math.h中的pow()函数来求指数的幂次方,然后再用num加总。

注:pow(x,y)=x的y次方 ,pow函数原型是double型的.

代码:

//多项式求值
   int Get(Linklist A){
   	Linklist a;
   	a=A->next;
   	float n;
   	double num=0.0;            //pow函数原型为double 
   	printf("请输入X的值:");
	scanf("%f",&n);
	while(a!=NULL){
		num=num+pow(n,a->expn)*a->coef;   //num加总 
	    a=a->next;                     //指针后移 
	} 
	printf("多项式的值为:"); 
	printf("%f",num);
	return num; 
   } 

运行结果:

乘法,除法,以及求导目前还未涉及,往后会陆续补充。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

犀牛超人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值