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

/*
	一元多多项式的加法
	1.先创建链表,存储多项式
	2.输出多项式
	3.两个多项式相加
	4.输出多项式
*/

# include <stdio.h>
# include <malloc.h>

typedef struct dxs  //多项式节点
{
	float coe;  //系数
	int exp;   //指数
	struct dxs * pNext;  //指针域

}DXS, * PDXS;

PDXS creat_dxs();   //创建多项式
void traverse(PDXS pHead);   //遍历多项式链表
PDXS add(PDXS Da, PDXS Db);  //多项式求和

int main(void)
{
	//用链表结构,创建两个多项式
	PDXS Da = creat_dxs();
    traverse(Da);

	PDXS Db = creat_dxs();
    traverse(Db);

	//求两个多项式的加法
	PDXS Dj = add(Da, Db);
	traverse(Dj);

	return 0;
}

PDXS creat_dxs()
{
	PDXS pHead = (PDXS)malloc(sizeof(DXS)); //创建头结点
	pHead->pNext = NULL;  //尾指针

	PDXS pTail = pHead;
	PDXS pNew = NULL;

	int len;
	float c;
	int e;
	int i;

	printf("输入多项式的项数:len = ");
	scanf("%d", &len);

	for(i = 0; i < len; i++)
	{
		printf("分别输入第%d项的系数c、指数e:", i+1);
		scanf("%f%d", &c, &e);
		
		pNew = (PDXS)malloc(sizeof(DXS));

		//多项式项,系数、指数
		pNew->coe = c;
		pNew->exp = e;
		pNew->pNext = NULL;

		pTail->pNext = pNew;
		pTail = pNew;
	}

	return pHead;
}

//遍历链表
void traverse(PDXS pHead)
{
	PDXS p = pHead->pNext;  //首节点

	while(p != NULL)
	{
		printf("(%.2f %d), ", p->coe, p->exp);
		p = p->pNext;
	}
	printf("\n");
}


//多项式相加
PDXS add(PDXS Da, PDXS Db)
{
	PDXS Dj = (PDXS)malloc(sizeof(DXS));  //和的头结点
	Dj->pNext = NULL;
	PDXS pTail = Dj;  //和的尾节点

	PDXS Dah = Da->pNext;  //指向多项式的首节点
	PDXS Dbh = Db->pNext;

	//循环遍历多项式A,B
	while(Dah && Dbh)
	{
		//比较当前两节点的指数
		//当前 A项节点指数 < B项节点指数
		if(Dah->exp < Dbh->exp)
		{
			pTail->pNext = Dah;  //将此A项加入和链表中
			pTail = Dah;

			Dah = Dah->pNext;  //A多项式向后遍历
		}

		//当前 A项节点指数 < B项节点指数
		else if(Dah->exp > Dbh->exp)
		{
			pTail->pNext = Dbh;  //将此B项加入和链表中
			pTail = Dbh;

			Dbh = Dbh->pNext;  // //B多项式向后遍历
		}

		//如果两节点的指数相等
		else
		{
			//当前指数的系数和不为0
			//A项中保存系数和,把此A项加入和链表中
			if(0 != (Dah->coe + Dbh->coe))
			{
				Dah->coe = Dah->coe + Dbh->coe;
				pTail->pNext = Dah;
				pTail = Dah;		
			}
		
			//A,B都向后遍历
			Dah = Dah->pNext;
			Dbh = Dbh->pNext;			
		}
	}

	//插入剩余段
	if(Dah != NULL)
	{
		pTail->pNext = Dah;
	}
	if(Dbh != NULL)
	{
		pTail->pNext = Dbh;
	}

	return Dj;
}

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
#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; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值