线性表链表案例之多项式加法
线性表实现多项式加法
#include <iostream>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef struct{
int exponent;
int base;
}ElemType;
typedef struct
{
ElemType *elem;//对应方式二初始化
//ElemType* elem;对应方式一初始化
int length;
}SqList;
Status init(SqList &L){
L.elem=new ElemType[MAXSIZE];
if(!L.elem) return ERROR;
L.length=0;
return OK;
}
void createSqlist(SqList &L,int n){
init(L);
while(n>0){
printf("请输入底数:\n");
cin>>L.elem[L.length].base;
printf("请输入指数:\n");
cin>>L.elem[L.length++].exponent;
n--;
}
}
void selectAll(SqList L){
for(int i=0;i<L.length;i++){
if(i==L.length-1){
printf("%dX^%d",L.elem[i].base,L.elem[i].exponent);
}else{
printf("%dX^%d+",L.elem[i].base,L.elem[i].exponent);
}
}
}
//线性表的多项式相加
SqList add(SqList L1,SqList L2){
int p1=0;int p2=0;
SqList R;
R.elem=new ElemType[L1.length+L2.length];
R.length=0;
while(p1<L1.length&&p2<L2.length){
if(L1.elem[p1].exponent==L2.elem[p2].exponent){//指数相等的情况
int result=L1.elem[p1].base+L2.elem[p2].base;//底数相加
if(result!=0){
R.elem[R.length].base=result;//底数
R.elem[R.length++].exponent=L1.elem[p1].exponent;//指数
}
//移动指针
p1++;
p2++;
}else{//指数不相等的情况
if(L1.elem[p1].exponent<L2.elem[p2].exponent){//L1的指数更小
R.elem[R.length].base=L1.elem[p1].base;//底数
R.elem[R.length++].exponent=L1.elem[p1].exponent;//指数
p1++;//移动p1指针
}else{
R.elem[R.length].base=L2.elem[p2].base;//底数
R.elem[R.length++].exponent=L2.elem[p2].exponent;//指数
p2++;//移动p2指针
}
}
}
//判断L1和L2中哪个有剩余
while(p1<L1.length){
R.elem[R.length].base=L1.elem[p1].base;//底数
R.elem[R.length++].exponent=L1.elem[p1].exponent;//指数
p1++;
}
while(p2<L2.length){
R.elem[R.length].base=L2.elem[p2].base;//底数
R.elem[R.length++].exponent=L2.elem[p2].exponent;//指数
p2++;
}
return R;
}
int main()
{
SqList L;
int n;
printf("请输入第一个多项式的项数:\n");
cin>>n;
createSqlist(L,n);
selectAll(L);
printf("\n");
SqList L2;
int n2;
printf("请输入第二个多项式的项数:\n");
cin>>n2;
createSqlist(L2,n2);
selectAll(L2);
printf("\n");
SqList R=add(L,L2);
printf("\n===================================\n");
selectAll(R);
return 0;
}
SqList中的元素不是直接的指数和底数,而是它们对应的结构体的地址的情况:(即(指针里面存指针的情况)):**
#include <iostream>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef struct{
int exponent;
int base;
}type,*ElemType;
typedef struct
{
ElemType *elem;//这个里面存的还是指针,所以在分配的时候还需要单独为这些分配空间L.elem[L.length]=new type;这种
//就是很变态的指针里面存指针
//ElemType* elem;对应方式一初始化
int length;
}SqList;
Status init(SqList &L){
L.elem=new ElemType[MAXSIZE];
if(!L.elem) return ERROR;
L.length=0;
return OK;
}
void createSqlist(SqList &L,int n){
init(L);
while(n>0){
printf("请输入底数:\n");
L.elem[L.length]=new type;
//cin>>e->base;
cin>>L.elem[L.length]->base;
printf("请输入指数:\n");
//cin>>e->exponent;
cin>>L.elem[L.length++]->exponent;
n--;
}
}
void selectAll(SqList L){
for(int i=0;i<L.length;i++){
if(i==L.length-1){
printf("%dX^%d",L.elem[i]->base,L.elem[i]->exponent);
}else{
printf("%dX^%d+",L.elem[i]->base,L.elem[i]->exponent);
}
}
}
//线性表的多项式相加
SqList add(SqList L1,SqList L2){
int p1=0;int p2=0;
SqList R;
R.elem=new ElemType[L1.length+L2.length];
R.length=0;
while(p1<L1.length&&p2<L2.length){
if(L1.elem[p1]->exponent==L2.elem[p2]->exponent){//指数相等的情况
int result=L1.elem[p1]->base+L2.elem[p2]->base;//底数相加
if(result!=0){
R.elem[R.length]=new type;
R.elem[R.length]->base=result;//底数
R.elem[R.length++]->exponent=L1.elem[p1]->exponent;//指数
}
//移动指针
p1++;
p2++;
}else{//指数不相等的情况
if(L1.elem[p1]->exponent<L2.elem[p2]->exponent){//L1的指数更小
R.elem[R.length]=new type;
R.elem[R.length]->base=L1.elem[p1]->base;//底数
R.elem[R.length++]->exponent=L1.elem[p1]->exponent;//指数
p1++;//移动p1指针
}else{
R.elem[R.length]=new type;
R.elem[R.length]->base=L2.elem[p2]->base;//底数
R.elem[R.length++]->exponent=L2.elem[p2]->exponent;//指数
p2++;//移动p2指针
}
}
}
//判断L1和L2中哪个有剩余
while(p1<L1.length){
R.elem[R.length]=new type;
R.elem[R.length]->base=L1.elem[p1]->base;//底数
R.elem[R.length++]->exponent=L1.elem[p1]->exponent;//指数
p1++;
}
while(p2<L2.length){
R.elem[R.length]=new type;
R.elem[R.length]->base=L2.elem[p2]->base;//底数
R.elem[R.length++]->exponent=L2.elem[p2]->exponent;//指数
p2++;
}
return R;
}
int main()
{
SqList L;
int n;
printf("请输入第一个多项式的项数:\n");
cin>>n;
createSqlist(L,n);
selectAll(L);
printf("\n");
SqList L2;
int n2;
printf("请输入第二个多项式的项数:\n");
cin>>n2;
createSqlist(L2,n2);
selectAll(L2);
printf("\n");
SqList R=add(L,L2);
printf("\n===================================\n");
selectAll(R);
return 0;
}
链表实现稀疏多项式
#include <iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
using namespace std;
typedef int Status;//返回值类型
typedef struct{
int exponent;
int base;
}ElemType;
typedef struct Lnode{
ElemType elem;
Lnode* next;
}Lnode,*LinkList;
Status init(LinkList &L){
L=new Lnode;
L->next=nullptr;
}
//创建链表
void createLink(LinkList &L,int n){
init(L);
Lnode* tail=L;//尾指针
while(n>0){
Lnode* q=new Lnode;
printf("请输入底数:\n");
cin>>q->elem.base;
printf("请输入指数:\n");
cin>>q->elem.exponent;
q->next=nullptr;
tail->next=q;
//移动tail
tail=q;
n--;
}
}
//进行多项式加法计算
LinkList add(LinkList La,LinkList Lb){
Lnode *pa,*pb,*pc;
pa=La->next;
pb=Lb->next;
pc=La;
while(pa!=nullptr&&pb!=nullptr){//两个多项式都还没有到达最后
if((pa->elem).exponent==(pb->elem).exponent){
int result=pa->elem.base+pb->elem.base;
if(result!=0){
pa->elem.base=result;//直接存回到其中一个节点中即可
pc->next=pa;//加结果节点加入链表中
pc=pa;//移动pc
}
Lnode* tempa=pa;
pa=pa->next;
Lnode* tempb=pb;
pb=pb->next;//移动指针
if(result!=0){
delete(tempb);
}else{
delete(tempa);
delete(tempb);
}
}else{
if(pa->elem.exponent>pb->elem.exponent){//取指数小的加入到结果链表中La
pc->next=pb;
pc=pb;//移动结果链表尾指针
pb=pb->next;
}else{
pc->next=pa;
pc=pa;//移动
pa=pa->next;
}
}
}
while(pa!=nullptr){
pc->next=pa;
pa=pa->next;
}
while(pb!=nullptr){
pc->next=pb;
pb=pb->next;
}
delete(Lb);
return La;
}
void selectAll(LinkList L){
Lnode* p;
p=L->next;
while(p!=nullptr){
if(p->next!=nullptr){
printf("%dX^%d+",p->elem.base,p->elem.exponent);
}else{
printf("%dX^%d",p->elem.base,p->elem.exponent);
}
p=p->next;
}
}
int main()
{
LinkList L1;
int n1;
printf("请输入多项式1长度:\n");
cin>>n1;
createLink(L1,n1);
selectAll(L1);
printf("\n");
LinkList L2;
int n2;
printf("请输入多项式2长度:\n");
cin>>n2;
createLink(L2,n2);
selectAll(L2);
printf("\n");
LinkList R=add(L1,L2);
selectAll(R);
return 0;
}