数据结构(链表2)

链表图中的“^”符号表示所储存内容为空。 

单循环链表

末结点的next不再指向空,而是指向头结点。

 空单向循环链表,只有头结点。

 优点:从表中任何一个结点出发,都可以顺next指针访问到所有结点。

不带头结点的单循环链表

为了循环方便,不带头结点的单循环链表居多,head直接指向首结点。

 空单向循环链表,head指向空。

 双向链表

每个结点有prior和next两个指针,分别指向直接前驱和直接后继结点

 空双向链表,只有头、尾结点。

 优点:根据待查元素在前或后半段,决定自head向后还是自tail向前。

双向循环链表

不带头、尾结点的双向循环链表

 空双向链表

双向链表

插入:将元素x插入到p指针所指结点之后。

对应代码

node *tmp = new node()  //(1)

tmp->data = x;         // (2)
tmp->prior = p;        
tmp->next =p->next;    

tmp->prior->next =tmp;  // (3)
tmp->next->prior =tmp;  // (4)

 如果新结点插入在首结点位置,操作又有不同

一元多项式

在数学上,一元多项式一般表示为如下形式:

pn(x) = p0 + p1x + p2x^2 + … + pnx^n

在计算机内实现时,可以用线性表来表示:

p = ( p0,p1,p2,…, pi …,pn),其中结点pi(0≤i≤n)表示幂为i项的系数。

一元多项式存储方法

Ø一种方法是:为了表示系数和项的对应关系。

i次幂项的系数pi存放在下标为i的数组结点中,即便pi为0,相应的数组分量也不能挪作它用。

Ø另外一种处理方法是:只存储系数不为0的项,每一项除了存储它的系数,还要存储它的幂。

   两个多项式的加法处理起来比第一种方法复杂。

   用数组时,要预估一个多项式的规模,分配足够的空间。

一元多项式的链式存储

Ø每个结点存放一元多项式中的一项的信息。信息包括该项的系数和幂,零系数项不予存储。
Ø链式存储的好处是多项式的项数可以动态地增长,不存在溢出问题。
Ø用单链表表示一元多项式。在存储实现时,按照幂由小到大的原则进行,这样该单链表便成为幂有序的单链表。
Ø链表中的结点,包含两个部分:数据部分和指针部分。
Ø数据部分又包含了系数coef和幂exp二个字段。

多项式如: 

A=7+3x+9x^8+5x^17

B=8x+22x^7-9x^8

 

两个一元多项式相加

对pa和pb所指结点,反复执行如下操作,直至其中一个单链表中的结点全部读取完毕。

Ø 幂指数相等:如果这二个结点的系数之和为零,和式中不增加项,否则按照相加后的系数、相应幂指数创建一个新结点,作为和式单链表C的末结点,pa、pb后移。
Ø 指针pa幂指数小:按pa指向的结点的系数、幂指数创建一个新结点作为单链表C的末结点,pa后移,pb不变。
Ø 指针pb幂指数小:按pb指向的结点的系数、幂指数创建一个新结点作为单链表C的末结点,pb 后移,pa不变。

 将非空多项式单链表(可能是A的单链表,也可能是B的单链表)中的剩余结点,按序逐个创建新结点插入在单链表 C 的尾部

 多项式Polynomial 及其部分基本操作的声明、定义(polynomial.h)

#ifndef POLYNOMIAL_H_INCLUDED
#define POLYNOMIAL_H_INCLUDED

#include "linklist.h"
using namespace std;
struct Type
{  int coef;  // 系数                    分开定义结点的好处
    int exp;  // 幂指数
}

template <class elemType>
struct Node
{  elemType data;
    Node* next;
};
template <class elemType>
struct Polynomial
{
    private:
        Node<elemType>* head;
        elemType stop_flag; // 用于判断多项式输入结束。
    public:
        //从用户处获取结束标志并初始化多项式
        Polynomial(const elemType &stop);
        void getPoly(); //读入一个多项式。
        void addPoly(const Polynomial &L1, const Polynomial &L2);
          // L3=L1+l2。
        void dispPloy();//显示一个多项式
        void clear();//释放多项式空间
        ~Polynomial(){clear(); delete head;};  //注意此处析构函数~Polynominal()中的写法
};
// getStop为外部函数,即非类成员函数
template <class elemType>
void getStop(elemType &stopFlag)//从用户处获取结束标志
{
    int c,e;
    cout<<"请输入系数、指数对作为结束标志,如(0,0): ";
    cin>>c>>e;
    stopFlag.coef = c;
    stopFlag.exp = e;
}
template <class elemType>
Polynomial<elemType>::Polynomial(const elemType &stop)
                                                          //初始化多项式
{   head = new Node<elemType>();
    stop_flag.coef = stop.coef;
    stop_flag.exp = stop.exp;
}
 
template <class elemType>
void Polynomial<elemType>::getPoly() //读入一个多项式
{   Node<elemType> *p, *tmp;
    elemType e;
    p=head;
    cout<<“请按照指数从小到大输入系数、指数对,” <<最后输入结束标志对结束:\n";
    cin>>e.coef>>e.exp;
 
    while (true)
    {
        if ((e.coef==stop_flag.coef)&&(e.exp==stop_flag.exp)) break;
        tmp = new Node<elemType>();
        tmp->data.coef = e.coef;
        tmp->data.exp = e.exp;
        tmp->next = NULL;
        p->next = tmp;
        p=tmp;

        cin>>e.coef>>e.exp;
    }
}
template <class elemType>
void Polynomial<elemType>::addPoly(const Polynomial &La, const Polynomial &Lb)// La+Lb
{此处省略}

多项式Polynomial相加主程序(main.cpp)

#include <iostream>
#include "polynomial.h"
using namespace std;
int main()
{
	Type stop_flag;
	getStop(stop_flag);  //读入停止标志对
	Polynomial<Type> L1(stop_flag), L2(stop_flag), L3(stop_flag);
    	L1.getPoly(); //读入第一个多项式
    	L2.getPoly(); //读入第二个多项式
    	L3.addPoly(L1,L2); //L1 = L2 +L3
   	L3.dispPloy(); //显示多项式L3的内容
	return 0;
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛哥带你学代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值