前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】宜宾大学-计院-实验三

【数据结构】宜宾大学-计院-实验三

作者头像
六点半就起.
发布2024-10-18 10:02:56
470
发布2024-10-18 10:02:56
举报
文章被收录于专栏:六点半就起来干博客!
线性表的应用——实现两多项式的相加

实验学时:2

实验目的:

1.掌握线性表的链式存储结构 2.能实现链表的基本操作,包括链表的建立、释放、查找、求长度、查找后继、插入、删除、输出等函数

实验内容:

在这里插入图片描述
在这里插入图片描述

实验结果:

每个同学都要记录实验结果(无论对与错),如果程序调试中有什么错误,记录并分析原因,必须另寻时间调试成功。

实验报告:(及时撰写实验报告)

实验测试结果:
在这里插入图片描述
在这里插入图片描述
代码实现:(C/C++)【含注释】
代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

//多项式项的两特征
typedef struct
{
	float coef;//系数
	int index;//指数
}polydata;

//单链表节点
typedef struct SLNode
{
	polydata data;//自定义类型(多项式的项)
	struct SLNode* next;
}SLNode, * SLNodePtr;

//比较项的指数来达到合并同类型的目的
int cmp(polydata pa, polydata pb)
{
	if (pa.index > pb.index)
		return 1;
	else if (pa.index < pb.index)
		return -1;
	else
		return 0;
}

//创建一个多项式,n为多项式的项数
void GreatSLNode(SLNodePtr& polyhead, int n)
{
	//动态开辟头节点
	polyhead = (SLNodePtr)malloc(sizeof(SLNode));
	if (polyhead == NULL) return;
	polyhead->next = NULL;

	SLNodePtr rear = polyhead;//尾指针指向头节点

	polydata tmp;
	//创建项数为n的多项式
	for (int i = 1; i <= n; i++)
	{
		SLNodePtr p = (SLNodePtr)malloc(sizeof(SLNode));
		if (p == NULL) return;
		printf("分别输入该多项式第 %d 项的系数与指数\n", i);
		//scanf_s("%f%d", &tmp.coef, &tmp.index);
		cin >> tmp.coef >> tmp.index;
		p->data.coef = tmp.coef;
		p->data.index = tmp.index;

		//更新尾节点并记得给尾的next赋NULL
		rear->next = p;
		rear = p;
		rear->next = NULL;
	}
	rear->next = NULL;//给尾的next赋NULL
}

//两多项式相加并合并同类项
SLNodePtr AddPoly(SLNodePtr pahead, SLNodePtr pbhead)
{
	//动态开辟头节点并创建尾节点指向头节点
	SLNodePtr newhead = (SLNodePtr)malloc(sizeof(SLNode));
	if (newhead == NULL) return NULL;
	SLNodePtr newrear = newhead;

	//分别找到两多项式的第一项数据即第一个有效节点
	SLNodePtr pa = pahead->next;
	SLNodePtr pb = pbhead->next;

	SLNodePtr newnode;//创建新节点待用
	float sum;//相同指数的项系数相加
	while (pa && pb)
	{
		switch (cmp(pa->data, pb->data))
		{
		case 1://指数不相等项
			newnode = (SLNodePtr)malloc(sizeof(SLNode));
			if (newnode == NULL) return NULL;
			newnode->data.coef = pa->data.coef;
			newnode->data.index = pa->data.index;
			//尾插并更新尾
			newrear->next = newnode;
			newrear = newnode;

			pa = pa->next;
			break;
		case -1://指数不相等项
			newnode = (SLNodePtr)malloc(sizeof(SLNode));
			if (newnode == NULL) return NULL;

			newnode->data.coef = pb->data.coef;
			newnode->data.index = pb->data.index;
			//尾插并更新尾
			newrear->next = newnode;
			newrear = newnode;

			pb = pb->next;
			break;
		case 0://指数相等项
			sum = pa->data.coef + pb->data.coef;
			if (sum != 0)
			{
				newnode = (SLNodePtr)malloc(sizeof(SLNode));
				if (newnode == NULL) return NULL;

				newnode->data.coef = sum;
				newnode->data.index = pa->data.index;
				//尾插并更新尾
				newrear->next = newnode;
				newrear = newnode;
			}

			pa = pa->next;
			pb = pb->next;
			break;
		}
	}
	
	//将剩余项接在最后
	if (pa)
		newrear->next = pa;
	if (pb)
		newrear->next = pb;

	return newhead;
}

//打印
void Print(SLNodePtr polynewhead)
{
	SLNodePtr tmp1 = polynewhead->next;//第一个有效节点
	while (tmp1)
	{
		printf("%.2fx^%d", tmp1->data.coef, tmp1->data.index);
		cout << " + ";
		tmp1 = tmp1->next;
	}
}
int main()
{
	//创建两个节点指针
	SLNodePtr polyhead1;
	SLNodePtr polyhead2;

	cout << "前提条件:输入多项式的“指数大小”随着“项数”的“增多而减小”,否则无法完全合并同类项" << endl;
	cout << "请输入第一个多项式" << endl;
	GreatSLNode(polyhead1, 3);
	cout << endl;
	cout << "请输入第二个多项式" << endl;
	GreatSLNode(polyhead2, 2);

	SLNodePtr newhead = AddPoly(polyhead1, polyhead2);
	cout << "输出两多项式相加后的各项系数与指数" << endl;
	Print(newhead);
	return 0;
}

1+1

=2

2+2

=4

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线性表的应用——实现两多项式的相加
  • 实验学时:2
    • 实验目的:
      • 实验内容:
        • 实验结果:
          • 实验报告:(及时撰写实验报告)
            • 实验测试结果:
            • 代码实现:(C/C++)【含注释】
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档