数据结构之数组和广义表

1. 数组的顺序存储表示:用一维数组按约定次序(一般为行序)来表示多维数组。

#include <iostream>
#include <stdarg.h>
using namespace std;

#define OK 1
#define ERROR -1
#define OVERFLOW -1
typedef int Status;

#define MAX_ARRAY_DIM 8//数组维数最大是8
template <class T>
struct Array{
    T *base;
    int dim;//维数
    int *bounds; //各维长度
    int *constants;//映像函数,保存每个位置的offset

    Array(int dim,...)
    {
        if(dim<1||dim>MAX_ARRAY_DIM)
            cout<<"维数超限"<<endl;
        this->dim=dim;
        bounds=new int[dim];
        int totalelem=1; //元素总个数
        va_list args;//存放变长参数表的数组
        va_start(args,dim);
        for(int i=0;i<dim;i++)
        {
            bounds[i]=va_arg(args,int);
            if(bounds[i]<0)cout<<"元素长度错误"<<endl;
            totalelem*=bounds[i];
        }
        va_end(args);
        base=new T[totalelem];
        //求映像函数的常数ci
        constants=new int[dim];
        constants[dim-1]=1;
        for(int i=dim-2;i>=0;i--)
            constants[i]=bounds[i+1]*constants[i+1];
    }
    Status Destroy()
    {
        delete base;
        delete bounds;
        delete constants;
        return OK;
    }
    int IndexOfArray(va_list args)
    {
        //把输入的下标转换为数组索引值
        //va_start(args,dim);
        int index=-1;
        for(int i=0;i<dim;i++)
        {
            int ind=va_arg(args,int);
            if(ind<0||ind>=bounds[i])
                cout<<"索引错误"<<endl;
            index+=constants[i]*ind;
        }
        return index;
    }
    T Elem(...)
    {
        va_list args;
        va_start(args,dim);
        int index;
        if(index=IndexOfArray(args)<0)return ERROR;
        return base[index];
    }
    Status Assign(T e,...)
    {
        va_list args;
        va_start(args,dim);
        int index;
        if(index=IndexOfArray(args)<0)return ERROR;
        base[index]=e;
        return OK;
    }
};

int main()
{
    Array<int> *a=new Array<int>(2,3,2);
    a->Assign(10,0,1);
    cout<<a->Elem(0,1);
}

1. 广义表的存储结构:通常为链式,每个数据元素可用一个结点表示。


#include <iostream>
using namespace std;

enum ElemType{//表示结点类型
    ATOM, //原子
    LIST  //子表
};
typedef struct GLNode
{
    ElemType type;//结点类型
    union
    {
        int atom;
        struct{GLNode*hp,*tp;}ptr;
    };
}*GList;
int main()
{
    GList l;
    l=new GLNode();
    l->atom=10;
    cout<<l->atom;
}

猜你喜欢

转载自blog.csdn.net/qq_35503380/article/details/80670051