C 数据结构:多项式的加法,乘法,微分运算

链表实现

例如:多项式
A(x) =x + 2x3

链表中的数据域有两个成员:coef 存放多项式的系数;exp 存放指数

  • 多项式的数据结构
typedef struct PolyNode
{
	int coef;	//系数
	int exp;	//指数
	struct PolyNode * next;
}PolyNode,* PolyList;
  • 多项式加法实现:Add(PolyList l_a, PolyList l_b)
    例如:两个多项式
    a(x)=x2 + 2x3 和 b(x)=x
    算法思想: a和b的单项式指数作比较;a的指数>b的指数,a加入到和多项式,反之,将b加入和多项式;a的指数=b的指数,如果a和b的系数和为零,跳过此项,反之,将a和b单项式相加加入到和多项式。

  • 多项式乘法实现:Mcl(PolyList l_a, PolyList l_b)
    算法思想: 1. a的单项式乘b的每一项 2. 对获得的乘积多项式求和

  • 多项式微分实现:DCPolyList(PolyList L)
    算法思想: 1. 跳过多项式中的常数项 2. 每一项的系数乘于指数,同时指数减一

遇到问题

对多项式a和b的和进行微分操作,会改变多项式a的链表中的成员值(具体表现为多项式a的系数和指数发生改变)
将微分操作放在多项式乘积操作前,会导致多项式乘积出错,或者程序意外终止。
错误截图

解决过程

首先我想过是不是指针传递问题,导致多项式a的链表指针list_a被误传递给了微分方法,导致链表list_a的成员被修改。然而我仔细找了一遍任然没有发现直接对链表list_a进行更改的证据。
由于我不会使用VC++6.0进行调试,于是我就疯狂的在整个程序执行过程中涉及到list_a和其他链表指针的地方输出它们的地址(printf("%x",指针)),将所有的指针梳理了一遍。
指针表
指针表
在微分函数运行的过程中,我发现了其中的两个指针指向的地址竟然就是list_a中的地址,那就说明是后来的指向修改了表list_a
其中一次的运行指针地址

解决问题

查看了一下我的微分函数,修改之前,我直接对指针L的链表进行操作(包括删除),然后我发现在地址中指向了list_a的结点;修改之后,我重新建立一个链表来存储微分结果,对L只执行遍历操作,问题得到了解决。(至于为什么L会指向链表list_a中的结点,我也不太清楚,可以帮忙指出一下,这个问题可是卡了我好几天)
多项式微分运算

正确截图

正确的运行截图

顺序表实现

       顺序表结构体存储多项式,数组角标表示单项式指数,数组值存放单项式系数;相比较下通过顺序表对多项式进行操作更加简单,毕竟链表需要修改大量的指针。

  • 结构体如下:
typedef struct
{
	int elem[MAX_SIZE];
	int HighPower;
}PolyNode,* PolyList;
  • 多项式加法 PolyList AddPolyList(PolyList a, PolyList b)
  • 多项式乘法 PolyList MultPolyList(PolyList a, PolyList b)
    在乘法运算中,处理系数相同的单项式,顺序表中只需要将数组下角标相同的两个成员相加
  • 多项式微分 PolyList DiffPolyList(PolyList a)

遇到的问题

  • 乘法运算中的存放乘积的顺序表mult的elem数组未初始化,得到结果乱码

运算乱码
因为elem数组值没有初始化,但后面有加上了数组值。
初始化数组值

运行截图

顺序表实现多项式的运算

全部代码

链表实现

#include<stdio.h>
#include<stdlib.h>
typedef struct PolyNode
{
	int coef;	//系数
	int exp;	//指数
	struct PolyNode * next;
}PolyNode,* PolyList;

PolyList InitPolyList(PolyList L)
{
	///初始化链表
	L = (PolyList)malloc(sizeof(PolyNode));
	L->next = NULL;
	return L;
}

