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

借鉴了大神的思路与代码,主要还是运用来书上的,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涉及到两个量,所以我们设计一个cmp
int elementcmp(ElementType e1,ElementType e2)
{
	return
		e1.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到多项式poly
void 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;
};//加法//可能有BUG
Polynomial 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到多项式poly
void 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");
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值