IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 链表实操(多项式的创建,加法,减法,求值) -> 正文阅读

[数据结构与算法]链表实操(多项式的创建,加法,减法,求值)

一、链表结构定义:

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

运行结果:

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 14:03:51  更:2022-02-06 14:03:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:47:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码