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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 两个多项式的相加操作 C语言(链式存储结构) -> 正文阅读

[数据结构与算法]两个多项式的相加操作 C语言(链式存储结构)

内容:

? ? ? ?完成两个多项式的相加操作:已知有两个多项式P(x),Q(x),设计算法实现P(x)+Q(x)运算。而且对加法运算不重新开辟存储空间。要求用链式存储结构。

? ? ? ?例如:P(x)=5x^3+2x+1,Q(x)=3x^3+x^2-2x-3,其计算输出结果为:8x^3+1x^2-2.

相减操作,以上述为例,则其输出结果为:2x^3-x^2-4x-2

步骤:

1.问题分析和算法设计:

? ? ? 多项式加法:本题的需要求出两个多项式的和,因此需要先使用Init()来初始化一个空链表,再使用CreateFromTail()用来创建一个链表,在此程序中使用尾插法来创建链表。对于两个多项式的加法,使用Polyadd()用来实现两个多项式的相加算法;用Print()输出多项式。

? ? ? ?两个多项式相加算法的实现,首先是将两个多项式分别用链表进行存放。可以设置两个指针LA1和LB1分别从多项式P(x)和Q(x)的首结点移动,比较LA1和LB1所指结点的指数项,分下面三种情况进行处理:

(1)若LA1->exp<LB1->exp,则LA1所指结点为多项式中的一项,LA1指针在原来的基础上向后移动一个位置。

(2)若LA1->exp=LB1->exp,将对应项的系数相加,然后分两种情况处理:如果系数的和为0,则释放LA1和LB1所指向的结点:如果系数项的和不为0,则修改LA1所指向结点的系数域,释放LB1结点。

(3)若LA1->exp>LB1->exp,则LB1所指结点为多项式中的一项,LB1指针在原来的基础上向后移动一个位置。

2.概要设计:

? ? ? ? ? ? ? ? ? ? ? ? 函数? ? ? ? ? ? ? ? ? ? ? ? ?作用
? ? ? ? ? ? ? ? ? ? ? ? Init()初始化链表
? ? ? ? ? ? ? ? ?CreateFromTail()? ? ? ? ? ? ? ? ? ? ? 创建链表
? ? ? ? ? ? ? ? ? ?Ployadd()? ? ? ? ? ? ? ? 实现多项式加法
? ? ? ? ? ? ? ? ? ? ? ?Print()? ? ? ? ? ? ? ? ? 输出多项式

3.程序运行流程图:

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图1? 程序流程图

4.源代码(vc++6.0调试通过)

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct poly
{
	int exp;           /*指数幂*/
	int coef;          /*系数*/
	struct poly *next;  /*指针域*/
 }PNode,*PLinklist;
 int Init(PLinklist *head)   /*链表初始化*/
 {
 	*head=(PLinklist)malloc(sizeof(PNode));
 	if(*head)
 	{
 		(*head)->next=NULL;
 		return 1;
	 }
	 else
	 	return 0;
 }
int CreateFromTail(PLinklist *head)  /*尾插法创建链表*/
{
 	PNode *pTemp,*pHead;
 	int c;               /*存放系数*/
 	int exp;             /*存放指针*/
	int i=1;             /*计数器提示用户输入第几项*/ 
	pHead=*head;
	scanf("%d,%d",&c,&exp);
	while(c!=0)          /*系数为0表示结束输入*/
	{
		pTemp=(PLinklist)malloc(sizeof(PNode));
		if(pTemp)
		{
			pTemp->exp=exp;  /*接收指数*/
			pTemp->coef=c;    /*接收系数*/
			pTemp->next=NULL;
			pHead->next=pTemp;
			pHead=pTemp;
			scanf("%d,%d",&c,&exp);
		}
		else
			return 0;
	 } 
	 return 1;
  } 
  void Polyadd(PLinklist LA,PLinklist LB)/*两个多项式相加,该方法两个表都是按指数顺序增长*/
  {   /*对指数进行对比分三类情况;A<B时将A链到LA后,A==B时比较系数,A>B时将B链到表中*/
  		PNode *LA1=LA->next;    /*用于在LA中移动*/
  		PNode *LB1=LB->next;     /*用于在LB中移动*/
  		/*LA与1B在充当LA1和LB1的前驱*/
  		PNode *temp;          /*保存要删除的结点*/
		  int sum=0;      /*存放系数的和*/
		  while(LA1&&LB1)
		  {
		  	if(LA1->exp<LB1->exp)
		  	{
		  		LA->next=LA1;     /*LA的当前结点可能时LB1或LA1*/
		  		LA=LA->next;
		  		LA1=LA1->next;
			  }
			  else if(LA1->exp==LB1->exp)  /*指数相等系数相加*/ 
			  {
			  	sum=LA1->coef+LB1->coef;
				  if(sum)   /*系数不为0,结果存入LA1中,同时删除结点LB1*/
				  {
				  	LA1->coef=sum;
					LA->next=LA1;
		            LA=LA->next;
		            LA1=LA1=LA1->next;
		            temp=LB1;
		            LB1=LB1->next;
		            free(temp);
				   } 
				   else     /*系数为0时的情况下删除两个结点*/
				   {
				   	temp=LA1;
					LA1=LA1->next;
					free(temp);
					temp=LB1;
					LB1=LB1->next;
					free(temp); 
			  }
		   } 
		   else
		   {
		   	LA->next=LB1;
			LA=LA->next;
			LB1=LB1->next; 
		   }
		   
  }
  if(LA1)  /*将剩余结点链入链表*/
  		LA->next=LA1;
	else
		LA->next=LB1;
}
  void Print(PLinklist head) /*输出多项式*/
{
	head=head->next;
	while(head)
	{
		if(head->exp)
				printf("%dx^%d",head->coef,head->exp);
			else
				printf("%d",head->coef);
			if(head->next)
				printf("+");
			else
				break;
			head=head->next;
	}
}
void main()
{
	PLinklist LA;  /*多项式列表LA*/
	PLinklist LB;  /*多项式列表LB*/
	Init(&LA);
	Init(&LB);
	printf("输入第一个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
	CreateFromTail(&LA);
	printf("输入第二个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
	CreateFromTail(&LB);
	Print(LA);
	printf("\n");
	Print(LB);
	printf("\n");
	Polyadd(LA,LB);
	printf("两个多项式相加的结果:\n");
	Print(LA);    /*相加的结果保存在LA中,打印LA*/
	printf("\n"); 
}

?5.测试结果:

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图2? 测试结果图

?以上为使用链式存储进行多项式加法的全部分析过程和操作。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:08:14  更:2021-10-24 15:08:33 
 
开发: 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 8:42:58-

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