#include <iostream>
using namespace std;
typedef struct PNODE{
	int xs;	int cs;	PNODE *next;}pnode;
int CreateList(pnode* header,int n){
	for(int i=1; i<=n; i++){		pnode *new_node = new pnode;//创建新节点		if (!new_node)		{			cout<<"创建失败"<<endl;			return 0;		}
		new_node->next = nullptr;		bool flag = true;//判断本次输入的数据是否已经存在相同次数项的标志		cout<<"请输入系数和次数:";		cin>> new_node->xs >> new_node->cs;		pnode *s1 = header->next;		
if (header->next==nullptr)		{			header->next = new_node;		}
else		{			while(s1!=nullptr){//查找是否有相同次数的项				if(s1->cs==new_node->cs){//找到同次数的项					if(s1->xs+new_node->xs==0){//如果系数和为0 移除该节点						pnode *del = header->next;						while (del->next!=s1){//找到前结点							del = del->next;						}						del->next = s1->next;						delete s1,new_node;						flag = false;						break;					}
else{//系数和不为0则 直接加 并且删除新节点						s1->xs += new_node->xs;						delete s1,new_node;						flag = false;						break; 					}				}else{//该项次数不同则找下一个结点					s1 = s1->next;				}			}			
if(flag){//没有同次数项则 直接在对应位置插入新节点				//查找该结点的前驱和后驱 				s1 = header->next;//s1保存前驱的位置				pnode *s2;//s2保存后驱				s2 = s1;//从首元结点开始查找				if (s1==nullptr){//如果还没有数据则直接填入					header->next = new_node;					new_node->next = nullptr;					delete s1,s2;				}
else{					while(s2!=nullptr && s2->cs < new_node->cs){//找到第一个比该节点次数大的项						s1 = s2;						s2 = s2->next;					}//如果没找到s1应该为最后一项,s2为空					new_node->next = s2;					s1->next = new_node;				}			}		}	}	return 0; }
int AddList(pnode*& header1,pnode*& header2)//合并
{	pnode* p1 = header1->next;	pnode* p2 = header2->next;	pnode *research = header2->next;//指向header2的头结点	bool flag = true;//判断本次输入的数据是否已经存在相同次数项的标志(True表示未找到)	for (p1; p1!=nullptr; p1 = p1->next){		while(p2!=nullptr){//查找header2中是否有相同次数的项			if(p2->cs==p1->cs){//找到同次数的项				if(p2->xs+p1->xs==0){//如果系数和为0 移除p2中对应节点 有下列三种情况					if (header1->next==p1 && header2->next==p2){//1. p1 p2为首元结点						header1->next = p1->next;						header2->next = p2->next;					}else if(header1->next==p1){//2. p1为首元 p2不是						header1->next = p1->next;						pnode *flag2 = header2->next;						while (flag2->next!=p2){//找到p2前驱							flag2 = flag2->next;						}						flag2->next = p2->next;					}else{//3. p2是首元 p1不是						header2->next = p2->next;						pnode *flag1 = header1->next;						while (flag1->next!=p1){//找到p1前驱							flag1 = flag1->next;						}						flag1->next = p1->next;					}					delete p2;//删除结点 				}else{//系数和不为0则 直接加xs					p2->xs += p1->xs;				}				flag = false;				p2 = header2->next;				break; 			}else{//该项次数不同则找下一个结点				p2 = p2->next;			}		}		if(flag){//没有同次数项则 直接找到p2对应位置插入			if (header2->next->cs > p1->cs){//次数小于首元结点直接插在首元结点前				p1->next = header2->next;				header2->next = p1;			}else{				pnode *front = header2->next;//保存前驱的位置				pnode *back = front->next;//保存后驱				while(back!=nullptr && front->cs<p1->cs){//在header2中找到第一个比p1次数大的项					front = back;					back = back->next;				}				pnode *add_node = new pnode;//插入到header2中的新节点				if (!add_node)				{					cout<<"申请失败"<<endl;					return 0;				}				add_node = p1;				add_node->next = back;				front->next = add_node;			}		}		p2 = header2->next;//重新指向首元结点		flag = true;//重新初始化	}	return 0;} 
int main(int argc, char** argv) {	
pnode *header1 = new pnode ,*header2 = new pnode;	header1->next = nullptr,header2->next = nullptr;	pnode *p1,*p2;	int n,m;	cout<<"第一个多项式输入几个项?:";	cin>>n;	CreateList(header1,n);	p1 = header1->next;	while (p1!=nullptr)	{		cout<<"系数:"<<p1->xs<<"次数:"<<p1->cs<<endl;		p1 = p1->next;	}	cout<<"第二个多项式输入几个项?:";	cin>>m;	CreateList(header2,m);	p2 = header2->next;	while (p2!=nullptr)	{		cout<<"系数:"<<p2->xs<<"次数:"<<p2->cs<<endl;		p2 = p2->next;	}	AddList(header1,header2);	cout<<"*********************************************"<<endl;	while (header2->next!=nullptr)	{		header2 = header2->next;		cout<<"系数:"<<header2->xs<<"次数:"<<header2->cs<<endl;	}	system("pause");	return 0;}