void CreatePolyList(PolyList L)
{
	///建立多项式
	PolyNode * node;
	int lceof, lexp;
	printf("请输入多项式的系数和指数(指数从小到大依次输入)\n");
	while(true)
	{
		scanf("%d%d",&lceof,&lexp);
		if(lceof == 0)		break;
		node = (PolyNode *)malloc(sizeof(PolyNode));
		node->next = NULL;
		node->coef = lceof;
		node->exp = lexp;
		L->next = node;
		L = L->next;
	}
	printf("创建成功!!\n\n");
}

void PrintPolyList(PolyList L)
{
	///打印多项式
	printf("====打印结果====\nA(x)=");
	while(L->next != NULL)
	{
		L = L->next;
		printf("%d",L->coef);
		if(L->exp != 0)		printf("x^%d",L->exp);
		if(L->next == NULL)		printf(";\n\n");
		else	printf("+");
	}
}

PolyList Add(PolyList l_a, PolyList l_b)
{
	///多项式相加
	PolyList L;
	L = InitPolyList(L);
	PolyList head = L;
	PolyNode *node;
	PolyList a, b;
	a = l_a->next;
	b = l_b->next;
	
	printf("执行多项式加法操作\n");
	while(a != NULL && b != NULL)
	{
		if(a->exp < b->exp)
		{
			//若多项式a的第一项指数小于多项式b第一项的指数,将第一项加入到和多项式
			node = (PolyNode*)malloc(sizeof(PolyNode));
			node->next = NULL;
			node->exp = a->exp;
			node->coef = a->coef;
			L->next = node;
			L = L->next;
			a = a->next;
		}
		else if(a->exp == b->exp)
		{
			if(a->coef + b->coef != 0)
			{
				//两个系数相加不为零才有意义
				node = (PolyNode*)malloc(sizeof(PolyNode));
				node->next = NULL;
				node->exp = a->exp;
				node->coef = a->coef + b->coef;
				L->next = node;
				L = L->next;
				a = a->next;
				b = b->next;
			}
		}
		else
		{
			node = (PolyNode*)malloc(sizeof(PolyNode));
			node->next = NULL;
			node->exp = b->exp;
			node->coef = b->coef;
			L->next = node;
			L = L->next;
			b = b->next;
		}
	}
	if(a == NULL || b == NULL)
	{
		while(b != NULL)
		{
			L->next = b;
			L = L->next;
			b = b->next;
		}
		while(a != NULL)
			{
			L->next = a;
			L = L->next;
			a = a->next;
		}
	}
	printf("多项式求和操作成功!!\n");
	return head;
}

PolyList Mcl(PolyList l_a, PolyList l_b)
{
	///多项式乘法
	PolyList mult;
	mult = InitPolyList(mult);
	PolyNode *node;
	PolyList ax[100];
	int i = 0;

	PolyList a, b;
	a = l_a->next;

	printf("执行多项式乘法操作\n");
	while(a != NULL)
	{
		b = l_b->next;
		PolyList L = (PolyList)malloc(sizeof(PolyNode));
		ax[i] = L;
		while(b != NULL)
		{
			//结点插入失败
			node = (PolyNode *)malloc(sizeof(PolyNode));
			node->next = NULL;
			node->coef = a->coef * b->coef;
			node->exp = a->exp + b->exp;
			L->next = node;
			L = L->next;
			b = b->next;
		}
		i++;
		a = a->next;
	}
	i--;
	PolyList m = ax[0];
	mult = ax[0];
	while(i > 0)
	{
		mult = Add(m, ax[i]);
		m = mult;
		i--;
	}
	return mult;
}

