数据结构与算法(线性表)

41 阅读2分钟

----------------2023.8.23---------------

线性表的常见算法包括对顺序表和对链表的,本篇文章主要对单链表常见算法或题型进行讨论。

1.多项式的运算

对于多项式的运算,我们可以分为稠密多项式和稀疏多项式,二者的差距在于未知数x的指数分布情况,当指数分布情况稠密时,可以直接通过数组进行存储,将数组下标于指数进行一一对应,数组值于未知数系数对应,再完成相应操作即可;当指数分布过于稀疏,显然不实用于数组,于是采用链表进行存储,存储结构如下所示。

typedef struct  PNode{
	float coef;        //系数
	int expn;          //指数
	struct PNode *next;//指针域
}PNode,*Polynomial;

要实现多项式的相加,首先需要创建多项式。

1.1多项式的创建

多项式的创建实际与普通链表创建过程相似,但在创建时,需要对指数进行非递减的排序,所以每次插入新结点时,需要对插入位置进行一个选择。

void CreatePolyn(Polynomial &P,int n){
	P = new PNode ;
	P->next = NULL;
	for(i =1;i<=n;i++){
		s = new PNode;
		cin>>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;
	}
}

1.2 多项式的相加

创建完成两个多项式链表后,就可以进行加法运算了。在计算时,我们会遇到不同指数的项相加,我们就需要对相加的指数先进行判断,如果同次幂相加,系数相加完成后,需要判断当前次幂的系数是否为0,如果为0,则要将该结点删除;如果不同次幂,则无需加法操作,直接按照升幂排列,插入多项式中即可。

void AddPolyn(Polynomial &Pa,Polynomial &Pb){
	p1 = Pa->next;p2 = Pb->next;
	p3 = Pa;
	while(p1&&p2){
		//相加时,会有以下三种情况
		if(p1->expn == p2->expn){
			sum = p1->coef + p2->coef;
			//相加后系数是否为0要分情况讨论
			if(!sum){
				p1->coef = sum;
				p3->next = p1;p3 = p1;
				p1 = p1->next;
				r = p2;p2 = p2->next;delete r;//删除Pb当前结点	
			}else{
				r = p1;p1=p1->next;delete r;
				r = p2;p2=p2->next;delete r;
			}
		}
		//按照升幂排列,所以p3应该指向指数更小的结点
		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;
}