数据结构实验一:
实验要求:
1.编写使用freelist的带头、尾节点的双向链表类的定义,实现双向链表的基本操作。
2.利用双向链表实现2个一元多项式的加法和乘法运算,运算结果得到的链表要求按照指数降序排列的多项式。
例如:
输入格式:
3 2 //第一行,两个正整数分别表示多项式的项数
5 4 //输入第一个多项式各项的系数和指数,按指数降序输入
-3 2
1 0 //第一个多项式:5x4-3x2+1
6 2 //输入第二个多项式各项的系数和指数,按指数降序输入
-3 1 //第二个多项式:6x2-3x
输出格式:
4 //相加得到的多项式的项数
5 4 //每一项的系数与指数,按指数降序排列输出
3 2
-3 1
1 0 //和:5x4+3x2-3x+1
6 //相乘得到的多项式的项数
30 6
-15 5
-13 4
9 3
6 2
-3 1 //乘积:30x6-15x5-13x4+9x3+6x2-3x
一、思路分析
1.双向链表的实现
其实带头尾节点的双向链表实现并不算困难,但是本次实验重点是在于对freelist的应用。freelist可以看作一个链栈,所有取出、归还空结点都在一段进行。具体代码的说明注释中已经相当清楚。
代码如下:
#include <iostream>
using namespace std;
//Double linked list link node with freelist support
template <typename E>
class Link
{
private:
static Link<E> *freelist; //Reference to freelist head
public:
E element1; //系数和次数
E element2;
Link *next; //Pointer to next node in list
Link *prev; //Pointer to previous node
//Constructors
Link(const E &e1, const E &e2, Link *prevp = NULL, Link *nextp = NULL)
{
element1 = e1;
element2 = e2;
prev = prevp;
next = nextp;
}
Link(Link *prevp = NULL, Link *nextp = NULL)
{
prev = prevp;
next = nextp;
element1=NULL;
element2=NULL;
}
// Destructor
~Link() {
}
void *operator new(size_t) //Overloaded new operator
{
if (freelist == NULL)
return ::new Link; //Create space
Link<E> *temp = freelist; //Can take from freelist
freelist = freelist->next;
return temp; //Return the link
}
//Overloaded delete operator
void operator delete(void *ptr)
{
((Link<E> *)ptr)->next = freelist; //Put on freelist
freelist = (Link<E> *)ptr;
}
};
template <typename E>
Link<E> *Link<E>::freelist = NULL; // 将freelist置为空
template <typename E>
class DoubleList
{
public:
Link<E> *head; //Pointer to list header
Link<E> *tail; //pointer to last element
Link<E>