顺序表的基本操作

【线性表顺序表示的基本算法】

1、定义结构体

struct SeqList
{
    int maxNum;//最大元素个数
    int n;//顺序表的实际长度
    char *element;//存储元素的数组
};
typedef struct SeqList *PSeqList;//定义结构体类型的指针

2、创建空顺序表

PSeqList CreateNullList(int m)
{
    PSeqlist palist = (PSeqlist)malloc(sizeof(struct SeqList));//分配存储空间

    if(palist != NULL)
    {
        palist->element = (char *)malloc(sizeof(char) * m);//为顺序表分配一个由参数m指定大小的数组空间
        if(paliat->element)//当 palist->element 为非空时执行
        {
            palist->maxNum = m;
            palist->n = 0;
            return palist;
        }
        else
        {
            free(palist);//当 palist->element 为NULL时执行
        }
    }

    printf("out of space");
    return NULL;
}
【注:malloc() 函数】
  • 用来动态地分配内存空间,其原型为:void* malloc (size_t size);
  • 返回值:分配成功返回指向该内存的地址,失败则返回 NULL
  • 函数的返回值类型是 void *,void并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型

3、判断顺序表是否为空

算法:只需要判断顺序表的长度是否为0即可

int IsNullSeq(PSeqList palist)
{
    return (palist->n == 0);
}

4、求某元素的下标

int LocateSeq(PSeqList palist, char x)
{
    int i = 0;

    while(palist->elment[i] != x)//遍历表寻找值为x的元素
    {
        i++;
    }

    return i;
}

5、顺序表的插入

前插:在下标为p的元素之前插入一个元素x
算法:将下标为p及其以后的元素往后移动一个单位,再将值为x的元素插入到下标为p的位置中
边界条件:

  • p的取值范围位 [0, n-1];
  • 顺序表未满,即 palist->n < palist->maxNum

代码如下:

int InsertSeq(PSeqList palist, int p, char x)
{
    int q;

    if(palist->n < palist->maxNum)
    {
        if(p >= 0 && p <= palist->n - 1)
        {
            for(q = palist->n - 1; q >= p; q--)
            {
                palist->element[q+1] = palist->element[q];//满足条件时进行移位操作
            }

            palist->element[p] = x;//给下标为p的元素赋新值
            palist->n ++;//顺序表长度加一
            return 1;
        }
    }

    return 0;
}

6、顺序表的删除

算法:顺序表的删除并不用free()方法,而是将被删除元素之后的元素都往前面挪一个即可。
边界条件:

  • 顺序表不为空,即 palist->n != 0;
  • 给定的下标p的范围为 [0, n-1];

代码如下:

int DeleteSeq(PSeqList palist, int p)
{
    int q;

    if(palist->n != 0)
    {
        if(p >= 0 && p <= n - 1)
        {
            for(q = p; q <= palist->n - 1; q++)
            {
                palist->element[q] = palist->element[q+1];//满足边界条件时删除
            }

            palist->n--;//删除元素后长度减一
            return 1;
        }
    }

    return 0;

7、顺序表的分析与总结

优点:
  • 顺序表最大的优势是可以按下表随机存取任一元素
缺点:
  • 顺序表最大的不足是插入和删除的时间复杂度是O(n),需要移动大量元素,效率较低
  • 顺序表需要占用连续的存储空间,存储分配要先按最大的空间来分配,可能会造成空间的严重浪费。
总结:
  • 对于一旦建立就不需要经常插入和删除操作的线性表,顺序表示是一种很好的选择
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值