数据结构实验报告

  1. 问题描述及分析

问题描述:实现一元多项式的加法.

要求:(1)编程实现一元多项式的加法。

  1. 编写一个测试主函数

分析:对于任意一元多项式

Pn(x)=p0+p1X^1+p2X^2+...+piXi+...+pnXn

可以抽象一个为一个由“系数——指数”对构成的线性表,且线性表中各元素的指数项式递增的、p=((p0,0),(p1,1),(p2,2),...,(pn,n))

用一个单链表表示上述线性表,其结点结构为:

typedef  struct node{float  coef;//系数域int exp;//指针域struct node *next;//指针域}PloyNode;

(1)建立单链表功能

建立一个顺序表,确定DataType与Node。

(2)初始化

将单链表初始化。

(3)插入功能

输入的形式:在带头节点的单链表head的第i个(0~size)个结点前插入一个存放元素x的结点,首先要在单链表中找到ai-1结点并由指针p指示,然后动态申请一个内存单元并由指针q指示,并把元素x的值赋予新的结点的数据域(即q->data=x),最后修改新的结点的指针指向ai的结点(q->next=p->next),并修改ai-1结点的指针域使之指向新结点q(即p->next=q).

输出的形式:如果输入的参数不合法,则显示参数错误信息。

返回值:插入成功返回1,插入失败返回0。

(4)删除功能

输入的形式:要在带头结点的单链表中删除ai结点,首先要在单链表中寻找到ai-1结点并由指针p指示,然后让指针s指向ai结点(s=p->next),并把ai结点数据域赋予元素x(*x=s->data),最后把ai结点脱链(p->next=p->next->next),并动态释放ai结点的内存单元(free(s)).

输出的形式:如果输入的参数不合法或顺序表为空,则显示参数错误信息。

返回值:删除成功返回1,删除失败返回0。

(5)查找功能

输入的形式与输入值的范围:输入一个表示查找位置且小于MaxSize的非负整数。

输出的形式:如果输入的参数不合法,则显示参数错误信息。

返回值:查找成功返回1,查找失败返回0。

  1. 概要设计

1.打算采用书中的链式存储来储存多项式的各项系数和指数。使用的数据结构也和书上的一致,包含该项的系数,指数以及指向下一项的指针。

2.数据结构:

typedef struct node{int exp;                //指数float coef;             //系数struct NODE* next;    //指针域}PloyNode;

3.算法描述:

用带有头结点的线性链表表示多项式A(x),B(x),设指针hA,hB,hC分别为指向多项式链表A(x),B(x)的头指针,指针p,q的初始位置分别指向A(x),B(x)中第一项,则求A(x)+B(x)的运算过程为:比较p,q所指结点中的指数项,若EXP(p)<EXP(q),则把p节点存储的系数和指数传给C(x)新创建的一个节点,p指向下一个节点,q不动;若EXP(p)>EXP(q),则把q节点存储的的系数和指数传给C(x)新创建的一个节点,q指向下一个节点,p不动;若EXP(p)=EXP(q),则将两个结点中的系数相加,当和不为零时把这个和以及系数传给C(x)新创建的一个节点。如果有一个多项式的所有项都已经处理过,只需要把没处理完的多项式剩下的项全部加到C(x)即可。

(4)①在开始设计时,考虑到功能分块,所以写了以下几个函数:

Link Create(int num)    //用于创建多项式

Link AddPoly(Link heada, Link headb)      //多项式运算

void printpoly(Link head)    //打印(输出)

  1. 详细设计
//一元多项式相加#include <stdio.h>#include <stdlib.h>typedef struct node{int exp;                //指数float coef;             //系数struct NODE* next;    //指针域}PloyNode;Link Create(int num)        //建立一个多项式(利用尾插法){printf("\n"); //换行int tempexp = 0;        //临时指数float tempcoef = 0;     //临时系数Link head = (Link)malloc(sizeof(Node));head->next = NULL;Link rear = head;rear->next = NULL;//输入部分链接链表结点for (int i = 1; i <= num; i++){printf("请输入第%d项的次数和系数:", i);scanf("%d %f", &tempexp, &tempcoef);    //输入Link temp = (Link)malloc(sizeof(Node));temp->exp = tempexp;temp->coef = tempcoef;rear->next = temp;rear = temp;}rear->next = NULL;return head;                  //返回头结点}void printpoly(Link head)        //打印多项式{Link p = head->next;while (p != NULL){if(p->coef>0)  //如果系数是负数则加个括号printf("%.1fX^%d", p->coef, p->exp);elseprintf("(%.1f)X^%d", p->coef, p->exp);if (p->next != NULL)printf("+");         //加号的打印p = p->next;}}Link AddPoly(Link heada, Link headb)      //进行多项式相加{Link headc = (Link)malloc(sizeof(Node));headc->next = NULL;Link rear = headc;Link pa = heada->next;Link pb = headb->next;Link pc = headc->next;while (pa != NULL || pb != NULL)    //如果都为空就结束{Link temp = (Link)malloc(sizeof(Node));temp->next = NULL;if (pa != NULL && pb != NULL)    //如果都不为空就可以找到合适的项相加{if ((pa->exp) < (pb->exp) )    //b的这一项指数大{temp->exp = pa->exp;temp->coef = pa->coef;rear->next = temp;rear = temp;pa = pa->next;}else if ((pa->exp) == (pb->exp))    //指数相同{if (pa->coef + pb->coef == 0)   //系数如果加起来等于0{pa = pa->next;pb = pb->next;}else                            //系数加起来不为0{temp->exp = pa->exp;temp->coef = pa->coef + pb->coef;rear->next = temp;rear = temp;pa = pa->next;pb = pb->next;}}else if ((pa->exp) > (pb->exp) )     //a的这一项指数大{temp->exp = pb->exp;temp->coef = pb->coef;rear->next = temp;rear = temp;pb = pb->next;}}else if (pa != NULL && pb == NULL)//b多项式所有项处理完了,a还没处理完{temp->exp = pa->exp;temp->coef = pa->coef;rear->next = temp;rear = temp;pa = pa->next;}else if (pa == NULL && pb != NULL)//a多项式所有项处理完了,b还没处理完{temp->exp = pb->exp;temp->coef = pb->coef;rear->next = temp;rear = temp;pb = pb->next;}}return headc;}int main(){int n1 = 0, n2 = 0;Link hc = NULL;//创立多项式Aprintf("\n构建多项式A\n");printf("请输入多项式的项数:");scanf("%d", &n1);Link ha = Create(n1);printf("多项式A:");printpoly(ha);printf("\n");//创立多项式Bprintf("\n构建多项式B\n");printf("请输入多项式的项数:");scanf("%d", &n2);Link hb = Create(n2);printf("多项式B:");printpoly(hb);printf("\n");//计算出多项式Chc=AddPoly(ha, hb);printf("\nRESULT:\n多项式C:");printpoly(hc);return 0;}

调试与分析

该结果与预期结果一致

  1. 总结

1.一元多项式的加法,我是考虑特殊化的,默认是从小到大排序的

2.在写算法的时候没有考虑到可能多项式系数经过运算可能为负数,所以在测试时,原先如果有某一项相加结果是负数,则会出现“+-”这样的情况。所以在程序中加入判断:

if(p->coef>0)  //如果系数是负数则加个括号

printf("%.1fX^%d", p->coef, p->exp);

else

printf("(%.1f)X^%d", p->coef, p->exp);解决了问题。

3.输出时用了%.1f,控制宽度,使输出更好看

4.算法思想太特殊化了,还需改善。

实验三 一元多项式的加法相关推荐

  1. 数据结构—— 一元多项式的加法运算

    一. 需求分析 0.问题描述 在数学上,一个一元n次多项式 可按降序写成: 它由n+1个系数唯一确定,因此,在计算机里他可以用一个线性表表示: 设Pn(x)和Qn(x)分别为两个一元多项式,请求出两个 ...

  2. 计算机组成原lta,计算机组成原理实验三运算器

    <计算机组成原理实验三运算器>由会员分享,可在线阅读,更多相关<计算机组成原理实验三运算器(11页珍藏版)>请在人人文库网上搜索. 1.实验三:八位运算器组成实验一:实验目的: ...

  3. 用dsp的c54x汇编语言编写4位数的按位输出和计算,DSP实验三实验四(精).doc

    DSP实验三实验四(精).doc 实验三.文件和Gel文件的编写 一.实验目的 1. 掌握Gel文件的编写, 2. 熟悉Code Composer Studio的使用 二.实验设备 1. 集成开发环境 ...

  4. 20175212童皓桢 实验三敏捷开发与XP实践实验报告

    20175212童皓桢 实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验步骤 一.Code菜单功能的研究 Move Line/statement Down/Up:将某 ...

  5. 20175208 实验三《敏捷开发与XP实践》_实验报告

    20175208 实验三 敏捷开发与XP实践 实验报告封面: 课程:Java程序设计 班级:1752班 姓名:张家华 学号:20175208指导教师:娄嘉鹏 实验日期:2019年4月28日实验序号:实 ...

  6. 实验二 组合逻辑电路设计;实验三 时序逻辑电路设计

    文章目录 实验二 组合逻辑电路设计实验报告 实验三 时序逻辑电路设计实验报告 实验二 组合逻辑电路设计实验报告 一.实验目的 1.加深理解组合逻辑电路的工作原理. 2.掌握组合逻辑电路的设计方法. 3 ...

  7. 软件工程课程实验报告:实验三

    实验三:内部模块化的命令行菜单小程序V2.0 咖啡机<软件工程(C编码实践篇)>MOOC课程作业http://mooc.study.163.com/course/USTC-10000020 ...

  8. 实验三-密码破解技术

    学   号 201421430010   中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告   实验三 密码破解技术   ...

  9. 计算机导论excel,[计算机导论实验三Excel.doc

    [计算机导论实验三Excel 实验三 Excel表格处理 实验报告 姓名(学号):_______________ 年级(专业):_____ ________成绩:________ 实验时间:_____ ...

最新文章

  1. js 连接mysql_关于Node.js 链接mysql超时处理(默认8小时)
  2. jQuery之防止冒泡事件
  3. 产品经理如何提升自己的配色能力
  4. mysql中外键的作用是什么_mysql外键基本功能与用法详解
  5. 使用RabbitMQ实现接口补偿
  6. Linux多命令协作:管道及重定向
  7. 天气模式_北方降雪骤减!南方开启湿冷模式多阴雨!|天气展望
  8. 《springcloud超级入门》Spring Boot简介《五》
  9. 【opencv】【mediapipe】手势检测的有趣玩法
  10. UIAlertView, UIAlertViewController
  11. 多路查找树之2-3树的删除原理 - 数据结构和算法81
  12. Java课程中实际项目案例分析
  13. 网管员应该掌握好的学习方法
  14. python怎么根据度分布生成网络_python度分布图
  15. Internet网络行为学
  16. JavaScript(JS) date.getDate()
  17. 读《Jonathan von Neumann and EDVAC》
  18. python网络编程好学吗_年薪30万+的python编程难不难?好学吗?
  19. mac打开airplay(隔空播放)
  20. revit服务器维护,Revit server是什么?Revit Server 管理有问题,谁来解决、怎么解决?...

热门文章

  1. win11屏幕自动变暗的解决办法
  2. C++中cin输入空格
  3. GBase 8c 分布式高可用
  4. 把蒙娜丽莎搬到excel
  5. 线程(线程基本概念、java实现多线程、使用多线程、线程的生命周期、线程同步、线程死锁)
  6. 计算机的优势和劣势_什么是计算机二级证书?它比你想象中有用多了!
  7. 视觉SLAM:ORB视觉里程计的简单实现(一)
  8. 编译curl的动态库以及curl动态库的使用
  9. Arduino(一):LED灯的点亮熄灭和亮度控制
  10. 高通起诉苹果:要求在中国禁止生产和销售 iPhone