一元多项式链表实现

原创 2015年11月18日 22:09:53

链表模拟多项式相加,相乘,相减。。。

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

typedef struct tag_node{
	int p;
	int e;
	struct tag_node *next;
}node;

//链表创建,返回头结点指针
node* CreatPolyn(int m)
{
	node *list = (node*)malloc(sizeof(node));
	if (list==NULL)
	{
		printf("Memory Allocate Error!\n");
		exit(-1);
	}

	list->e =-1;
	list->p = -1;
	list->next = NULL;
	
	int i, a, b;
	for (i=0; i<m; i++)
	{
		scanf("%d%d", &a, &b);
		node *tmp = (node*)malloc(sizeof(node));	
		if (tmp==NULL)
		{
			printf("Memory allocate Error!\n");
			exit(-1);
		}
		tmp->p = a;
		tmp->e = b;
		tmp->next = list->next;
		list->next = tmp;
	}
	return list;
}

//销毁链表
void DestroyPolyn(node *list)
{
	node *tmp, *pos = list;
	while (pos)
	{
		tmp = pos;
		pos = pos->next;
		free(tmp);
	}
}

//打印链表
void PrintPolyn(node *list)
{
	printf("\n");
	printf("f(x) = ");
	node *pos = list->next;
	int flag = 0;
	while (pos)
	{
		if (pos->p!=0)
		{
			if (flag) printf("%+dX%d", pos->p, pos->e);
			else
				printf("%dX%d", pos->p, pos->e);
			flag = 1;
		}	
		pos = pos->next;
	}
	printf("\n\n");
}

//链表排序
void SortPolyn(node *list)
{
    node *ha = (node *)malloc(sizeof(node));
    if (ha==NULL)
	{
		printf("Memory Allocate Error!\n");
		exit(-1);
	}
    ha->next = NULL;

    node *pos = list->next;
    while (pos)
    {
        node *pa = ha;
        while ((pa->next!=NULL) && (pa->next->e)>(pos->e))
        {
            pa = pa->next;
        }
		if ((pa->next!=NULL) && pa->next->e==pos->e)
		{
			pa->next->p = pos->p + pa->next->p;
			list->next = pos->next;
			free(pos);
		}
		else{
			list->next = pos->next;
			pos->next = pa->next;
			pa->next = pos;
		}
        pos = list->next;
    }
    list->next = ha->next;
    ha->next = NULL;
    free(ha);
}

//链表相加,结果为pa并销毁pb(忘记pb会销毁导致乘法调试很久)
void AddPolyn(node *pa, node *pb)
{
	node *tmp, *pre_a;
	node *hb = pb;
	pre_a = pa; 
	pa = pa->next; 
	pb = pb->next;

	while (pa && pb)
	{
		if (pa->e > pb->e)
		{
			pre_a = pa;
			pa = pa->next;
		}
		else if (pa->e == pb->e)
		{
			pa->p = pa->p+pb->p;
			pre_a = pa;
			tmp = pb;
			pb = pb->next;
			pa = pa->next;
			free(tmp);
		}
		else
		{
			tmp = pb->next;
			pb->next = pa;
			pre_a->next = pb;
			pre_a = pb;
			pb = tmp;		
		}
	}

	if (pb)
	{
		pre_a->next = pb;
	}

	free(hb);
}

//链表相减, 并把结果保存在pa,pb销毁
void SubtractPolyn(node *pa, node *pb)
{
	node *tmp, *pre_a;
	node *hb = pb;
	pre_a = pa; 
	pa = pa->next; 
	pb = pb->next;

	while (pa && pb)
	{
		if (pa->e > pb->e)
		{
			pre_a = pa;
			pa = pa->next;
		}
		else if (pa->e == pb->e)
		{
			pa->p = pa->p-pb->p;
			pre_a = pa;
			tmp = pb;
			pb = pb->next;
			pa = pa->next;
			free(tmp);
		}
		else
		{
			pb->p = -(pb->p);
			tmp = pb->next;
			pb->next = pa;
			pre_a->next = pb;
			pre_a = pb;
			pb = tmp;		
		}
	}

	if (pb)
	{
		pre_a->next = pb;
	}

	free(hb);
}

//链表相乘
void MultiplyPolyn(node *pa, node *pb)
{
	node *ha = pa, *hb = pb;
	pa = pa->next;
	pb = pb->next;
	
	node *p_sum, *p_add, *tmp, *p1, *p2, *pos;

	p_sum = (node *)malloc(sizeof(node));
	p_sum->next = NULL;

	for (p1=pa; p1!=NULL; p1=p1->next)
	{
		p_add = (node *)malloc(sizeof(node));
		p_add->next = NULL;
		pos = p_add;

		for (p2=pb; p2!=NULL; p2=p2->next)
		{	
			tmp = (node *)malloc(sizeof(node));
			tmp->p = p1->p * p2->p;
			tmp->e = p1->e + p2->e;
			tmp->next = NULL;
			pos->next = tmp;
			pos = pos->next;
		}

		AddPolyn(p_sum, p_add);
	}

	DestroyPolyn(ha->next);
	DestroyPolyn(hb);
	ha->next = p_sum->next;
}