PolyList DCPolyList(PolyList L)
{
	///多项式微分运算
	PolyList head;
	head = (PolyList)malloc(sizeof(PolyNode));
	PolyList list = head;
	printf("多项式微分操作\n");
	while(L->next != NULL)
	{
		L = L->next;
		PolyNode * node;
		node = (PolyNode *)malloc(sizeof(PolyNode));
		node->next = NULL;
		if(L->exp == 0)
			continue;
		node->coef = L->coef * L->exp;
		node->exp = L->exp - 1;
		head->next = node;
		head = head->next;
		/*if(L->next->exp == 0)
		{
			//如果多项式的指数为零,则删除这一项
			PolyNode * node = L->next;
			L->next = L->next->next;
			free(node);
			node = NULL;
			continue;
		}
		else
		{
			L->next->coef = L->next->coef * L->next->exp;
			L->next->exp -= 1;
			L = L->next;
		}*/
	}
	printf("微分操作执行成功!!\n");
	return list;
}
int main()
{
	PolyList list_a, list_b;
	list_a = InitPolyList(list_a);
	list_b = InitPolyList(list_b);
	
	CreatePolyList(list_a);
	PrintPolyList(list_a);

	CreatePolyList(list_b);
	PrintPolyList(list_b);

	PolyList list_sum;	//多项式和
	list_sum = InitPolyList(list_sum);

	list_sum = Add(list_a, list_b);
	PrintPolyList(list_sum);

	PolyList list_dc;	//多项式微分
	list_dc = InitPolyList(list_dc);

	list_dc = DCPolyList(list_sum);
	PrintPolyList(list_dc);

	PolyList list_mult;	//多项式乘积
	list_mult = InitPolyList(list_mult);

	list_mult = Mcl(list_a, list_b);
	PrintPolyList(list_mult);

	return 0;
}

顺序表实现

#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
typedef struct
{
	int elem[MAX_SIZE];
	int HighPower;
}PolyNode,* PolyList;
PolyList CreatePolyList()
{
	///创建多项式
	PolyList P;
	P = (PolyList)malloc(sizeof(PolyNode));
	printf("请输入多项式系数:\n");
	for(int i = 0; i < MAX_SIZE; i++)
	{
		scanf("%d",&P->elem[i]);
		if(getchar() == '\n')
		{
			P->HighPower = i;
			printf("%d",P->HighPower);
			break;
		}
	}
	printf("创建成功!\n\n");
	return P;
}

void PrintPolyList(PolyList P)
{
	///打印多项式
	printf("打印结果:A(x)=");
	for(int i = 0; i <= P->HighPower; i++)
	{
		if(P->elem[i] == 0)	continue;
		if(i == 0)	printf("%d",P->elem[i]);
		else	printf("%dx^%d",P->elem[i],i);
		if(i == P->HighPower) break;
		printf("+");
	}
	printf(";\n");
	printf("打印成功!!\n\n");
}

PolyList AddPolyList(PolyList a, PolyList b)
{
	///多项式求和
	PolyList sum;
	int i = 0;
	sum = (PolyList)malloc(sizeof(PolyNode));
	while(i <= a->HighPower|| i<= b->HighPower)
	{
		sum->elem[i] = a->elem[i] + b->elem[i];
		if(a->HighPower > b->HighPower)
			sum->HighPower = a->HighPower;
		else
			sum->HighPower = b->HighPower;
		i++;
	}
	return sum;
}

PolyList MultPolyList(PolyList a, PolyList b)
{
	PolyList mult;
	mult = (PolyList)malloc(sizeof(PolyNode));
	int i = 0;
	mult->HighPower = a->HighPower + b->HighPower;
	while(i <= mult->HighPower)
	{
		mult->elem[i] = 0;
		i++;
	}
	i = 0;
	while(i <= a->HighPower)
	{
		int j = 0;
		while(j<= b->HighPower)
		{
			mult->elem[i+j] += a->elem[i] * b->elem[j];
			j++;
		}
		i++;
	}
	while(i-- >= 0)
	{
		if(mult->elem[i] == 0)
		{
			mult->HighPower = i;
			break;
		}
		i--;
	}
	printf("多项式乘积运算完成!!\n");
	return mult;
}

