2.8案例分析和实现
1.案例2.1:一元多项式的运算
#include<bits/stdc++.h> //万能头文件,如果不是特别清楚可以百度。
using namespace std;
typedef struct Node{
int coef;//系数
int exp;//指数
struct Node *next;
} *List;
List read(List L);
void print(List L);
List getMuti(List L1,List L2);
List getSum(List L1,List L2);
List read(List L){
List s=NULL,temp;
L = (struct Node*)malloc(sizeof(struct Node));
temp = L;
int n,COEF,EXP;
cin>>n;
for(int i=0;i<n;i++){
cin>>COEF>>EXP;
//这一步的作用是,排除读入过程中出现 系数:0 指数:不为0 的这种情况。
if(COEF!=0){
s = (struct Node *)malloc(sizeof(struct Node));
s->coef = COEF; s->exp=EXP;
L->next = s;
L = s;
}
}
L->next=NULL;
return temp;
}
void print(List L){
if(L->next!=NULL){
L = L->next;
while(L){
if(L->next)
cout<<L->coef<<" "<<L->exp<<" ";
else
cout<<L->coef<<" "<<L->exp<<endl;
L = L->next;
}
}
else
cout<<0<<" "<<0<<endl;
}
List getSum(List L1,List L2){
List L,temp = NULL,s = NULL;
L = (struct Node *)malloc(sizeof(struct Node));
temp = L;
while(L1->next&&L2->next){
if(L1->next->exp>L2->next->exp){
s = (struct Node *)malloc(sizeof(struct Node));
s->coef = L1->next->coef;
s->exp = L1->next->exp;
L->next = s;
L = s;
L1 = L1->next;
}
else if(L1->next->exp<L2->next->exp){
s = (struct Node *)malloc(sizeof(struct Node));
s->coef = L2->next->coef;
s->exp = L2->next->exp;
L->next = s;
L = s;
L2 = L2->next;
}
else{
if(L2->next->coef+L1->next->coef!=0){
s = (struct Node *)malloc(sizeof(struct Node));
s->coef = L2->next->coef+L1->next->coef;
s->exp = L2->next->exp;
L->next = s;
L = s;
}
//不管,他们的和是不是 0,我们都要,将L1,L2后移一个单位。
L1 = L1->next;
L2 = L2->next;
}
}
if(L1->next)
L->next = L1->next;
else
L->next = L2->next;
return temp;
}
List getMuti(List L1,List L2){
/*
在这里我们采用的是:逐项插入。
什么是逐项插入?
1,先拿出L2的第一项,让它与L1的每一项相乘。从而得到 L。
2,在拿出L2的第二项,让它与L1的每一项相乘,然后每乘一项,就将其插入到 L中。
3,依次重复上面的步骤,最终得到L。将其打印出来。
*/
List L,temp = NULL,s = NULL;
L = (struct Node *)malloc(sizeof(struct Node));
temp = L;
List La = L1;
//出L2的第一项,让它与L1的每一项相乘。从而得到 L。
while(La->next){
s = (struct Node *)malloc(sizeof(struct Node));
s->coef = La->next->coef * L2->next->coef;
s->exp = La->next->exp + L2->next->exp;
L->next=s;
L = s;
La = La->next;
}
L->next = NULL;
L = temp;
List Lb = L2->next;
bool flag = true;
/*
在这里说明一下 flag 在这里的作用:
用于标记,在下面的程序中,是否进行了, if( > ) 和 if( == )里面的操作,
若进行了,则flag就变为 false,则不用进行, while(.....){.....},结束后的第一条语句,
这条语句的含义是,在L中没有找到,这个 待插入项 的位置,所以将其置于l的尾部。
*/
while(Lb&&Lb->next){
La = L1;
while(La->next){
s = (struct Node *)malloc(sizeof(struct Node));
s->coef = La->next->coef * Lb->next->coef;
s->exp = La->next->exp + Lb->next->exp;
while(L->next){
if(s->exp > L->next->exp){
List val = L->next;
L->next = s;
s->next = val;
flag = false;
break;
}
else if(s->exp == L->next->exp)
{
if(s->coef + L->next->coef==0){
List val = L->next->next;
L->next = val;
}
else
L->next->coef += s->coef;
flag = false;
break;
}
L = L->next;
}
if(flag){
L->next = s;
s->next = NULL;
}
L = temp;
La = La->next;
flag = true;
}
Lb = Lb->next;
}
return temp;
}
int main(){
List L1,L2,L=NULL;
L1 = read(L1);
L2 = read(L2);
L = getMuti(L1,L2);
print(L);
L = getSum(L1,L2);
print(L);
return 0;
}
2.案例2.2:稀疏多项式的运算
#include<stdio.h>
//#include<stdlib.h>
#include<iostream>
//
using namespace std;
typedef struct PNode{
float coef;
int expn;
struct PNode *next;
}PNode,*Polynomial;
//单个多项式指数相同时未进行处理。f(x)=3x^2+4x^2
void CreatePolyn(Polynomial &p,int n){
p = new PNode;
PNode *s , *pre , *q;
// Polynomial s , pre , q;
p->next = NULL;
int i;
for(i = 1;i<=n;++i){
printf("请输入第%d系数和指数:\n",i);
s = new PNode;
cin>>s->coef>>s->expn;
// scanf("%f %d",&s->coef,&s->expn);
pre = p;
q = p->next;
while(q && q->expn<s->expn){
pre = q;
q = q->next;
}
s->next = q;
pre->next = s;
}
}
void PrintPolyn(Polynomial &L){
PNode *p;
p = L->next;
while(p){
printf("%fX^%d+", p->coef,p->expn);
p = p->next;
}
}
void AddPolyn(Polynomial &Pa, Polynomial &Pb){
PNode *p1 , *p2 , *p3 , *r;
p1 = Pa->next;
p2 = Pb->next;
p3 = Pa;
int sum = 0;
while(p1&&p2){
if(p1->expn == p2->expn){
sum = p1->coef+p2->coef;
if(sum != 0){
p1->coef = sum;
p3->next = p1;
p3 = p1;
p1 = p1->next;
r = p2;
p2 = p2->next;
delete r;
}else{
r = p1;
p1 = p1->next;
delete r;
r = p2;
p2 = p2->next;
delete r;
}
}else if(p1->expn < p2->expn){
p3->next = p1;
p3 = p1;
p1 = p1->next;
}else{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1?p1:p2;
delete Pb;
PrintPolyn(Pa);
}
int main(){
PNode *p1,*p2;
int n1,n2;
printf("请输入p1的项数\n");
scanf("%d",&n1);
CreatePolyn(p1,n1);
printf("请输入p2的项数\n");
scanf("%d",&n2);
CreatePolyn(p2,n2);
AddPolyn(p1,p2);
return 0;
}
3.案例2.3图书管理系统