int main(void)
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
	node *list_a, *list_b;
	int m, n;
	printf("输入m, n(m项a表,n项b表):\n");
	
	while (scanf("%d%d", &m, &n)!=EOF)
	{
		printf("输入%d项a表(系数+空格+指数):\n", m);
		list_a = CreatPolyn(m);
		
		printf("输入%d项b表(系数+空格+指数):\n", n);
		list_b = CreatPolyn(n);
		
		SortPolyn(list_a);
		SortPolyn(list_b);

		printf("输入命令:\n");
		printf("1.相加\n2.相减\n3.相乘\n");
		int com;
		scanf("%d", &com);
		printf("a表: ");
		PrintPolyn(list_a);
		printf("b表: ");
		PrintPolyn(list_b);
		switch (com)
		{
		case 1: AddPolyn(list_a, list_b);break;
		case 2: SubtractPolyn(list_a, list_b);break;
		case 3: MultiplyPolyn(list_a, list_b);break;
		}
		printf("结果: ");
		PrintPolyn(list_a);
		printf("输入m, n(m项a表,n项b表):\n");
		DestroyPolyn(list_a);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

用链表实现一元多项式的加法运算

#include using namespace std; struct Node { int coef; int exp; Node * next; Node(){coef=0;exp=0;...
  • fightingyxy
  • fightingyxy
  • 2016年02月26日 19:13
  • 2767

用链表实现一元多项式的加、减、乘、求导运算

在数据结构线性表的链表学习中有一个很有趣的题目:计算两个多项式的加、减、乘和多项式的导数。   题目不难,将多项式的系数和指数存进链表,然后进行相应操作即可。   一、加法:     1、判断指...
  • Jung_zhang
  • Jung_zhang
  • 2015年09月09日 15:27
  • 3273

PAT 一元多项式的乘法与加法运算(链表 c++版)

题目按照指数递减的顺序给出两个一元多项式,输出两个多项式的乘积,还有 和 ,按照指数递减的顺序。 用链表实现一元多项式的乘法与加法运算。 首先来看加法运算 多项式 poly1   x^4 +...
  • chaiwenjun000
  • chaiwenjun000
  • 2015年09月09日 22:45
  • 3432

C语言:用链表实现一元多项式的加法

/* 一元多多项式的加法 1.先创建链表,存储多项式 2.输出多项式 3.两个多项式相加 4.输出多项式 */ # include # include typedef struct ...
  • wjb214149306
  • wjb214149306
  • 2015年08月01日 17:05
  • 4545

【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)

所实现的一元多项式的结构如下图所示: 若只对多项式进行“求值”等不改变多项式系数和指数的运算,采用类似顺序表的顺序存储结构即可,否则应采用链式存储结构,本文因为要进行一元多项式的加法,加法,乘...
  • ZongYinHu
  • ZongYinHu
  • 2015年08月26日 20:32
  • 1800

Java链表练习实现一元多项式的加法

链表的实现在之前写过了,就不再写了 将链表的数据域赋值为多项式结点类 多项式结点类: package polynomialOfOneIndeterminate; public class Pol...
  • dly215011
  • dly215011
  • 2016年10月21日 22:56
  • 1087

java数据结构之单链表应用之一元多项式求和

利用java中单链表进行一元多项式求和,下面直接看案例分析: package LinkedList; import LinkedList.Elem.Node; public class LinkedA...
  • linzhiqiang0316
  • linzhiqiang0316
  • 2016年06月01日 22:36
  • 1785

单链表模拟一元多项式加减乘运算

第一个多项式有n项,第二个多项式有m项。以下均为最坏的情况。 操作 时间复杂度(T(n)) 空间复杂度(S(n)) 判断是否为空 O(...
  • gaoxiangnumber1
  • gaoxiangnumber1
  • 2015年03月28日 22:30
  • 861

一元多项式相加的算法和C++实现

利用顺序表的链式存储实现一元多项式的加法
  • lfeng_coding
  • lfeng_coding
  • 2015年08月13日 15:53
  • 5024

7-1(链表) 一元多项式的乘法与加法运算(20 point(s))

既然说让用链表做,那就用链表做╭(╯^╰)╮ 加法是归并算法 乘法是第一个式子的每一项和第二个的整串相加 挺恶心的代码如下: #include #includ...
  • h201601060805
  • h201601060805
  • 2017年11月28日 20:59
  • 57
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一元多项式链表实现
举报原因:
原因补充:

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