单链表存储一元多项式[IMUT 数据结构实验]

题目

【问题描述】
利用单链表存储一元多项式。
【基本要求】
实现以下基本操作:
(1)从键盘输入一元多项式的信息,建立一元多项式。
(2)实现两个一元多项式相加,并输出和多项式。

分析

题目说是用单链表存多项式,但实际上我们应该用队列来存多项式.
多项式中的每一项可以看作是队列中的一个成员.
为了方便实现多项式的加法,在入队的时候我们不妨让多项式按照指数大小排序后再入队.
当完成这一步后,加法其实就是把B多项式的每一项在A多项式中插入或合并.
想到这里你应该就明白我定义的多项式结构体里为什么有index min max了.
B多项式中的每一项,说白了就是一个单项式.
那么单项式插入多项式有几种情况呢?
三种——指数小于A多项式的最小指数项,指数在A多项式的指数范围,指数大于A多项式的最大指数项
其中第二种可以再小小的细分一下.A中存在指数相同项,和不存在指数相同项。
讲到这里,其实问题已经解决了,下一步就是具体实现了。
先定义链表节点,再定义多项式-队列。
编写多项式队生成函数,同时编写生成函数需要的快排,快排需要的swap。
编写展示函数show。
最后实现最关键的加法add函数。
思路大致如此,具体细节参照源码。

艹,swap_float我传参传的double(大雾)

题解

#include<stdio.h>
#include<stdlib.h>

const int N = 10e4;

typedef struct node{
	double coefficient;
	int index;
	struct node *next;
}node;

typedef struct unary_polynomial{
	node *head;
	node *tail;
	int size;
	int index_min;
	int index_max;
	void(*add)(struct unary_polynomial *a,struct unary_polynomial *b);
	void(*show)(struct unary_polynomial *that);
}unary_polynomial;

void swap_int(int *a,int *b);
void swap_float(double *a,double *b);
void quick_sort(int *q,double *x,int l,int r);

unary_polynomial *unary_polynomial_creat(unary_polynomial *that);

void add(struct unary_polynomial *a,struct unary_polynomial *b);
void show(struct unary_polynomial *that);

int main()
{
	unary_polynomial a,b;
	unary_polynomial_creat(&a);
	a.show(&a);
	unary_polynomial_creat(&b);
	b.show(&b);
	a.add(&a,&b);
	a.show(&a);
	return 0;
}

