数据结构(C++)链表实现十进制到2,8进制的转化

数据结构(C++)链表实现十进制到2,8进制的转化

/*一元多项式的表示与相加顺序存储结构指的是用数组方法,使用数组方法实现时,
删除其中一个需要将其后的数组元素改变位置,使其数组保持原有的顺序结构,在查找方面较链表简单,只需要知道其下标就可以知道。链接存储结构指的是用链表方法,值得注意的是,删除和插入较为灵活,不需要变动大多数元素,但是查找过程相对于数组这种顺序存储结构来说较为复杂,耗时巨大。*/
#include<iostream>
using namespace std;

struct Node//结点是一个struct类型的结构体
{
	int coef;
	int exp;
	Node *next;
};

//初始化
void InitList(Node * &L)//链表初始化
{
	L = new Node;//申请一个新的结点
	L->next = NULL;//结点的指针域赋空值,系数为零,指数为零
	L->coef = 0;
	L->exp = 0;
}

//在多项式链表的第i个位置插入结点 
void InsertNode(Node *& L, int c, int e, int i)
{
	Node *p, *q; int j = 1;
	q = new Node;
	q->coef = c;
	q->exp = e;
	q->next = NULL;

	p = L;
	while (j <= i)
	{
		p = p->next;
		++j;
	}
	q->next = p->next;
	p->next = q;
}

//按指数非递减给多项式排序
void SortList(Node *&L)
{
	Node *p, *q, *pre;
	p = L->next;
	L->next = NULL;
	while (p != NULL)
	{
		if (L->next == NULL)       //处理第一个结点  
		{
			L->next = p;
			p = p->next;
			L->next->next = NULL;
		}
		else         //处理剩余其他结点  
		{
			pre = L;
			q = pre->next;
			while (q && q->exp < p->exp)
			{
				pre = q;
				q = q->next;
			}
			q = p->next;
			p->next = pre->next;
			pre->next = p;
			p = q;
		}
	}
}

void print(Node * L)
{
	SortList(L);
	Node *p;
	p = L->next;
	while (p != NULL)
	{
		cout << p->coef << "x^" << p->exp << "+";
		p = p->next;
	}
	cout << endl;
}

Node *AddPoly(Node *L1, Node *L2)       //一元多项式相加  
{
	Node *pa, *pb, *s, *pc, *p;
	Node *tc;    //创建尾节点  
	pc = new Node;
	pc->next = NULL;    /*pc为新建单链表的头结点*/
	tc = pc;   /*tc始终指向新建单链表的最后结点*/
	pa = L1->next;
	pb = L2->next;   //获得多项式单链表的第一个结点  
	while (pa != NULL && pb != NULL)    //pa,pb都不为空,就进行比较,否则,跳出while  
	{
		if (pa->exp < pb->exp)         //将*pa结点复制到*s并链到pc尾  
		{
			s = new Node;
			s->coef = pa->coef;
			s->exp = pa->exp;
			s->next = NULL;
			tc->next = s;
			tc = s;
			pa = pa->next;
		}
		else if (pa->exp > pb->exp)      //将*pb结点复制到*s并链到pc尾  
		{
			s = new Node;
			s->coef = pb->coef;
			s->exp = pb->exp;
			s->next = NULL;
			tc->next = s;
			tc = s;
			pb = pb->next;
		}
		else         //pa->expn=pa->expn时的情况  
		{
			if (pa->coef + pb->coef != 0)     //如果相加系数之和不为0,则将新结点插在tc后面  
			{
				s = new Node;
				s->coef = pa->coef + pb->coef;
				s->exp = pa->exp;
				s->next = NULL;
				tc->next = s;
				tc = s;
			}
			pa = pa->next;   //跳过当前的结点,继续后面的结点的比较  
			pb = pb->next;
		}
	}
	//将尚未扫描完的余下结点复制并链接到pc单链表之后  
	if (pa != NULL)        //pb为空     
		p = pa;
	else                  //pa为空  
		p = pb;
	while (p != NULL)
	{
		s = new Node;
		s->coef = p->coef;
		s->exp = p->exp;
		s->next = NULL;
		tc->next = s;
		tc = s;
		p = p->next;
	}
	return pc;
}

int main()
{
	int c1[] = { 3, 7, 9, 5 }, c2[] = { 8, 22, -9 };
	int e1[] = { 2, 1, 8, 7 }, e2[] = { 9, 0, 8 };

	Node *la, *lb, *lc; int k;
	InitList(la);
	InitList(lb);
	InitList(lc);
	for (k = 0; k < 4; k++)
		InsertNode(la, c1[k], e1[k], k);
	for (k = 0; k < 3; k++)
		InsertNode(lb, c2[k], e2[k], k);
	cout << "多项式A:";
	print(la);
	cout << "多项式B:";
	print(lb);

	cout << "多项式相加的结果为:" << endl;
	lc = AddPoly(la, lb);
	print(lc);

	return 0;

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值