zoukankan      html  css  js  c++  java
  • void*指针实现支持所有数据类型的容器

    这其实是一次c语言课的作业。自己拓展了一下题目。

    核心就在于如何实现容器对所有数据类型的支持。我的解决方案是在初始化的时候获得数据类型的长度(sizeof),以后在添加数据的时候一个字节一个字节地拷贝。

    数据结构如下图:

    box采用的是链表+数组的做法。我把ELEMENT_NUM设为了40。

    声明如下:

    struct cInfo;
    struct cBox;
    
    struct cInfo
    {
        cBox *head,*tail;
        int blong,size;
    };
    
    struct cBox
    {
        cBox *pre,*next;
        cInfo *info;
        int move;   //使用数 = move
        void *pt;
    };
    
    void _finit( int bl,cBox &b );  // _finit( sizeof(int),head )
    void _fpush( void *data,cBox &b );
    void fprint( cBox &b,void (*fct)( void *) );   //传入一个输出函数的指针 输出一个块
    void _fprintAll( cBox &b,void (*fct)(void *));
    void* ffind( int pos,cBox &b ); //内部调用函数  找到某个位置的地址返回
    void* _fget( int pos,cBox &b ); //直接返回的是相应地址的指针,这就要求用户小心使用
    void _fchange( void *data,int pos,cBox &b );
    void _fclean( cBox &b );
    void fcopy( void *data,void *plc,int bl );   //内部调用函数
    void _finsert( int pos,void *data,cBox &b );   //在特定位置插入一个元素,如果pos>size,会被压到最后

    其中_finsert的实现方式比较特殊,它的功能是在pos位置以后加入一个元素。运行时会找到pos位置所在的相应块,如果块没满( move < ELEMENT_NUM ),就将pos对应位置一下的当前块的元素下移一个单位,然后写入新元素。如果满了,就在那个块后面加入一个0个元素的新块,把当前块的一半元素移动到新块,然后执行假设一没满时候的操作。

    PS:虽说是c的代码,但是我偷懒用了c++的引用。

    代码:

    box.h

    一个使用例子。使用了三种类型,int,double和自定义类型,只用到了压入和输出全部的功能

    box.cpp
  • 相关阅读:
    本地连接显示受限制,无法连接网络
    【Vegas原创】服务器可以上网,客户端获取DHCP后,无法上网的问题解决
    【Vegas原创】AD中域用户密码策略不生效的解决方案
    【Vegas原创】网页中英文自动/手动切换方法
    【Vegas原创】XP的administrator用户被停用的解决方法
    【Vegas原创】“光驱无法访问,函数不正确”解决方法
    去除flash边框虚框的方法代码
    【Vegas原创】远程桌面下重启xp系统的命令
    ORA00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 解决方法
    【Vegas原创】BugFree删除项目的方法
  • 原文地址:https://www.cnblogs.com/nanshu/p/2784447.html
Copyright © 2011-2022 走看看