用循环单链表实现一元多项式加法运算

算法思想:

用函数void Creat(SLNode * head)创造两个多项式,存入两个循环单链表中,再利用void AddPoly(SLNode * p, SLNode * q,SLNode * L)将两个多项式相加。

模块划分:

  • 头文件LinList.h中包括:循环单链表的初始化、插入、创造两个存储多项式的循环单链表、让这两个多项式相加以及输出相加后的多项式的操作。
  • Main.c文件:包含一个主函数,实现对头文件中的各个函数的测试。

函数作用:

  • void ListInitiate(SLNode**head):初始化循环单链表;
  • int ListInsert(SLNode*head,int i,datatype x):在第i个元素前插入一个元素x;
  • void Creat(SLNode*head):创建一个循环单链表,由用户从键盘上输入多项式的项数、每一项的系数和次数,(要求:从键盘上输入时系数和次数之间用空格分隔),从键盘上输入完成以后,此函数便创建了一个按降幂排序的多项式;
  • AddPoly(SLNodep,SLNodeq,SLNode*L):将两个已经按降序排序的多项式相加,得到一个新的循环单链表L,L按降幂次序存储着新多项式每一项的序数和次数;
  • void Display(SLNode*L):输出循环单链表的每一项,最后屏幕上便能按降幂次序输出两个多项式相加或者相减后的结果。
我们开始写代码吧!
  • 头文件LinList.h
#include<stdio.h>
#include<malloc.h>

typedef struct{
int xishu;
int cishu;
}datatype;

typedef struct Node{
datatype data;
struct Node*next;
}SLNode;

void ListInitiate(SLNode**head){
	*head=(SLNode*)malloc(sizeof(SLNode));
	(*head)->next=*head;
}

int ListInsert(SLNode*head,int i,datatype x){
	SLNode*p,*q;
	int j;
	p=head;
	j=-1;
	while(p->next!=head && j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("插入元素位置错误!");
		return 0;
	}
	q=(SLNode*)malloc(sizeof(SLNode));
	q->data=x;
	q->next=p->next;
	p->next=q;
	return 1;
}

//将一元多项式按降幂次序存入循环单链表中
void Creat(SLNode*head){
	int i,j,m,a,tag;
	datatype x;
	SLNode*p;
	printf("请输入多项式的项数:");
	scanf("%d",&m);
	printf("请输入多项式的系数与次数:");
	scanf("%d%d",&x.xishu,&x.cishu);
	ListInsert(head,0,x);
	for(i=1;i<m;i++){
		tag=1;
		printf("请输入多项式的系数与次数:");
		scanf("%d%d",&x.xishu,&x.cishu);
		p=head->next;
		a=0;
		for(j=0;j<i;j++){
			if(p->data.cishu>x.cishu){
				p=p->next;
				a++;
			}else if(p->data.cishu == x.cishu){
				p->data.xishu=p->data.xishu+x.xishu;
				tag=0;
				break;
			}
		}
		if(tag == 1)
			ListInsert(head,a,x);
	}
}

//将多项式相加
void AddPoly(SLNode*p,SLNode*q,SLNode*L){
	SLNode*p1,*q1;
	datatype x;
	int i=0;
	p1=p->next,q1=q->next;
	while(p1!=p && q1!=q){
		if(p1->data.cishu>q1->data.cishu){
			ListInsert(L,i,p1->data);
			p1=p1->next;
			i++;
		}
		else if(q1->data.cishu>p1->data.cishu){
			ListInsert(L,i,q1->data);
			q1=q1->next;
			i++;
		}
		else if(q1->data.cishu == p1->data.cishu){
			x.xishu=p1->data.xishu+q1->data.xishu;
			x.cishu=p1->data.cishu;
			if(p1->data.xishu!=0){
				ListInsert(L,i,x);
			}
			p1=p1->next;
			q1=q1->next;
			i++;
		}
	}
	while(p1==p && q1!=q){
		ListInsert(L,i,q1->data);
			p1=p1->next;
			i++;
	}
	while(p1!=p && q1==q){
		ListInsert(L,i,p1->data);
			q1=q1->next;
			i++;
	}
}

//输出合并后的多项式
void Display(SLNode*L){
	SLNode*p;
	p=L->next;
	printf("该多项式相加后,结果为:\n");
	printf("%dX^%d",p->data.xishu,p->data.cishu);
	p=p->next;
	while(p!=L){
		if(p->data.xishu >0)
			printf("+%dX^%d",p->data.xishu,p->data.cishu);
		else if(p->data.xishu !=0)
			printf("%dX^%d",p->data.xishu,p->data.cishu);
		p=p->next;
	}
}
  • 文件Main.c
#include<stdio.h>
#include<stdlib.h>
#include"LinList.h"

int main(){
	SLNode *p,*q,*L;
	ListInitiate(&L);
	ListInitiate(&p);
	ListInitiate(&q);
	Creat(p);
	Creat(q);
	AddPoly(p,q,L);
	Display(L);
	system("pause");
	return 0;
}
代码写完了,那就试一下吧!

例如计算多项式 X5-2X2-3X+4X3+2X6 与多项式 X2-4X5+5X 的和。
在这里插入图片描述

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值