数据结构与算法——列表的实现、排序与遍历(C++)

本文详细介绍了如何使用C++实现数据结构中的列表,包括ListNode节点结构体、List类的构建,以及插入排序、选择排序、归并排序三种排序方法的实现。同时,讨论了列表的遍历机制,并提供了测试输出结果。文章总结了列表相关知识,引用了邓俊辉教授的《数据结构(C++语言版)》作为参考。
摘要由CSDN通过智能技术生成

1 列表实现

1.1 ListNode节点结构体

构建列表的前提是建造一个列表节点的结构体,这个结构体表示了列表的最小单元。ListNode结构体一般包括的成员有数据,前驱与后继。

typedef int Rank; // 秩
#define ListNodePosi(T) ListNode<T>* //列表节点位置

template <typename T> struct ListNode{
   
    //成员
    T data; ListNodePosi(T) pred; ListNodePosi(T) succ;
    //构造函数
    ListNode() {
   };
    ListNode( T e, ListNodePosi(T) p = NULL, ListNodePosi(T) s =NULL)
    :data( e ), pred( p ), succ ( s ){
   }
    //操作接口 
    ListNodePosi(T) insertAsPred ( T const& e);
    ListNodePosi(T) insertAsSucc ( T const& e);
};

1.2 List类

List类是列表的主体部分,是列表得以在ListNode结构体基础上完成各项操作的地基。

#include "listnode.h"

template  <typename T> class List{
   

private:
    int _size; ListNodePosi(T) header; ListNodePosi(T) trailer;

protected:
    void init();
    int clear();
    void merge( ListNodePosi(T)&, int, List<T>&, ListNodePosi(T), int );
    void mergeSort (ListNodePosi(T)&, int);//从对p开始的连续n个节点归并排序
    void selectionSort ( ListNodePosi(T), int);//从对p开始的连续n个节点选择排序
    void insertionSort ( ListNodePosi(T) , int );//从对p开始的连续n个节点插入排序

public:
    //构造与析构
    List() {
   init();}
    ~List();

    bool empty() const{
    return _size <= 0;}
    ListNodePosi(T) last() const {
    return trailer->pred;}
    ListNodePosi(T) first() const {
    return header->succ;}
    T& operator[] (Rank r) const;//重载,支持循秩访问(效率低)
    //排序相关
    ListNodePosi(T) search( T const& e, int n, ListNodePosi(T) p) const;
    ListNodePosi(T) selectMax( ListNodePosi(T) p, int n);
    void sort( ListNodePosi(T) p, int n);
    //插入与删除
    ListNodePosi(T) insertAsFirst(T const& e);
    ListNodePosi(T) insertAsLast(T const& e);
    ListNodePosi(T) insertA(ListNodePosi(T) p, T const& e);//将e当做p的后继插入
    ListNodePosi(T) insertB(ListNodePosi(T) p, T const& e);//将e当做p的前驱插入
    T remove(ListNodePosi(T) p);//删除合法位置p处的节点,返回被删除节点


    //遍历
    void traverse (void (*)(T&) );
    template <typename VST> //操作器
    void traverse(VST&);
};//List

//默认构造方法
template <typename T> void List<T>::init(){
   
    header = new ListNode<T>;
    trailer = new ListNode<T>;
    header->succ = trailer;
    header->pred = nullptr;
    trailer->pred = header;
    trailer->succ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值