线性表存储和操作


书本当然是严奶奶的那本《数据结构(C语言版)》

参考代码:《数据结构》算法实现及解析(高一凡)


本文主要还是对这两位大神的东西整理一下,其实哈哈,还是代码的搬运工(逃)


/***********线性表的动态分配顺序存储结构***********
 ******制作人:Guosam   *********
 *****日期:2015/5/20   *********/

#define List_init_size 10 //线性表存储空间的初始分配量
#define List_increment 2  //线性表存储空间的分配增量

struct SqList
{
    ElemType *elem; //存储空间基址
    int length; //当前长度
    int listsize //当前分配的存储容量(以sizeof(Elemtype)为单位)
};


/*************线性表基本操作*******************/

 ******制作人:Guosam   *********
************日期:/2015/5/20*******************/

void InitList(SqList &L)
{    //建空表
    L.elem=(ElemType*)malloc(LIST_INIT_SIZE)
    if(!L.elem)
        exit(OVERFLOW); //存储分配失败
    L.length=0;  //空表长度为0
    L.listsize=LIST_INIT_SIZE; //初始存储容量
}

void DestroyList(SqList &L)
{
    //销毁表
    free(L.elem);
    L.elem=NULL;
    L.length=0;;
    L.listsize=0;
}

void ClearList(SqList &L)
{
    //清空表
    L.length=0;
}

Status ListEmpty(SqList L)
{
    //判表空
    if(L.length==0)
        return True;
    else
        return false;
}

Status ListLength(SqList L)
{
    //取表长
    return L.length;
}

Status GetElem(SqList L,int i,ElemType &e)
{
    //读元素
    if(i<1||i>L.length)
        return ERROR;
    e=*(L.elem+i-1);
    return e;
}

status LocateElem(SqList L,ElemType e ,status(*compare)(ElemType, ElemType)) //z这里compare是回调函数的格式,比较大小
{
        //查找元素
        ElemType *p;
        int i=1;
        p=L.elem;
        while(i<=L.length&&compare(*p++,e))
        {
            ++i;
        }
        if(i<=L.length)
                return i;
        else
                return 0;
}

Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{
    //找前驱
    int i=2;
    ElemType *p=L.elem+1;
    while(i<=L.length&&*p!=cur_e)
    {
        p++;
        i++;
    }
    if(i>L.length)
        return INFEASIBLE;
    else
    {
        pre_e=*--p;
        return pre_e;
    }
}

Status Next(SqList L,ElemType cur_e,ElemType &next_e)
{
    //找后继
    int i=1;
    ElemType *p=L.elem+1;
    while(i<=L.length&&*p!=cur_e)
    {
        p++;
        i++;
    }
    if(i>L.length)
        return INFEASIBLE;
    else
    {
        pre_e=*++p;
        return next_e;
    }
}

Status ListInsert(SqList &L,int i,ElemType e)
{
    //插入
    ElemType *newbase,*q,*p;
    if(i<1||i>L.length+1)
        return ERROR;
    if(L.length>=L.listsize)
    {
        if(!newbase=(ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType))))
            exit(OVERFLOW);
        L.elem=newbase;
        L.listsize+=LIST_INCREMENT;
    }
    q=L.elem+i-1;
    for(p=L.elem+L.length-1;p>=q;--p)
    {
        *(p+1)=*p;
    }
    *q=e;
    ++L.length;
    return e;
}

Status ListDelete(SqList &L,int i,ElemType e)
{
    //删除
    ElemType *q,*p;
    if(i<1||i>L.length)
        return ERROR;
    q=L.elem+i-1;
    e=*q;
    for(p=L.elem+L.length-1;q<=p;--p)
    {
        *(p-1)=*p;
        L.length--;
    }
    return e;
}

void ListTraverse(SqList L,void (*vi)(ElemType&))
{
    //遍历表
    ElemType *p;
    int i;
    p=L.elem;
    for(i=1;i<=L.length;i++)
        vi(*p++)
    printf("\n");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值