多项式相加

本文介绍了一种使用顺序表实现的多项式加法算法。通过定义结构体存储多项式的每一项,并利用顺序表进行组织,实现了两个多项式的输入、相加及输出功能。算法能够处理不同长度的多项式,通过比较指数大小决定相加或插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

设计算法用顺序表实现两个多项式相加。

【数据描述】

定义一个结构体来存储每一项

typedefstruct one {

intdata;

intindex;

}enode;

定义一个顺序表来存储多项式

typedefstruct qList {


enode*data;

structqList *next;

}L;

【算法描述】

输入多项式

voidinput(L *list)

{

intin, mi;

intcount = 0;

list->next= (L*)malloc(sizeof(L));//为下一项申请空间的时候失败

if(!list->next)

{

printf("申请空间失败2");

return;

}

L*pt = list->next;//指向除头节点的第一项

//构造一个死循环来进行输入,一旦发现输入的系数为0就会停止

while(1)

{

pt->data= (enode*)malloc(sizeof(enode));

if(!(pt->data))

{

printf("申请空间失败3");//为每一项中的enode格式的数据结构申请空间的时候失败

return;

}

printf("请输入第%d项的系数",++count);

scanf_s("%d",&in);

//一旦发现输入的系数为0那么久停止输入

if(in == 0)

{

pt->data->data= 0;

return;

}

printf("请输入第%d项的指数",count);

scanf_s("%d",&mi);


pt->data->data= in;

pt->data->index= mi;

//printf("testvalue%d",list->data->data);

pt->next= (L*)malloc(sizeof(L));

if(!pt->next)

{

printf("申请空间失败2");//为下一项申请空间失败

return;

}

pt= pt->next;

}

}


voidadd(L* list1, L*list2)

{

//让每一个多项式指向第一项

L*pt1 = list1->next;

L*pt2 = list2->next;

L*temp1,*temp2;

L*pre= list1;

while(pt1->data->data != 0 && pt2->data->data != 0)

{

if(pt1->data->index>pt2->data->index)//如果第一个多项式的指数大于第二个就把第二个多项式中的此项插入到第一个多项式的前面

{

pre->next= pt2;

temp2= pt2->next;

pt2->next= pt1;

pt2= temp2;

pre= pre->next;

}

elseif (pt1->data->index ==pt2->data->index)//如果相等就相加存到第一个多项式中,并且把第二个多项式中这一项释放指针后移。

{

pt1->data->data+= pt2->data->data;

temp1= pt2;

pt1= pt1->next;

pre= pre->next;

pt2= pt2->next;

free(temp1);

}

elseif(pt1->data->index<pt2->data->index)//如果第一个多项式中的指数小于第二个多项式中的值就把第一个多项式中的指针向后移动

{

pt1= pt1->next;

pre= pre->next;


}

}

if(pt2->data->data != 0)

{

pt1->data->data= pt2->data->data;

pt1->data->index= pt2->data->index;

pt1->next= pt2->next;


}


}


//附上程序全部 vs中编译vc6.0可能会有语法错误,改正一下就可以

#include<stdio.h>
#include<stdlib.h>
typedef struct one {

	int data;
	int index;
}enode;

typedef struct qList {

	enode *data;
	struct qList *next;
}L;

L* initList()
{
	L *list = (L*)malloc(sizeof(L));
	if (!list)
	{
		printf("空间申请失败1");
		return NULL;
	}
	return list;
}

void input(L *list)
{
	int in, mi;
	int count = 0;
	list->next = (L*)malloc(sizeof(L));//为下一项申请空间的时候失败
	if (!list->next)
	{
		printf("申请空间失败2");
		return;
	}
	L *pt = list->next;//指向除头节点的第一项
//构造一个死循环来进行输入,一旦发现输入的系数为0就会停止
	while (1)
	{
		pt->data = (enode*)malloc(sizeof(enode));
		if (!(pt->data))
		{
			printf("申请空间失败3");//为每一项中的enode格式的数据结构申请空间的时候失败
			return;
		}
		printf("请输入第%d项的系数", ++count);
		scanf_s("%d", &in);
		//一旦发现输入的系数为0那么久停止输入
		if (in == 0)
		{
			pt->data->data = 0;
			return;
		}
printf("请输入第%d项的指数", count);
		scanf_s("%d", &mi);

		pt->data->data = in;
		pt->data->index = mi;
		//printf("test value%d",list->data->data);
		pt->next = (L*)malloc(sizeof(L));
		if (!pt->next)
		{
			printf("申请空间失败2");//为下一项申请空间失败
			return;
		}
		pt = pt->next;
	}
}

void add(L* list1, L*list2)
{
//让每一个多项式指向第一项
	L *pt1 = list1->next;
	L *pt2 = list2->next;
	L*temp1, *temp2;
	L*pre = list1;
	while (pt1->data->data != 0 && pt2->data->data != 0)
	{
		if (pt1->data->index>pt2->data->index)//如果第一个多项式的指数大于第二个就把第二个多项式中的此项插入到第一个多项式的前面
		{
			pre->next = pt2;
			temp2 = pt2->next;
			pt2->next = pt1;
			pt2 = temp2;
			pre = pre->next;
		}
		else if (pt1->data->index == pt2->data->index)//如果相等就相加存到第一个多项式中,并且把第二个多项式中这一项释放指针后移。
		{
			pt1->data->data += pt2->data->data;
			temp1 = pt2;
			pt1 = pt1->next;
			pre = pre->next;
			pt2 = pt2->next;
			free(temp1);
		}
		else if (pt1->data->index<pt2->data->index)//如果第一个多项式中的指数小于第二个多项式中的值就把第一个多项式中的指针向后移动
		{
			pt1 = pt1->next;
			pre = pre->next;

		}
	}
	if (pt2->data->data != 0)
	{
		pt1->data->data = pt2->data->data;
		pt1->data->index = pt2->data->index;
		pt1->next = pt2->next;

	}

}
void out(L*list)
{
	L*pt = list->next;
	while (pt->data->data != 0)
	{
		printf("%d,%d\t", pt->data->data, pt->data->index);
		pt = pt->next;
	}
}
int main()
{
	L* list1 = initList();
	L*list2 = initList();

	input(list1);
	input(list2);
	//printf("即将输出");
	add(list1, list2);
	out(list1);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值