单链表应用之一元多项式相加(C语言)

这篇博客介绍了如何使用链表数据结构来表示一元多项式,并详细阐述了如何通过有序单链表的归并操作实现多项式的相加。代码示例展示了创建、插入、打印和相加多项式的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际上一元多项式的数据结构仍然是一条单链表,不过是此时的每个结点代表多项式的每一项,结点的数据域被细分成了系数域指数域。而多项式相加的操作本质上还是有序单链表的归并操作

代码:

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

typedef struct{//项的类型(数据域)
	float coef;//系数
	int expn;//指数
} Data;

typedef struct node {//链表(一元多项式)类型
	Data data;//数据域
	struct node* next;//指针域
} node, *Polynomial;//结点,头指针

void InitList(Polynomial &P);//初始化链表
int LocateElem(Polynomial P, Data d);//返回第1个值为e的元素的位序,否则返回0
void insertNodeT(Polynomial &L, Data d);//插入节点(尾插法,先进先出)

void CreatePolyn(Polynomial &P, int m);//输入m项的系数和指数,建立表示一元多项式的有序链表P
void PrintPolyn(Polynomial P);//打印一元多项式
void AddPolyn(Polynomial &Pa, Polynomial &Pb, Polynomial &Pc);//多项式相加

int main(){
	Polynomial P1, P2, P3;
	CreatePolyn(P1, 3);
	CreatePolyn(P2, 3);
	PrintPolyn(P1);
	PrintPolyn(P2);
	
	AddPolyn(P1, P2, P3);
	PrintPolyn(P3);
}

void InitList(Polynomial &P){
	P = (Polynomial)malloc(sizeof(node));
	P->next = NULL;
}

int LocateElem(Polynomial P, Data d){
	int i = 0;
	while (P)
		if (d.expn != P->data.expn){
			++i;
			P = P->next;
		}
		else return i;
	return 0;
}

void insertNodeT(Polynomial &P, Data d){
	node *q, *p = P;
	while (p->next)
		p = p->next;
	q = (node*)malloc(sizeof(node));
	q->data = d;
	q->next = p->next;
	p->next = q;
}

void CreatePolyn(Polynomial &P, int m){
	InitList(P);
	P->data.coef = 0.0; P->data.expn = -1;//设置头结点的数据元素
	Data d;
	for (int i = 1; i <= m; i++){//依次输入m个非零项
		scanf("%f,%d", &d.coef, &d.expn);
		if (!LocateElem(P, d))
			insertNodeT(P, d);//采用尾插法插入链表
	}
}

void PrintPolyn(Polynomial P){
	P = P->next;
	printf("f(x)=");
	while (P->next){
		printf("%.1fx^%d+", P->data.coef, P->data.expn);
		P = P->next;
	}
	printf("%.1fx^%d\n", P->data.coef, P->data.expn);
}

void AddPolyn(Polynomial &Pa, Polynomial &Pb, Polynomial &Pc){
	node *a = Pa->next;//从Pa的首元结点开始比较
	node *b = Pb->next;//从Pb的首元结点开始比较
	Pc = (Polynomial)malloc(sizeof(node));//额外增加了一个头结点Pc的空间开销
	node *c = Pc;//可以看作Pc的尾指针
	while (a && b){//a,b指向的空间都不为空,则进行比较
		if (a->data.expn < b->data.expn){//当a指向结点项的指数小于b的时,将a指向结点插入Pc
			c->next = a;
			c = a;
			a = a->next;//a指向Pa链的下一个结点
		}
		else if(a->data.expn > b->data.expn){//当a指向结点项的指数大于b的时,将b指向结点插入Pc
			c->next = b;
			c = b;
			b = b->next;//b指向Pb链的下一个结点
		}
		else{//a-data.expn == b->data.expn时
			a->data.coef += b->data.coef;//加和系数到a上
			c->next = a;
			c = a;
			a = a->next;//a指向Pa链的下一个结点
			node *p = b;
			b = b->next;//b指向Pb链的下一个结点
			free(p);//释放该b结点
			p = NULL;
		}
	}
	if (!a)//Pa链已全部插入,尾指针c指向剩余Pb链
		c->next = b;
	else //Pb链已全部插入,尾指针c指向剩余Pa链
		c->next = a;
}

输出:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值