多项式链表-算法设计与数据结构
来源:互联网 发布:淘宝购物群 编辑:程序博客网 时间:2024/05/16 05:19
借鉴了大神的思路与代码,主要还是运用来书上的,C语言是小白的我学会了结构的使用方法,有了更多的理解,
对这些代码进行了学习理解与改进,感觉不错
list.h
typedef struct {int Coefficient;//系数 int Exponent;//指数 }ElementType;//针对多项式的结构声明,不知道是否可以调换,MARK并尝试;事实上必须声明#ifndef _List_H #define _List_H struct Node;//要在之后的cpp中定义typedef struct Node *PtrToNode;typedef PtrToNode List;typedef PtrToNode Position;List CreatList();//创建列表List MakeEmpty(List L);//清空列表int IsEmpty(List L);//判断列表是否为空int IsLast(Position P, List L);//判断是否为末尾Position Find(ElementType X, List L);//寻找函数void Delete(ElementType X, List L);//删除函数Position FindPrevious(ElementType X, List L);//删除某项的前一项void Insert(ElementType X, Position P);//插入void DeleteList(List L);//删除Position Header(List L);//开头Position First(List L);//第一个Position Advance(Position P);//前面一项ElementType Retrieve(Position P);//重现实体void deleteNext(Position p);//删除下一项#endif
list.cpp
#include<stdlib.h>#include"listown.h" struct Node{ElementType Element;Position Next;};//把node定义出来//因为struct涉及到两个量,所以我们设计一个cmpint elementcmp(ElementType e1,ElementType e2){returne1.Coefficient == e2.Coefficient&&e1.Exponent == e2.Exponent;}List CreatList(){List list = (Position)malloc(sizeof(struct Node));//申请内存,注意进行强制类型转换if (list == NULL){perror("out of memory");//报错检验}list->Next = NULL;return list;};//创建列表List MakeEmpty(List L){if (L == NULL)perror("List is not exist");DeleteList(L);L->Next = NULL;return L;};//清空列表int IsEmpty(List L){return L->Next == NULL;};//判断列表是否为空int IsLast(Position P, List L){return P->Next == NULL;};//判断是否为末尾Position Find(ElementType X, List L){Position P;P = FindPrevious(X,L);while (P!=NULL && elementcmp(P->Element,X)){P = P->Next;}return P;};//寻找函数void Delete(ElementType X, List L){Position P;P = FindPrevious(X, L);if (!IsLast(P,L)){Position temp = P->Next;P->Next = temp->Next;free(temp);}};//删除函数Position FindPrevious(ElementType X, List L){Position P;P = L;while (P->Next != NULL && elementcmp(P->Next->Element, X)){P = P->Next;}return P;};//删除某项的前一项void Insert(ElementType X, Position P){Position temp;temp = (List)malloc(sizeof(struct Node));if (temp == NULL)perror("out of space");temp->Element = X;temp->Next = P->Next;P->Next = temp;};//插入void DeleteList(List L){Position P;P = L->Next;while (P!=NULL){Position temp;temp = P->Next;free(P);P = temp;}L->Next = NULL;};//删除Position Header(List L){return L;};//开头Position First(List L){return L->Next;};//第一个Position Advance(Position P){return P->Next;};//后面一项ElementType Retrieve(Position P){return P->Element;};//重现实体void deleteNext(Position P){Position temp;temp = P->Next;P->Next = temp->Next;free(temp);};//删除下一项
polynomial.cpp
#include"polynomialown.h"#include<stdio.h>struct Node{ElementType Element;Position Next;};//把node定义出来Polynomial creatPolynomial(){return CreatList();};//创造一个多项式void insertMonomials(ElementType e, Polynomial poly){Position P = poly;while (P->Next != NULL && Advance(P)->Element.Exponent > e.Exponent) P = P->Next;//如果不采取参考代码中的结构定义多项式,就会出现指针指向不完整的类这个问题,事实上是因为开始没有给出NODE的定义if (Advance(P) == NULL || (Advance(P)->Element.Exponent!=e.Exponent))Insert(e, P);//如果是末项或者不存在的幂次项直接加入else{Advance(P)->Element.Coefficient += e.Coefficient;//同幂系数相加if (Advance(P)->Element.Coefficient==0){deleteNext(P);}//等于0就删掉}}//添加一个项e到多项式polyvoid inputPolynomial(Polynomial Poly){int co, exp; ElementType monomials; int i = 1;printf("请输入多项式的系数和次数,输入字母就退出:\n输入第1个单项式的系数: ");while ( (scanf_s("%d", &co) == 1)){printf("输入第%d个单项式的指数 :",i);if (scanf_s("%d", &exp) != 1)break;monomials.Coefficient = co;monomials.Exponent = exp;insertMonomials(monomials, Poly);i++;printf("输入第%d个单项式的系数 :", i);//printf("+");}while (getchar()!=NULL);};//输入一个多项式void ZeroPolynomial(Polynomial Poly){MakeEmpty(Poly);};//归零一个多项式Polynomial AddPolynomial(const Polynomial Poly1, const Polynomial Poly2){Polynomial temp;temp = Poly2;Position P1 = Poly1->Next;Position P2 = temp->Next;while (P1&&temp){while (P1){insertMonomials(P1->Element,temp);P1 = P1->Next;}}//类加return temp;};//加法//可能有BUGPolynomial MulPolynomial(const Polynomial Poly1, const Polynomial Poly2){Polynomial PolyProd;PolyProd = creatPolynomial();ElementType prod;for (Position i = Poly1->Next; i != NULL; i = Advance(i)){for (Position j = Poly2->Next; j != NULL; j = Advance(j)) {prod.Coefficient = Retrieve(i).Coefficient * Retrieve(j).Coefficient;//再现prod.Exponent = Retrieve(i).Exponent + Retrieve(j).Exponent;if (prod.Coefficient != 0)insertMonomials(prod, PolyProd);}//遍历}return PolyProd;//};//乘void printAll(Polynomial poly){Position p = Advance(poly);printf("这是您要输出的多项式\n %dx^%d", Retrieve(p).Coefficient, Retrieve(p).Exponent);p = Advance(p);while (p) {if (Retrieve(p).Coefficient > 0)putchar('+');if (Retrieve(p).Coefficient < 0)putchar('-');printf("%dx^%d", Retrieve(p).Coefficient, Retrieve(p).Exponent);p = Advance(p);}printf("\n");};//输出一个多项式
polynomial.h
#pragma once#include<stdlib.h> #include"listown.h" /*typedef struct {List list;}Polynomial;//简化多项式定义*/typedef List Polynomial;Polynomial creatPolynomial();//创造一个多项式void insertMonomials(ElementType e, Polynomial poly);//添加一个项e到多项式polyvoid inputPolynomial(Polynomial Poly);//输入一个多项式void ZeroPolynomial(Polynomial Poly);//归零一个多项式Polynomial AddPolynomial(const Polynomial Poly1, const Polynomial Poly2);//加Polynomial MulPolynomial(const Polynomial Poly1, const Polynomial Poly2);//乘void printAll(Polynomial poly);//输出一个多项式
apply for poly.c
#include"polynomialown.h" #include<stdio.h> int main() {Polynomial p1, p2, p3;p1 = creatPolynomial();p2 = creatPolynomial();p3 = creatPolynomial();inputPolynomial(p1);printf("A=");printAll(p1);inputPolynomial(p2);printf("B=");printAll(p2);p3=MulPolynomial(p1, p2);printf("乘的结果\n");printAll(p3);p3 = AddPolynomial(p1, p2);printf("加的结果\n");printAll(p3);system("pause");}
阅读全文
0 1
- 多项式链表-算法设计与数据结构
- 新手学习数据结构与算法---链表多项式
- POJ-数据结构与算法-线性表 多项式加法
- 数据结构入门学习系列-6(链表合并与多项式合并算法)
- 数据结构与算法——多项式加法
- [数据结构] 链表实现多项式
- 《数据结构》--和多项式链表
- [数据结构与算法]第一周(一):线性表---多项式加法&&字符串插入
- C算法与数据结构-线性表的应用,多项式求和---ShinePans
- 数据结构与算法MOOC / 第2周 线性表(Linear Lists) 2:多项式加法
- C++算法与数据结构学习笔记------单链表实现多项式
- 数据结构与算法之——多项式加减
- 算法分析与设计-02-勒让德多项式的递归算法
- 数据结构与算法-实验1-多项式的计算:合并同类项、升幂排序、多项式加法、减法、乘法
- 数据结构和算法C语言实现:使用链表实现稀疏多项式
- 数据结构和算法C++语言实现:使用链表实现稀疏多项式
- 算法:一元多项式的表示及相加(链表实现)-数据结构(4)
- 数据结构——单链表,多项式链表
- propagation定义了7个事物传播行为
- caffe学习(四):py-faster-rcnn配置,运行测试程序(Ubuntu)
- Spring是什么?谈谈自己的见解
- 百度笔试题:malloc/free与new/delete的区别
- vue.js 单文件组件 .vue文件
- 多项式链表-算法设计与数据结构
- BufferedInputStream(缓冲输入流)详解
- 大前端-代码优化
- C#基础-021 利用for循环打印图形
- Source insight 3.5注册码
- HIBERNATE与 MYBATIS的对比版本
- Java集合 介绍二
- 论文格式
- 图解VIM常用操作