This commit is contained in:
2024-03-04 23:45:56 +08:00
commit 2e9a13a76c
33 changed files with 4563 additions and 0 deletions

View File

@@ -0,0 +1,238 @@
#include<iostream>//cout,cin
using namespace std;
struct PolyNode // 多项式结点
{
float coef; // 系数
int exp; // 指数
PolyNode *next; // 指向下一项结点
};
void InitPoly(PolyNode *&L)
{ //创建一空多项式
L=new PolyNode;
L->next=NULL;
}
bool CreatePoly(PolyNode *&L,int n) // 尾插法创建n项多项式
{
int i;
PolyNode *p,*s;
p=L;
for(i=1; i<=n; i++) // 按幂升序依次输入多项式各项系数与幂指数
{
s=new PolyNode;
if (!s)
return false;
cout<<"输入第"<<i<<"项系数和幂指数:";
cin>>s->coef>>s->exp;
s->next=p->next;
p->next=s;
p=s;
}
return true;
}
//显示多顶式
void DispPoly(PolyNode *L) // 通过遍历结点,输出多项式
{
PolyNode *p;
if(!L) // 空表,返回
{
cout<<"空表!";
return;
}
p=L->next;
while(p && p->next)
{
cout<<p->coef<<"x^"<<p->exp<<" + ";
p=p->next;
}
cout<<p->coef<<"x^"<<p->exp;
cout<<endl;
}
//【算法2.26】 求多项式LA=LA+LB
void PolyAdd(PolyNode *&LA,PolyNode *&LB)
{
float sum;
PolyNode *pa,*pb,*qa,*qb; // 1.工作指针初始化
pa=LA;
qa=pa->next;
pb=LB;
qb=pb->next;
while (qa!=NULL && qb!=NULL ) // 2. 两表均不空
{
if (qa->exp < qb->exp ) // 2.1 LA的幂小
{ // pa、qa后移
pa=qa;qa=qa->next; }
else if ( qa->exp > qb->exp ) //2.2 LA 幂大
{
pb->next =qb->next; // qb链接到pa之后
qb->next=qa;
pa->next=qb;
pa=qb;
qb=pb->next;
}
else // 2.3 LA与LB幂相同
{
sum=qa->coef+qb->coef; // 计算系数和
if (sum!=0 ) // 2.3.1 系数和不为0
{
qa->coef=sum; // 2.3.1.1 qa->coef←sum
pa=qa; qa=qa->next; // 2.3.1.2 paqa后移
pb->next=qb->next;
delete qb; // 2.3.1.3删除qb
qb=pb->next;
}
else // 2.3.2 系数和为0
{
pa->next=qa->next;
delete qa; // 2.3.2.1 删除qa
qa=pa->next; // 2.3.2.2 qa为pa后继
pb->next=qb->next;
delete qb; // 2.3.2.3 删除qb
qb=pb->next; // 2.3.2.4 qb为pb的后继
}
}
}//while
if(qb!=NULL) // 3. LA处理结束LB未结束
pa->next=qb; // 3.1 qb链到qa之后
delete pb; // 3.2 删除lb头结点
LB=NULL;
}//Add
void DestroyPoly(PolyNode *&L) // 释放链表所占空间
{
PolyNode *p;
while(L) // 从头结点开始,依次释放结点
{
p=L;
L=L->next;
delete p;
}
L=NULL; // 头结点指向空
}
void SortPoly(PolyNode *&L) // 将多项式按幂升序排序
{
PolyNode *p1,*p2,*q,*r; // 采用插入排序算法
p1=L;p2=p1->next; // p1是p2的前驱
if(p2==NULL || p2->next==NULL) // 空表或只有1项的多项式不需要排序
{
cout<<"不需要排序!"<<endl;
return;
}
r=L->next; // 有序表表尾
q=r->next; // q为当前处理项有序表的后一项
while(q) // 未处理完
{ // 从首元结点开始查找插入点
p1=L;p2=p1->next;
while(q->exp>p2->exp && p2!=q) // 当前结点幂大,插入点后移
{
p1=p2;p2=p2->next;
}
if(p2==q) // 当前项无需移动
{
r=q; // 有序表表尾顺移
}
else // q插入到p2前面
{
r->next=q->next; // 摘除q结点
q->next=p1->next; // 在p1后插入结点q
p1->next=q;
}
q=r->next; // 下一个需处理的项
}
return;
}
void dispmenu()
{//显示主菜单
cout<<endl;
cout<<"*** 稀疏多项式求和 ***\n";
cout<<"1-创建多项式A\n";
cout<<"2-创建多项式B\n";
cout<<"3-多项式求和A=A+B\n";
cout<<"4-显示多项式\n";
cout<<"0-退出\n";
}
//主函数
int main()
{
int m,n;
char c;
PolyNode *LA, *LB;
system("cls"); // 执行系统命令cls清屏
int choice;
do
{
dispmenu(); // 显示主菜单
cout<<"Enter choice(1~4,0 退出):";
cin>>choice;
switch(choice)
{
case 1: // 创建多项式A
InitPoly(LA);
cout<<"请输入多项式 A 的项数: ";
cin>>m;
CreatePoly(LA, m );
cout<<"创建的多项式 A 为:"<<endl;
DispPoly(LA);
SortPoly(LA);
cout<<"排序后多项式 A 为:"<<endl;
DispPoly(LA);
break;
case 2: // 创建多项式B
InitPoly(LB);
cout<<"请输入多项式B的项数 ";
cin>>n;
CreatePoly(LB, n );
cout<<"创建的多项式B为"<<endl;
DispPoly(LB);
SortPoly(LB);
cout<<"排序后多项式 B 为:"<<endl;
DispPoly(LB);
break;
case 3: //多项式求和
cout<<"A = ";
DispPoly(LA);
cout<<"B = ";
DispPoly(LB);
PolyAdd(LA,LB); // 求多项式 LA=LA+LB
cout<<"A + B = "; // 显示结果
DispPoly(LA);
cout<<endl;
break;
case 4: // 显示多项式
cout<<"选择要显示的多项式 A 或 B"<<endl;
cin>>c;
if(c=='A'||c=='a')
DispPoly(LA);
else if(c=='B'||c=='b')
DispPoly(LB);
else
cout<<"选择错误!"<<endl;
break;
case 5: //退出
DestroyPoly(LA);
DestroyPoly(LB);
cout<<"结束运行bye-bye!"<<endl;
break;
default: //非法选择
cout<<"非法选择!\n";
break;
}
}while(choice!=0);
return 0;
}//end of main function