线性表的应用——一元多项式的代数运算

本文提供了一个C语言程序,用于实现一元多项式的代数运算,包括多项式的创建、销毁、排序、打印、修改、插入、删除、加减乘等基本操作。程序中定义了Term结构体表示数据项,Polynomial结构体表示多项式,并提供了相应的函数实现各种运算。

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

/*
*	程序功能:一元多项式的代数运算
*	程序作者:Yannis Zhao
*
*/

#include<stdio.h>
#include<malloc.h>

//数据元素数据结构
typedef struct{		
	float coef;		//系数
	int expn;		//指数
}Term;

//多项式数据结构
typedef struct PolyList{
	Term term;
	struct PolyList *next;
}Polynomial;

void ShowMenu();//显示菜单
//Term结构的基本操作
float GetCoef(const Term t);	//返回数据项系数
int GetExpn(const Term t);		//返回数据项指数
int CompExpn(const Term t1,const Term t2); //比较数据项指数大小,按第一个系数小于、等于、大于第二个系数分别返回-1、0、1
float AddItem(Term *t1,const Term *t2);//两项相加,t1保存结果,返回系数
float SubtractItem(Term *t1,const Term *t2);//两项相减,t1保存结果,返回系数
Term MultiplyItem(Term t1,Term t2);//两项相乘,t1保存结果

//PolyList结构的基本操作
Polynomial* CreatePolyList();	//建立多项式
void DestroyList(Polynomial *p);//销毁多项式
void BubbleSort(Polynomial *p);//旗袍排序
void PrintPolynomial(Polynomial *p);//打印多项式
int length(Polynomial *p);//计算项数
int ChangePolynomial(Polynomial *p); //修改多项式 0--succeed 1--failure
int InsertItem(Polynomial *p,Term t);//插入项,会与已有项叠加 0--succeed 1--failure
void DeleteItem(Polynomial *p,Term t);//删除项
void AddPolyList(Polynomial *p1,const Polynomial *p2);//多项式相加,p1保存结果
void SubtractPolyList(Polynomial *p1,Polynomial *p2);//多项式相减,p1保存结果
void MultiplyPolyList(Polynomial *p1,const Polynomial *p2,Polynomial *pResult);//多项式相乘,另存结果

int main()
{
	Polynomial *p1=NULL,*p2=NULL;
	Term t;
	int choice=0;

	ShowMenu();
	while(scanf("%d",&choice))
	{
		switch(choice)
		{
		case 1:
			p1=CreatePolyList();
//			BubbleSort(p1);
			PrintPolynomial(p1);
			ShowMenu();
			break;
		case 2:
			p2=CreatePolyList();		
			PrintPolynomial(p2);
			ShowMenu();
			break;
		case 3:
			if(ChangePolynomial(p1)!=0)
			{
				printf("Polynomial changed!\n");
				BubbleSort(p1);
				PrintPolynomial(p1);
			}
			else
			{
				printf("Uncaught error!\n");
			}
			ShowMenu();
			break;
		case 4:
			if(ChangePolynomial(p2)!=0)
			{
				printf("Polynomial changed!\n");
				Pr
要使用链式存储结构(如单链表)实现一元多项式的加法运算,你需要创建三个主要的部分:节点定义、链表操作函数以及加法算法。 首先,我们定义一个节点结构体,它包含系数和指数两个字段: ```c typedef struct { double coefficient; // 系数 int exponent; // 指数 } Term; // 创建新节点的函数 Term* create_term(double coeff, int exp) { Term* new_node = (Term*)malloc(sizeof(Term)); if (new_node) { new_node->coefficient = coeff; new_node->exponent = exp; } return new_node; } ``` 接下来,我们需要链表操作函数,用于插入节点、合并链表以及输出链表: ```c // 插入节点到链表尾部的函数 void insert_to_list(Term** head, Term* term) { if (*head == NULL) { *head = term; } else { Term* current = *head; while (current->next != NULL) { current = current->next; } current->next = term; } } // 合并两个多项式链表的函数 Term* add_polynomials(Term** poly1, Term** poly2) { Term* result_head = NULL; Term* current1 = *poly1, *current2 = *poly2; while (current1 != NULL && current2 != NULL) { double sum_coeff = current1->coefficient + current2->coefficient; int max_exp = MAX(current1->exponent, current2->exponent); Term* merged_term = create_term(sum_coeff, max_exp); if (result_head == NULL) { result_head = merged_term; } else { Term* temp = result_head; while (temp->next != NULL) { temp = temp->next; } temp->next = merged_term; } if (current1->coefficient != 0 || current2->coefficient != 0) { // 防止进位丢失 current1 = current1->exponent < current2->exponent ? current2 : current1; current2 = current1->exponent < current2->exponent ? current1 : current2; } } // 如果其中一个链表未结束,则添加剩余项 if (current1 != NULL) { Term* temp = result_head; while (temp->next != NULL) { temp = temp->next; } temp->next = current1; } else if (current2 != NULL) { Term* temp = result_head; while (temp->next != NULL) { temp = temp->next; } temp->next = current2; } return result_head; } // 输出链表函数 void print_polynomial(Term* head) { Term* current = head; while (current != NULL) { printf("%.2lfx^%d ", current->coefficient, current->exponent); current = current->next; } printf("\n"); } ``` 现在你可以按照以下步骤使用这些函数: 1. 建立两个多项式的链表,比如 `poly1` 和 `poly2`。 2. 使用 `add_polynomials(&poly1, &poly2)` 函数计算它们的和。 3. 最后,调用 `print_polynomial(result_head)` 来输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值