/**
* Althor:Hacker Hao
* Create:2023.09.18
*
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX = 1e4 + 10;
typedef struct node
{
int coef;
int expn;
struct node* next;
}PolyNode;
void Create(PolyNode*& L, double a[], int b[], int n)
{
cout << "建立单链表:";
PolyNode* s = NULL, * p = NULL;
L = (PolyNode*)malloc(sizeof(PolyNode));
p = L; //p永远指向终端结点,开始时在头结点上
for (int i = 0; i < n; i++)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->expn = b[i];
s->coef = a[i];
p->next = s;
p = s;
}
p->next = NULL;
}
void Add(PolyNode* L0, PolyNode* L1, PolyNode *& L2)
{
PolyNode* pa = L0->next, * pb = L1->next, * s = NULL, * p = NULL;
double c = 0;
L2 = (PolyNode*)malloc(sizeof(PolyNode));
p = L2;
while (pa && pb)
{
if (pa->expn > pb->expn)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = pa->coef; s->expn = pa->expn;
p->next = s;p = s;
pb = pb->next;
}
else if (pa->expn < pb->expn)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = pb->coef; s->expn = pb->expn;
p->next = s; p = s;
pb = pb->next;
}
else
{
c = pa->coef + pb->coef;
if (c != 0)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = c; s->expn = pa->expn;
p->next = s; p = s;
}
pa = pa->next; pb = pb->next;
}
}
if (pb)
pa = pb;
while (pa)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = c; s->expn = pa->expn;
p->next = s; p = s;
pa = pa->next;
}
//在前面任何一步都没有必要让p->next = NULL, 因为
//前面都没有走完,等着所有的都扫进去以后,再最后为空即可
p->next = NULL;
}
void Destory(PolyNode*& L)
{
PolyNode* pre = L, * p = pre->next;
while (p)
{
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
void Display(PolyNode* L)
{
PolyNode* p = L->next;
while (p)
{
cout << p->coef << " " << p->expn << endl;
p = p->next;
}
cout << endl;
}
void Sort(PolyNode* L)
{
PolyNode* p = NULL, * q = NULL, * r = NULL, * t = NULL;
int flag = 1;
while (flag)
{
p = L;
q = L->next;
flag = 0;
while (q)
{
r = q->next;
if (!r)
break;
else if (q->expn > r->expn)
{
t = r->next;
q->next = t;
r->next = q;
p->next = r;
p = r;
p->next = q;
r = q->next;
flag = 1;
}
else
{
p = q;
q = p->next;
}
}
}
}
int main()
{
PolyNode* L0, * L1, * L2 = NULL;
double a[MAX]; int b[MAX], n1, n2;
//创建第一个链表
cout << "创建第一个链表:" << endl;
cout << "请输入多项式个数:" << endl;
cin >> n1;
cout << "请输入多项式的系数和指数:" << endl;
for (int i = 0; i < n1; i++)
cin >> a[i] >> b[i];
Create(L0, a, b, n1);
cout << "第一个多项式为:" << endl;
Display(L0);
//创建第二个链表
cout << "创建第二个链表:" << endl;
cout << "请输入多项式个数:" << endl;
cin >> n2;
cout << "请输入多项式的系数和指数:" << endl;
for (int i = 0; i < n2; i++)
cin >> a[i] >> b[i];
Create(L1, a, b, n2);
cout << "第二个多项式为:" << endl;
Display(L1);
//多项式相加
Add(L0, L1, L2);
Sort(L2);
Display(L2);
//销毁
Destory(L0); Destory(L1); Destory(L2);
return 0;
}
C/C++:链表习题:一元多项式的加法
最新推荐文章于 2024-10-08 16:16:22 发布