c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加

原创 2012年08月21日 19:35:05

//c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加

/*
主要函数思想:
初始化一元多项式A
初始化一元多项式B
初始化一元多项式C
给一元多项式A赋入数据
给一元多项式B赋入数据(指数升序)
当A的结点或者B的结点项的下一项不为空
{
    比较AB的指数
	{
	   定位当前结点A的指数,定位当前结点B的指数.
	   如果A的结点指数<B的结点指数(C的下一个结点为当前A的结点,A移动结点)
	   如果A的结点指数=B的结点指数(如果系数A+B=0,A,B结点都移动)
	   如果A的结点指数>B的结点指数(C的下一个结点为当前B的结点,B移动结点)
	}
}
当A的结点不为空
{
  c链接A接下来的结点
}
当B的结点不为空
{
  c链接B接下来的结点
}
输出
*/

//---------头文件----------

#include<stdio.h>
#include<stdlib.h>

//---------宏定义----------

#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//-----结构体和替换名------

typedef struct Node
{
	float coef;
	int expn;
	struct Node *next;
}Poly,*Polynomial;

//------函数-------

int InitPolynomial(Polynomial f);
int InputData(Polynomial f);
int Compare(int c1,int c2);
int JudgeCoefZero(float a1,float a2);
void OutPut(Polynomial f);

//-----主函数-----

void main()
{
	Poly A,B,C,*f1=&A,*f2=&B,*f3=&C;
	int d;
	InitPolynomial(f1);InitPolynomial(f2);InitPolynomial(f3);
	InputData(f1);InputData(f2);
	f1=f1->next;
	f2=f2->next;
	while(f1&&f2)
	{
		d=Compare(f1->expn,f2->expn);
		switch(d)
		{
		   case -1:f3->next=f1;f1=f1->next;f3=f3->next;break;
		   case 0:if(!JudgeCoefZero(f1->coef,f2->coef))
				  {
					  f1->coef+=f2->coef;
					  f3->next=f1;
					  f3=f3->next;
				  }
				  f1=f1->next;
				  f2=f2->next;
				  break;
		   case 1:f3->next=f2;f2=f2->next;f3=f3->next;break;
		}
	}
	if(f1)
	{
		f3->next=f1;
	}
	if(f2)
	{
		f3->next=f2;
	}
	OutPut(&C);
}

int InitPolynomial(Polynomial f)
{
	if(!(f=(Polynomial)malloc(sizeof(Poly))))
	{
		exit(OVERFLOW);
	}
	f->next=NULL;
	return TRUE;
}

int InputData(Polynomial f)
{
	Polynomial StartNode=f,Tempf=f,NewNode;
	int n;
	printf("输入多项式的项数:");
	do
	{
		scanf("%d",&n);
		if(n<0)
		{
			printf("输入错误!重新输入.\n");
		}
	}while(n<0);
	printf("按升序输入一元多项式的系数和指数:\n");
	for(;n>0;n--)
	{
		if(!(NewNode=(Polynomial)malloc(sizeof(Poly))))
	    {
			exit(OVERFLOW);
		}
		scanf("%f%d",&NewNode->coef,&NewNode->expn);
		Tempf->next=NewNode;
		NewNode->next=NULL;
		Tempf=NewNode;
	}
	f=StartNode;
	return TRUE;
}

int Compare(int c1,int c2)
{
	if(c1>c2)
	{
		return 1;
	}
	else if(c1==c2)
	{
		return 0;
	}
	else
	{
		return -1;
	}
}

int JudgeCoefZero(float a1,float a2)
{
	return 0==a1+a2?1:0;
}

void OutPut(Polynomial f)
{
	f=f->next;
	printf("f(x)=");
	while(f)
	{
		if(f->expn)
		{
			printf("%fx^%d",f->coef,f->expn);
		}
		else
		{
			printf("%f",f->coef);
		}

		f=f->next;
		if(f&&f->coef>0)
		{
			printf("+");
		}
	}
	getchar();
	getchar();
}


 

相关文章推荐

数据结构实验1(一元多项式的相加和相乘)

实验要求: 1.设计带表头的结点的单链表表示多项式类。 2.在该类上增加成员函数void PolyMul(Polynominal &r),并重载*运算符。 3.实现菜单驱动的main函数,测试多...
  • GKHack
  • GKHack
  • 2015年10月07日 19:48
  • 3890

算法:一元多项式的表示及相加(链表实现)-数据结构(4)

一、算法问题描述 为了计算多个一元多项式相加,参照书上P40的式子相加,需要建立在有序链表的基础上,跟merge的算法类似。链表的基本操作就不表述了。书P39-P43 二、需要用到的数据结构 1...

c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘

//c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘 /* 主要函数思想: 初始化一元多项式A 初始化一元多项式B 初始化一元多项式C 给一元多项式A赋入数据 给一元多项式B赋入数...

c语言版数据结构(奇迹冬瓜)-链表实战(1)A=AUB

//c语言版数据结构(奇迹冬瓜)-链表实战(1)A=AUB //题目:假设利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A∪B //思想: /* 主函数: 初始化集合A和集...

c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测

//c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测 /* 初始化栈 初始化标志位 循环标志位不为1 { 输入一个字符并判断是否为括号 如果是]})则出栈 { ...

c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>

//c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫 //题目:栈解迷宫 //---------头文件--------- #include #include //---------宏定义--...

c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值

//c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值 /* 这个算法难的不是思想,而是尽可能的解决输入格式的问题 这个程序还有两个问题没有解决可以实现输出负数,但是不能输入负数,一旦输入时括号不...

c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换<10进制到2,8,16进制>

//c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换 /* 初始化栈 输入要转换的进制并进行判断是否在制定进制内 输入要转换的整数并判断改整数是否大于零 循环当整数不为零的时候 { ...

c语言版数据结构(奇迹冬瓜)-数组和广义表(稀疏矩阵的转置算法一)

//稀疏矩阵 /* |0 12 9 0 0 0 0| |0 0 -3 0 0 15| |0 0 0 0 0 0 0|...

学习笔记------数据结构(C语言版)链表应用~一元多项式求和

//Polynomial.cpp #include"predefined.h" #include"Polynomial.h" #include"ExtenLinkedList.h" void Cr...
  • CYTCHAN
  • CYTCHAN
  • 2016年01月15日 19:27
  • 1208
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加
举报原因:
原因补充:

(最多只允许输入30个字)