多项式链表-算法设计与数据结构

来源:互联网 发布:淘宝购物群 编辑:程序博客网 时间: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
原创粉丝点击