数据结构—多项式加法的链式实现(C语言)

算法思路:

1.指针p1和p2初始化,分别指向Pa,Pb首元节点;

2.p3指向多项式当前节点,初值为Pa头节点;

3.指针p1,p2均未到达相应表尾时,则循环比较p1和p2所指节点对应的指数值(p3-
>expn与p2->expn),有下列3种情况:

①当p1->expn等于p2->expn时,则将两个节点中的系数相加,若和不为0,则修改p1节点的系数值,同时删除p

2所指节点,若和为0,则删除pl和p2所指节点;

②当p1->expn小于p2->expn时,则应摘取p1所指节点插入“和多项式” 链表中;

③当p1->expn大于p2->expn时,则应摘取p2所指节点插入“和多项式” 链表中。

4.将非空多项式的剩余段插入p3所指节点之后;
5.释放Pb的头节点。 

构造链表

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

初始化链表

//初始化一个空链表 
Polynomial SetNullLink_list(){
	Polynomial head = (Polynomial)malloc(sizeof(PNode));
	if(head !=NULL)
	head->next = NULL;
	else printf("failure") ;
	return head;
} 

 多项式建立 (pre用于保存q的前驱 初值为头结点 ,q初始化,指向首元结点 )

//多项式的建立
void CreatePolyn(Polynomial &P,int n){
	PNode *p,*s,*q,*pre;
	p = (Polynomial)malloc(sizeof(PNode));//动态生成新节点 
	p->next = NULL;
	for(int i=0;i<n;i++){
		s = (Polynomial)malloc(sizeof(PNode));
		printf("依次输入系数和指数:\n");
		scanf("%d,%d",&(s->coef),&(s->expn));
		if(s->coef || s->expn){
			pre = P;//pre用于保存q的前驱 初值为头结点 
		q = P->next;//q初始化,指向首元结点 
		while(q&&q->expn<s->expn){
			pre=q;//比较新结点系数,确定插入位置 
			q=q->next; 
		}
		s->next = q;
		pre->next = s;
		}else{
			printf("输入有误,系数和指数不可同时为零"); 
		} 
	}printf("输入完成\n");
}

多项式加法

void AddPolyn(Polynomial &Pa,Polynomial &Pb){
	PNode *p1,*p2,*p3,*r;
	p1 = Pa->next;p2 = Pb->next;
	p3 = Pa;
	while (p1 && p2){
		if(p1->expn == p2->expn){
			int sum = p1->coef+p2->coef;
			if(sum){
				p1->coef = sum;
				p3->next = p1;
				p3 = p1;
				p1 = p1->next;
				r = p2; p2 = p2->next; free(r);
			}
			else{
				r = p1; p1 = p1->next; free(r);
				r = p2; p2 = p2->next; free(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;
	free(Pb);
} 

输出链表中的元素

void print(Polynomial head)   {
	PNode *p = head->next;
	while(p){
		if(p->next != NULL){
			printf("(%d,%d)\t",p->coef,p->expn);
		}
		else{
			printf("(%d,%d)\t",p->coef,p->expn);
		}
		p = p->next;
	}
}

销毁链表

void DestoryLink_List(Polynomial head) {
	PNode *pre = head, *p = pre->next;//pre保存p的前驱 
	while(p){
		free(p);
		pre = p;
		p = p->next;
	}
	free(pre);
}

全部代码

#include <Stdio.h>
#include <stdlib.h>
typedef struct PNode{
	int coef; //系数
	int expn;  //指数
	struct PNode *next; 
}PNode,*Polynomial;

//初始化一个空链表 
Polynomial SetNullLink_list(){
	Polynomial head = (Polynomial)malloc(sizeof(PNode));
	if(head !=NULL)
	head->next = NULL;
	else printf("failure") ;
	return head;
} 

//多项式的建立
void CreatePolyn(Polynomial &P,int n){
	PNode *p,*s,*q,*pre;
	p = (Polynomial)malloc(sizeof(PNode));//动态生成新节点 
	p->next = NULL;
	for(int i=0;i<n;i++){
		s = (Polynomial)malloc(sizeof(PNode));
		printf("依次输入系数和指数:\n");
		scanf("%d,%d",&(s->coef),&(s->expn));
		if(s->coef || s->expn){
			pre = P;//pre用于保存q的前驱 初值为头结点 
		q = P->next;//q初始化,指向首元结点 
		while(q&&q->expn<s->expn){
			pre=q;//比较新结点系数,确定插入位置 
			q=q->next; 
		}
		s->next = q;
		pre->next = s;
		}else{
			printf("输入有误,系数和指数不可同时为零"); 
		} 
	}printf("输入完成\n");
}

//多项式加法
void AddPolyn(Polynomial &Pa,Polynomial &Pb){
	PNode *p1,*p2,*p3,*r;
	p1 = Pa->next;p2 = Pb->next;
	p3 = Pa;
	while (p1 && p2){
		if(p1->expn == p2->expn){
			int sum = p1->coef+p2->coef;
			if(sum){
				p1->coef = sum;
				p3->next = p1;
				p3 = p1;
				p1 = p1->next;
				r = p2; p2 = p2->next; free(r);
			}
			else{
				r = p1; p1 = p1->next; free(r);
				r = p2; p2 = p2->next; free(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;
	free(Pb);
} 

//输出链表中的元素
void print(Polynomial head)   {
	PNode *p = head->next;
	while(p){
		if(p->next != NULL){
			printf("(%d,%d)\t",p->coef,p->expn);
		}
		else{
			printf("(%d,%d)\t",p->coef,p->expn);
		}
		p = p->next;
	}
}

//销毁链表
void DestoryLink_List(Polynomial head) {
	PNode *pre = head, *p = pre->next;//pre保存p的前驱 
	while(p){
		free(p);
		pre = p;
		p = p->next;
	}
	free(pre);
}

int main(){
	Polynomial head1 = NULL,head2 = NULL;
	head1 = SetNullLink_list();
	head2 = SetNullLink_list();
	CreatePolyn(head1,4);
	CreatePolyn(head2,4);
	AddPolyn(head1,head2);
	print(head1);
}

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值