(编程训练)再回首,数据结构——链表上的编程训练_实现多项式运算

       最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。


       希望这些能提供给初学者一些参考。

 

      在VC++6.0下可运行,当初还写了不少注释。


#include <iostream>
using namespace std;
//实训2:多项式的表示和相加

/*建立多项式节点*/
typedef struct PNode
{
	int exp;	//指数
	float coef;		//系数
	struct PNode *next;		//指向下个节点
}PolyNode, *PolyList;

/*建立带头结点的单链表*/
PolyList create()
{
	PolyList h, p;
	int e;
	float c;
	h = (PolyList)malloc(sizeof(PolyNode));		//建立头结点
	h->next = NULL;
	cout << "Enter coef and exp: ";
	cin >> c >> e;
	while (e != -1)		//以指数为-1的节点结束链表构建
	{
		p = (PolyList)malloc(sizeof(PolyNode));
		p->exp = e;
		p->coef = c;
		p->next = h->next;
		h->next = p;
		cout << "Enter coef and exp: ";
		cin >> c >> e;
	}
	return (h);
}

/*输出单链表的值*/
void Print(PolyList h)
{
	PolyList p;
	p = h->next;
	while (p != NULL)
	{
		cout << p->coef << " "<< p->exp << " "
			 <<endl;
		p = p->next;
	}
}

/*求单链表polya与polyb对应多项式的和*/
void PolyAdd(PolyList polya, PolyList polyb)
{
	PolyList pa, pb, pre, temp;
	float sum;
	pa = polya->next;
	pb = polyb->next;
	pre = polya;
	while (pa != NULL && pb != NULL)		//遍历链表polya 和 polyb
	{
		if (pa->exp < pb->exp)		
		{
			pre->next = pa;
			pre = pre->next;
			pa = pa->next;
		}
		else if (pa->exp == pb->exp)
		{
			sum = pa->coef + pb->coef;
			if (sum != 0)				
			{
				pa->coef = sum;
				pre->next = pa;
				pre = pre->next;
				pa = pa->next;
				temp = pb->next;
				free(pb);
				pb = temp;
			}
			else
			{
				temp = pa->next;
				free(pa);
				pa = temp;
				temp = pb->next;
				free(pb);
				pb = temp;
			}
		
		}
		else 
		{
			pre->next = pb;
			pre = pre->next;
			pb = pb->next;
		}
	}
	if (pa != NULL)			//若遍历后剩余polya,则将剩余节点接入主链表
		pre->next = pa;
	
	if (pb != NULL)			//若遍历后剩余polyb,则将剩余节点接入主链表
		pre->next = pb;
}

/*main 函数*/
int main ()
{
	PolyList pa, pb;
	pa = create();
	pb = create();
	PolyAdd(pa, pb);
	Print(pa);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值