《数据结构与算法》——表、栈和队列(顺序表)

线性表:
线性表是最基本和常用的一类数据结构,它表示线性结构。
在线性结构中,数据元素之间存在着一对一的关系,其特点是数据元素之间按某种规定存在一个顺序关系。
线性表的两种存储结构:顺序表和链表。
定义: n个同类型数据元素的有限序列,记为:L=(a1,a2,a3…,ai…,an)。其中,n=0时为空表。
数据元素之间的关系: a(i-1)是ai的直接前驱,a(i+1)是ai的直接后继,除第一个元素外,均有唯一的前驱;除最后一个元素外,均有唯一的后继。
基本操作: 结构初始化、结构销毁、引用型、操作型。
初始化和销毁:

Status List_Init(sq L);
void List_Clear(sq L);
void List_Destroy(sq L);

引用型:

bool List_Empty(sq L);//判断是否为空
int List_Size(sq L);//求长度
Status List_Retrival(sq L,int pos,ElemType *elem);//从线性表pos位置中取出数据放到elem指针中
Status List_Locate(sq L,ElemType elem, int *pos);//在线性表L中定位elem的位置,把位置放到pos指针中
Status List_Prior(sq L,int pos ElemType *elem);//求线性表L中pos位置上数据的直接前驱
Status List_Next(sq L,int pos ElemType *elem);//求线性表L中pos位置上数据的直接后继

加工型:

Status List_Insert(sq L,int pos,ElemType elem);
Status List_delete(sq L,int pos);

线性表的顺序存储结构: 用一组地址连续的存储单元,依次存放线性表中的数据元素。
优势:随机存取数据。
在这里插入图片描述
实现顺序存储:

#define list_init_size 100//定义线性表空间大小
#define list_increament 10//定义空间增量大小
typedef int ElemType;
typedef struct sq{
ElemType *elem;
int length;//线性表长度,初始时为空
int list_size;//线性表空间大小
}sq,*p;
typedef p sq;

创建线性表:
时间复杂度:O(1)

Status list_init(sq L){
    Status s=success;
    L->list_size=list_init_size;
    L->length=0;//初始化线性表长度
    L->elem=(ElemType *)malloc(sizeof(ElemType)*L->list_size);
    if(L->elem==NULL)//若分配内存失败,返回fatal,严重错误
        s=fail;
    return s;
}

按位置查找:
时间复杂度:O(1)

Status list_retrival(sq L,int pos,ElemType *elem)
{
    Status s=range_error;//初始时查找失败
    if(L){//线性表存在的情况下
        if((pos-1)>=0&&(pos-1)<L->length){
            *elem=L->elem[pos-1];//pos-1元素放到elem指针中
            s=success;
        }
    }
        else
            s=fail;//若线性表不存在,返回错误
        return s;
}

按值查找:
时间复杂度:O(N)

Status list_locate(sq L,ElemType elem,int *pos)
{
    Status s=range_error;
    if(L){
        for(int i=0;i<L->length;++i){//从0到length-1的位置查找是否有这个值
            if(L->elem[i]==elem){
                *pos=i+1;//若是,pos+1,跳出循环
                s=success;
                break;
            }
        }
    }
    else
        s=fail;
    return s;
}

插入操作:
时间复杂度:O(n)
1、检查插入位置是否合法;
2、判断表是否已被占满;
3、若前面检查通过,则数据元素依次向后移动一个位置,为避免覆盖原数据,应从后向前移动;
4、将新元素放到指定位置。
5、表长加一。

Status list_insert(sq L,int pos,ElemType elem)
{
    Status s=range_error;
    if((pos-1)>=0&&(pos-1)<L->length){
        if(L&&L->length<L->list_size){
            for(int i=L->length-1;i>=pos-1;--i){
                L->elem[i+1]=L->elem[i];
            }
            L->elem[pos-1]=elem;
            L->length++;
            s=success;
        }
    }
    else
        s=fail;
        return s;
}

删除操作:
时间复杂度:O(n)

Status list_delete(sq L,int pos)
{
    Status s=range_error;
    if((pos-1)>=0&&(pos-1)<L->length){
        if(L&&L->length>0){
            for(int i=pos;i<L->length;++i){
                L->elem[i-1]=L->elem[i];
            }
            L->length--;
            s=success;
        }
    }
    else
        s=fail;
    return s;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值