`
hongbochen1223
  • 浏览: 44016 次
文章分类
社区版块
存档分类
最新评论

C++实现的间接寻址

 
阅读更多

之前学过,数据描述方法中有公式化描述,链表描述,间接寻址和模拟指针,在之前已经将公式化描述和链表描述通过代码的形式展现出来了,现在贴出简介寻址的代码。其中简介寻址是融合了公式化描述和链表描述的有点,使用一个指针表来记录数据的位置,指针表相当于一个数组,这样在插入,删除的时候,其中的数据的位置并没有发生变化,而仅仅就是指针表的指向发生了变化,同时很多操作又能像公式化一样通过O(1)的复杂度进行操作。下面贴出我的代码:
其中的Exception.h请参考之前的代码:

#ifndef _INDIRECT_H_
#define _INDIRECT_H_

#include "Exception.h"
#include <iostream>

template<class T>
class IndirectList{
public:
    IndirectList(int MaxListSize=10);
    ~IndirectList();

    /*如果length=0,则链表为空*/
    bool isEmpty() const{return length == 0;}

    /*返回链表的长度*/
    int Length() const {return length;}

    /*看能否找到第k个元素,找到后给x赋值*/
    bool Find(int k,T& x) const;

    /*找到元素是x的元素的位置*/
    int Search(const T& x) const;

    /*从链表中删除第k个元素,并赋值给x*/
    IndirectList<T>& Delete(int k,T& x);

    /*在链表的第k个位置插入元素x*/
    IndirectList<T>& Insert(int k,const T& x);

    /*打印输出整个链表*/
    void print();
private:
    int length;  //链表的长度
    int MaxSize;  //链表的最大长度
    T **table;     //模拟指针表
};

template<class T>
IndirectList<T>::IndirectList(int MaxListSize)
{
    this->MaxSize = MaxListSize;  //获取最大长度
    table = new T*[MaxSize];  //初始化模拟指针
    length = 0;     //设置当前长度为0
}

template<class T>
IndirectList<T>::~IndirectList()
{
    for(int i = 0;i < length;i++)
        delete table[i];  //删除模拟指针
    delete [] table;
}

template<class T>
bool IndirectList<T>::Find(int k, T &x) const
{
    if(k < 1 || k > length)
        throw OutOfBounds();   //越界了

    x = *table[k-1];

    return true;
}

template<class T>
IndirectList<T>& IndirectList<T>::Delete(int k, T &x)
{
    if(Find(k,x)){
        for(int i = k;i < length;i++) {
            /*第k个元素之后的元素向前移动一个*/
            table[i-1] = table[i];
        }

        length--;  //当前长度减一
        return *this;
    }else{
        throw OutOfBounds();
    }
}

template<class T>
IndirectList<T>& IndirectList<T>::Insert(int k, const T &x)
{
    if(k < 0 || k > length)
        throw OutOfBounds();  //越界
    if(length == MaxSize)
        throw NoMem();  //已经到达最大长度了

    for(int i = length-1;i >= k;i--){
        /*第k个元素之后的元素向后移动一位*/
        table[i+1] = table[i];
    }

    /**
     * 新建一个间接地址
     */
    table[k] = new T;
    *table[k] = x;

    length++;

    return *this;
}

template<class T>
int IndirectList<T>::Search(const T &x) const
{
    for(int i = 0;i < length;i++){
        if(*table[i] == x){
            return i+1;
        }
    }

    return -1;
}

/**
 * 打印输出整个链表的内容
 */
template<class T>
void IndirectList<T>::print()
{
    for(int i = 0;i < length;i++){
        std::cout << *table[i] << " ";
    }

    std::cout << std::endl;
}

#endif

代码相对来说比较简单,只不过其中比较难懂的就是
T** table,其中table指向的是T**,
table指向的是T,也就是数据T的地址,由此可知table指向的是数据的地址的地址,进行一个间接寻址,这个类似于计算机组成原理上的简介寻址。
好好体会一下,就会明白的!!加油!!

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    数据结构C++描述

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    数据结构算法与应用(C++语言描述).rar

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    数据结构与算法:C++描述

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    C++语言描述(PDF合集)

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    数据结构算法与应用-C++语言描述

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    909数据结构.doc

    3、数据描述 掌握线性表的公式化描述、链表描述、间接寻址等存储方法,了解遍历器的作用和实 现方法,掌握插入、删除、合并等运算方法。 掌握箱子排序、基数排序 4、数组和矩阵 掌握对角矩阵、三对角矩阵、三角矩阵...

    数据结构 C++描述

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    数据结构算法与应用-C C++语言描述

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    数据结构、算法与应用--C++语言描述

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    数据结构算法与应用-C++语言描述.rar

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 ...

    DataStructe-Algorithms_Study:研究DataStructe和算法时的一些实践

    数据描述3-间接寻址&模拟指针 数组和矩阵 1维数组 矩阵 特殊矩阵 稀疏矩阵--数组描述 稀疏矩阵--链表描述 相关知识点笔记: 数组和矩阵1--数组 数组和矩阵2-矩阵 数组和矩阵3-特殊矩阵 数组和矩阵4--稀疏矩阵 堆栈 ...

    SIC-XE-assembler:SICXE 汇编器子集的交叉汇编器,用 CC++ 编写,为 SICXE 编程中使用的绝对加载器生成代码

    SIC-XE-汇编程序 SIC/XE 汇编器子集的交叉汇编器,用 C/C++ 编写,为 SIC/XE 编程中使用的绝对加载器生成代码。... -3 字节 PC 相对符号操作数,包括立即寻址、间接寻址和索引寻址。 -3 字节绝对值,带有

    数据结构算法与应用 很详细的,数据结构算法全集 这个是你想找的

    数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 ...间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106...

    数据结构算法与应用-C__语言描述

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    数据结构(C语言描述)

    3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 ...

    The Art of Assembly Language

    3.2 80x86的寻址方式 3.3 运行时存储器的结构 3.4 HLA如何为变量分配内存 3.5 HLA对数据对齐的支持 3.6 地址表达式 3.7 类型强制转换 3.8 寄存器类型强制转换 3.9 栈段与PUSH及POP指令 3.10 动态内存分配和堆段 3.11...

Global site tag (gtag.js) - Google Analytics