一元多項式相加
阿新 • • 發佈:2020-12-13
```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);
}