第二章 线性表(2.8)

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图书管理系统

posted @ 2022-02-10 16:17    阅读(44)  评论(0)    收藏  举报