数据结构实验--双向链表及其应用

数据结构实验一:

实验要求:

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> 
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值