一元多项式链表实现

原创 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;
}


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

相关文章推荐

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

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

数据结构:C++链表类及一元多项式的实现时遇到的困难

书上要求一个链表类,一个结点类,不会写。 在别人的博客上看到有四种方式: 复合类:在Node类中定义友元的方式,使List类可以访问结点的私有成员。 嵌套类:在List内部定义Node...

java单链表实现一元多项式加法和乘法运算

设有一个一元多项式  f(x)=∑aixi  ,我们要用一个单链表将它表示出来,并实现它的加和乘运算。多项式的每一项放在一个结点中,每个结点中放两个信息,即每一项的系数和幂。在这里我们用有头结点的链表...

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

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

(链表实现)写出两个一元多项式相加的算法

/*实验2 3. 试写出两个一元多项式相加的算法。 用链表来存储一元多项式,并且要在程序中验证其功能实现。 此题的源程序保存为2_e1.cpp */ #include using namespace ...

Polynomial 一元多项式的表示及相加 (线性链表实现 严蔚敏版)

1、贴代码: #include #include using namespace std; struct Node { double coef; int expn; Node *next...

两个一元多项式相乘,数组与链表实现

/*一元多项式求乘积*/#include#include#includevoid init_num(int x[],int y[]){ /* int i; srand( (unsigned)time(...

用链表实现一元稀疏多项式的相加

一元多项式一定要包含系数项和指数项的描述,对一元多项式的基本运算,可应用两个有序链表合并的思想进行。

一元多项式求和算法(单链表实现)

/* 单链表的应用举例; 采用单链表存储,则每一个非零项对应单链表中的一个节点, 且单链表应按指数递增序列排列。为了节省空间只存储非零项。 其中: eof为系数域,存放非零项的系数 exp...

两个一元多项式相加(链表 || 顺序表实现)

顺序表实现: #include #include #include #include #include using namespace std; #define maxsize 1000 s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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