void swap_int(int *a,int *b){
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void swap_float(double *a,double *b){
	double temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void quick_sort(int *q,double *x,int l,int r){
	if(l >= r)return;
	
	int mid = q[(l + r) >> 1], i = l - 1, j = r + 1;
	while(i<j)
	{
		do i++;while(q[i]<mid);
		do j--;while(q[j]>mid);
		if(i<j)swap_int(&q[i],&q[j]),swap_float(&x[i],&x[j]);
	}
	quick_sort(q, x, l, j);
	quick_sort(q, x, j + 1, r);
}


void add(struct unary_polynomial *a,struct unary_polynomial *b){
	node *p,*q1,*q2,*temp;
	p = b->head;
	int l = b->size;
	for(int i=0;i<l;i++){
		p = p->next;
		if(p->index < a->index_min){
			temp = malloc(sizeof(node));
			temp->index = p->index;
			temp->coefficient = p->coefficient;
			
			temp->next = a->head->next;
			a->head->next = temp;

			a->index_min = p->index;
			a->size++;
		}else if(p->index <= a->index_max){
			q1 = a->head;
			q2 = a->head->next;
			while(q2!=NULL){
				if(q1->index < p->index && p->index <= q2->index){
					if(p->index == q2->index){
						q2->coefficient += p->coefficient;
					}else{
						temp = malloc(sizeof(node));
						temp->index = p->index;
						temp->coefficient = p->coefficient;

						temp->next = q2;
						q1->next = temp;

						a->size++;
					}
					break;
				}else{
					q1 = q1->next;
					q2 = q2->next;
				}
			}
		}else{
			temp = malloc(sizeof(node));
			temp->index = p->index;
			temp->coefficient = p->coefficient;

			temp->next = NULL;
			a->tail->next = temp;
			a->tail = a->tail->next;

			a->index_max = p->index;
			a->size++;
		}
	}
}

void show(struct unary_polynomial *that){
	node *p = that->head;
	int l = that->size;
	for(int i=0;i<l;i++){
		p = p->next;
		if(i)printf(" + %.2f*X^%d",p->coefficient,p->index);
		else printf("%.2f*X^%d",p->coefficient,p->index);
	}
	putchar('\n');
}

unary_polynomial *unary_polynomial_creat(unary_polynomial *that){
	input_size:
	printf("请输入多项式的项数:");
	int size;scanf("%d",&size);
	if(size<1){
		printf("error:项数小于1!\n");
		goto input_size;
	}
	that->size = size;
	int idx[N];
	int idx_bool[N];
	for(int i=0;i<size;i++)idx_bool[i]=0;
	double coef[N];
	printf("请输入多项式的每一项的系数和指数(每行输入两个整数用空格分隔)\n");
	for(int i = 0;i<size;i++){
		double coefficient;
		int index;
		input_coefficient_index:
		scanf("%lf %d",&coefficient,&index);
		if(idx_bool[index]){
			printf("error:输入相同指数项式!请重新输入其他指数项式.\n");
			goto input_coefficient_index;
		}else{
			idx[i] = index;
			idx_bool[index] = 1;
			coef[i] = coefficient;
		}
	}
	printf("unary_polynomial input OK!\n");
	quick_sort(idx,coef,0,size-1);
	printf("qsort OK!\n");
	that->index_min = idx[0];
	that->index_max = idx[size-1];
	printf("index max min OK!\n");
	
	that->head = malloc(sizeof(node));
	that->head->next = NULL;
	node *p = that->head;
	for(int i=0;i<size;i++){
		node *temp = malloc(sizeof(node));
		temp->coefficient = coef[i];
		temp->index = idx[i];
		temp->next = NULL;
		
		p->next = temp;
		p = p->next;
	}
	that->tail = p;

	that->add = add;
	that->show = show;

	return that;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
符号多项式的操作,已经成为表处理的典型用例。在数学上,一个一元多项式Pn(x)可按升幂写 成: Pn(x) = p0+ p1x+ p2x2+….+ pnxn 它由n+1个系数唯一确定,因此,在计算机里,它可用一个线 性表P来表示: P = (p0 ,p1 ,p2 ,… pn)每一项的指数i隐含在其系数pi的序号里。 假设Qm(x)是一元m次多项式,同样可用线性表Q来表示:Q = (q0 ,q1 ,q2 ,… qm)。 不失一般性,设m<n,则两个多项式相加的结果 Rn(x) = Pn(x)+Qm(x)可用线性表R表示:R = (p0+q0 , p1+q1 , p2 +q2 , … , pm +qm , pm+1 ,… pn)。显然,我们可以对P、Q和R采用顺序存储结构, 使得多项式相加的算法定义十分简洁。至此,一元多项式的表示及相加问题似乎已经解决了。 然而在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难 决定。特别是在处理形如:S(x) = 1+3x10000+2x20000的多项式时,就要用一长度为20001的线性表来 表示,表中仅有三个非零元素,这种对内存空间的浪费是应当避免的,但是如果只存储非零系数项 则显然必须同时存储相应的指数。 一般情况下的一元n次多项式可写成: Pn(x) = p1x e1 + p2x e2 + … + pmx em 其中 pi,是指数为 ei 的项的非零系数,且满足 0 ≤ e1 < e2 < …< em = n,若用一个长度为 m 且 每个元素有两个数据项(系数项和指数项)的线性表便可唯一确定多项式 Pn(x)。 ((p1 ,e1) , (p2 ,e2) , … ,(pm,em)) 在最坏情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。但 是,对于 S(x)类的多项式,这种表示将大大节省空间。 本题要求选用线性表的一种合适的存储结构来表示一个一元多项式,并在此结构上实现一元多 项式的加法,减法和乘法操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值