一元多项式相加


```cpp
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int typelem; 
typedef struct node1{
	int length;//表长 
	struct node2 *next; 
}headlist,*head_list; //头结点
 
typedef struct node2{
	typelem data1;//指数
	typelem data2;//系数 
	struct node2 *next;//指针域
}nodelist;//中间结点 

int Initlist(headlist &L)//初始化一个空链表 
{
	L.length=0;
	L.next=NULL;
	return 1; 
} 
int paixu(headlist *L)//将链表的数据按降序排列 ,失败返回0 
{
	if(!L)
	return 0;
	int i, j;nodelist *p,*p1;
    typelem t;
    for(i=0;i<L->length-1;i++)//冒泡排序
	{	
	    p=L->next;
	    p1=p->next;
		for(j=0;j<L->length-1-i;j++)
		{
			if(p->data1<p1->data1) 
			{
				t=p->data1;
				p->data1=p1->data1;
				p1->data1=t;
				t=p->data2;
				p->data2=p1->data2;
				p1->data2=t;
			}
			p=p->next;
			p1=p1->next;
		}
	 }
	 return 1; 
}
nodelist *find(headlist *L,typelem e1)//判断L中是否存在e1,在就返回地址指针,不在返回0
{
	 nodelist *p1=L->next;
	 while(p1)
	 {
	 	  if(p1->data1==e1)
	 	  break;
	 	  p1=p1->next;
	 }
	 if(p1==NULL)
	 return NULL;
	 else
	 return p1;
} 
int Listsert(headlist *p,typelem e1,typelem e2)//在表中插入元素
{
	if(!p)
	return 0;
	nodelist *p1;
	p1=(nodelist *)malloc(sizeof(nodelist));
	p1->data1=e1;p1->data2=e2;
	p->length++;
	p1->next=p->next;
	p->next=p1;
	return 1;
}
int Listcreate(headlist *L)//给链表赋值 
{
	if(!L)
	return 0;
	typelem e1,e2;int len,i;
	cout<<"Input length:";
	cin>>len;
	for(i=0;i<len;i++)
	{   cout<<"input data1(指数):";
	 	cin>>e1;
	 	cout<<"input data2(系数):";
		cin>>e2;
		if(find(L,e1)) 
		{
	 	    cout<<"指数已存在,请重新输入!\n";
	 	    i--;
	 	}
		else
		Listsert(L,e1,e2);
	}
	paixu(L);
	return 1;
 } 
int Listdelete(headlist *L,typelem e1)//删除表中data1为e1的结点,失败则返回0 
{
	if(!L||L->length==0)
	return 0;
	if(L->next->data1==e1)
	{
		nodelist *p6=L->next;
		L->next=p6->next;
		free(p6);
		L->length--;
		return 1;
	}
	if(L->length==1)
	{
		return 0;
	}
	nodelist *p,*p1;
	p=L->next;
	p1=p->next;
	while(p1->data1!=e1)
	{   
		p=p->next;
		p1=p1->next;
        if(p1==NULL)
        return 0;
	}
	p->next=p1->next;
	L->length--;
	free(p1);
	return 1;
}
int Listadd(headlist *L1,headlist *L2,headlist *L3)//(L1,L2按指数递增小的序列)将L2,L1两个多项式加到L3
{
	if(!(L1&&L2&&L3))
	return 0;
	if(L3->length||L1->length==0||L2->length==0)//保证L3为空表,L1,L2不为空表 
	return 0;
	nodelist *p1,*p2,*p3,*p4;
	p1=L1->next;p2=L2->next;
	while(!(p1==NULL&&p2==NULL))
	{
		p4=(nodelist *)malloc(sizeof(nodelist));
		if(p2==NULL)
		{
			goto look1;
		}
		else if(p1==NULL)
		{
			goto look2;
		}
		else if(p1->data1>p2->data1)
		{look1:
			p4->data1=p1->data1;
			p4->data2=p1->data2;
			p1=p1->next;
		}
		else if(p1->data1<p2->data1)
		{look2:
			p4->data1=p2->data1;
			p4->data2=p2->data2;
			p2=p2->next;
		}
		else 
		{
			p4->data1=p1->data1;
			p4->data2=p1->data2+p2->data2;
			p1=p1->next;p2=p2->next;
		}
		if(L3->length==0)
		L3->next=p4;
		else
		{
			p3->next=p4;
		}
		p3=p4;
		L3->length++;
	}
	p3->next=NULL;
	return 1;
} 

/*(int Listadd2(headlist *L1,headlist *L2,headlist *L3)//(L1,L2按指数递增加的序列)将L2,L1两个多项式加到L3
{
	if(!(L1&&L2&&L3))
	return 0;
	if(L3->length||L1->length==0||L2->length==0)//保证L3为空表,L1,L2不为空表 
	return 0;
	nodelist *p1;
	L1=L1->next;L2=L2->next;
	while(!(L1==NULL&&L2==NULL))
	{
		p1=(nodelist *)malloc(sizeof(nodelist));
		if(L2==NULL)
		{
			p1->data1=L1->data1;
			p1->data2=L1->data2;
			L1=L1->next;
		}
		else if(L1==NULL)
		{
			p1->data1=L2->data1;
			p1->data2=L2->data2;
			L2=L2->next;
		}
		else if(p1->data1>p2->data1)
		{
			p1->data1=L1->data1;
			p1->data2=L1->data2;
			L1=L1->next;
		}
		else if(p1->data1<p2->data1)
		{
			p1->data1=L2->data1;
			p1->data2=L2->data2;
			L2=L2->next;
		}
		else //合并同类项 
		{
			p1->data1=L1->data1;
			p1->data2=L1->data2+L2->data2;
			L1=L1->next;L2=L2->next;
		}
		p1->next=L3->next;
		L3->next=p1;
		L3->length++;
	}
	return 1;
}*/
void print(headlist *L)
{
	nodelist *p1=L->next;int j=1;
	while(p1!=NULL)
	{
		cout<<j++<<".data1:"<<p1->data1<<"   "<<"data2:"<<p1->data2<<'\n';
		p1=p1->next;
	}
}
void MergeList(LinkList la, LinkList lb, LinkList lc)//lc已经在主函数初始化 
{
	LNode *p;
	while(la != null && lb != null){
		p = (LNode *) malloc (sizeof(LNode));		
		if(la->data > lb->data){
			p->data = lb->data;
			lb = lb->next;
		}
		else{
			p->data = la->data;
			la = la->next;
		}
		p->next=lc->next;
		lc->next=p;	
	} 
	while(la != null){
		p = (LNode *) malloc (sizeof(LNode));
		p->data = la->data;
		la = la->next;
		lc->next = p;
		lc = p;	
	}
	while(lb != null){
		p = (LNode *) malloc (sizeof(LNode));
		p->data = lb->data;
		la = lb->next;
		lc->next = p;
		lc = p;	
	}
}
int main()
{
	headlist L1,L2,L3;
	Initlist(L1);Initlist(L2);Initlist(L3);
	Listcreate(&L1);Listcreate(&L2);
	Listadd2(&L1,&L2,&L3);
	print(&L3);
 } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦西空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值