线性表的应用

两个链表的合并

#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
	int data;
	struct Node* next;
}*List;
List Creat()
{
	List L,R,H;
	int n,i;
	scanf("%d",&n);
	H=(List)malloc(sizeof(struct Node));
	H->next=NULL;
	R=H;
	for(i=0;i<n;i++)
	{
		L=(List)malloc(sizeof(struct Node));
		scanf("%d",&L->data);
		L->next=R->next;
		R->next=L;
		R=L;
	}
	return H;
}
void Print(List L)
{
	List p=L->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
}
List Merge(List L1,List L2)
{
	List p1=L1->next,p2=L2->next,L,r;
	L=(List)malloc(sizeof(struct Node));
	L->next=NULL;
	r=L;
	while(p1&&p2)
	{
		if(p1->data<p2->data)
		{
			r->next=p1;
			r=p1;
			p1=p1->next;
		}
		else
		{
			r->next=p2;
			r=p2;
			p2=p2->next;
		}
	}
	if(p1) r->next=p1;
	if(p2) r->next=p2;
	return L;
}
int main(void)
{
	List L1=Creat();
	List L2=Creat();
	List L=Merge(L1,L2);
	Print(L);
	return 0;
 } 

两个多项式的加法

要求:

1、输入:分别给出两个多项式的项数n,m;

第二行:输入n个a,b表示多项式一的系数和指数

第三行:输入m个a,b表示多项式二的系数和指数

2、输出:按指数从小到大输出合并后的多项式。

样例:

输入:

3 4
1 2
2 3
3 4
4 5 
5 6
6 7
7 8

输出:

1.00*X^2+2.00*X^3+3.00*X^4+4.00*X^5+5.00*X^6+6.00*X^7+7.00*X^8

实现要点:

1、用链表存储多项式;

2、有序输出,所以建立一个带头节点链表,用尾插法;

3、多项式合并时,可以p1=p2+p1,节省内存;

4、多项式合并时,要分情况考虑(1)指数相同

(2)p1指数大于p2指数(3)p1指数小于p2;

#include<bits/stdc++.h>
using namespace std;
typedef struct PNode{
	double coef;
	int expn;
	struct PNode* next;
}*Polynomial;

Polynomial Creat(int n)
{
	Polynomial pre,p,q,s;
	p = new struct PNode;
	p->next = NULL;
	while(n--)
	{
		s = new struct PNode;
		cin >> s->coef >> s->expn;
		pre = p;
		q = p->next;
		while(q && q->expn < s->expn)
		{
			pre = q;
			q = q->next;
		}
		s->next = q;
		pre->next = s;
	}
	return p;
}

Polynomial Add(Polynomial pa,Polynomial pb)
{
	Polynomial p1 = pa->next , p2 = pb->next , p3 = pa , r;
	while(p1 && p2)
	{
		if(p1->expn == p2->expn)
		{
			int sum = p1->coef + p2->coef;
			if(sum == 0)
			{
				r = p1 ; p1 = p1->next; delete r;
				r = p2 ; p2 = p2->next; delete r;
			}
			else
			{
				p1->coef = sum;
				p3->next = p1;
				p3 = p1;
				p1 = p1->next;
				r = p2; p2 = p2->next ;delete r;
			} 
		}
		else if(p1->coef < p2->coef)
		{
			p3->next = p1;
			p3 = p1;
			p1 = p1->next;
		}
		else if(p1->coef > p2->coef)
		{
			p3->next =p2;
			p3 = p2;
			p2 = p2->next;
		}
	}
	p3->next = p1 ? p1 : p2;
	return pa;
}
void Print(Polynomial p)
{
	Polynomial pre = p->next;
	printf("%.2f*X^%d" , pre->coef , pre->expn);
	for(pre = pre->next; pre ;pre = pre->next)
	printf("+%.2f*X^%d" , pre->coef , pre->expn);
	printf("\n");
}
int main(void)
{
	int n,m;
	cin>>n>>m;
	Polynomial p1 = Creat(n);
	Polynomial p2 = Creat(m);
	p1 = Add(p1,p2);
	Print(p1);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值