链表图中的“^”符号表示所储存内容为空。
单循环链表
末结点的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,相应的数组分量也不能挪作它用。
两个多项式的加法处理起来比第一种方法复杂。
用数组时,要预估一个多项式的规模,分配足够的空间。
一元多项式的链式存储
 
多项式如:
A=7+3x+9x^8+5x^17
B=8x+22x^7-9x^8
 
两个一元多项式相加
对pa和pb所指结点,反复执行如下操作,直至其中一个单链表中的结点全部读取完毕。
将非空多项式单链表(可能是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;
} 










![[综][PDPTW]A survey on pickup and delivery problems](https://img-blog.csdnimg.cn/1e736345a94a4beb9a6e12e20483629d.png)