PolyList DiffPolyList(PolyList a)
{
	///多项式微分
	PolyList diff;
	diff = (PolyList)malloc(sizeof(PolyNode));
	int i = 0;
	while(i <= a->HighPower - 1)
	{
		printf("%d",a->elem[i+1]);
		diff->elem[i] = a->elem[i+1] * (i+1);
		i++;
	}
	diff->HighPower = i - 1;
	return diff;
}
int main()
{
	PolyList a, b, sum, mult, diff;

	//创建两个多项式
	a = CreatePolyList();
	printf("%d",a->HighPower);
	PrintPolyList(a);

	b = CreatePolyList();
	PrintPolyList(b);

	//求多项式和
	sum = AddPolyList(a, b);
	PrintPolyList(sum);

	//求多项式乘积
	mult = MultPolyList(a, b);
	PrintPolyList(mult);

	//求多项式乘积微分
	diff = DiffPolyList(mult);
	PrintPolyList(diff);
	return 0;
}
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
#include<stdio.h> #include<stdlib.h> // 定义多项式结构体 typedef struct Polynomial{ int coef; // 系数 int expn; // 指数 struct Polynomial *next; // 指向下一项的指针 }Polynomial; // 创建多项式 Polynomial* createPoly(){ Polynomial *head = (Polynomial*)malloc(sizeof(Polynomial)); // 头节点 head->next = NULL; Polynomial *p = head; // 指针p指向头节点 int n; // 项数 printf("请输入多项式项数:"); scanf("%d", &n); for(int i=0; i<n; i++){ Polynomial *node = (Polynomial*)malloc(sizeof(Polynomial)); // 新建节点 printf("请输入第%d项的系数和指数:", i+1); scanf("%d%d", &node->coef, &node->expn); node->next = NULL; p->next = node; // 将新节点插入到链表尾部 p = node; } return head; } // 显示多项式 void displayPoly(Polynomial *poly){ Polynomial *p = poly->next; // 指针p指向第一个节点 while(p){ printf("%dX^%d", p->coef, p->expn); p = p->next; if(p) printf("+"); } printf("\n"); } // 多项式相加 Polynomial* addPoly(Polynomial *poly1, Polynomial *poly2){ Polynomial *p1 = poly1->next; // 指针p1指向第一个节点 Polynomial *p2 = poly2->next; // 指针p2指向第一个节点 Polynomial *head = (Polynomial*)malloc(sizeof(Polynomial)); // 头节点 head->next = NULL; Polynomial *p = head; // 指针p指向头节点 while(p1 && p2){ if(p1->expn == p2->expn){ // 指数相等,系数相加 Polynomial *node = (Polynomial*)malloc(sizeof(Polynomial)); node->coef = p1->coef + p2->coef; node->expn = p1->expn; node->next = NULL; p->next = node; p = node; p1 = p1->next; p2 = p2->next; } else if(p1->expn > p2->expn){ // 第一个多项式指数大于第二个多项式指数 Polynomial *node = (Polynomial*)malloc(sizeof(Polynomial)); node->coef = p1->coef; node->expn = p1->expn; node->next = NULL; p->next = node; p = node; p1 = p1->next; } else{ // 第一个多项式指数小于第二个多项式指数 Polynomial *node = (Polynomial*)malloc(sizeof(Polynomial)); node->coef = p2->coef; node->expn = p2->expn; node->next = NULL; p->next = node; p = node; p2 = p2->next; } } while(p1){ // 第一个多项式还有剩余项 Polynomial *node = (Polynomial*)malloc(sizeof(Polynomial)); node->coef = p1->coef; node->expn = p1->expn; node->next = NULL; p->next = node; p = node; p1 = p1->next; } while(p2){ // 第二个多项式还有剩余项 Polynomial *node = (Polynomial*)malloc(sizeof(Polynomial)); node->coef = p2->coef; node->expn = p2->expn; node->next = NULL; p->next = node; p = node; p2 = p2->next; } return head; } int main(){ printf("请输入第一个多项式:\n"); Polynomial *poly1 = createPoly(); // 创建第一个多项式 printf("第一个多项式为:"); displayPoly(poly1); // 显示第一个多项式 printf("请输入第二个多项式:\n"); Polynomial *poly2 = createPoly(); // 创建第二个多项式 printf("第二个多项式为:"); displayPoly(poly2); // 显示第二个多项式 Polynomial *result = addPoly(poly1, poly2); // 两个多项式相加 printf("两个多项式相加后的结果为:"); displayPoly(result); // 显示相加后的结果 return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筷头哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值