线性表的顺序储存结构 初始化、查找、删除、插入

#include <stdio.h>
#include <stdlib.h>
/*Get:
1、线性表的顺序储存结构,在存和读取数据的时候,不论哪个位置,
时间复杂的都为O(1)。

2、在插入和删除数据的时候 为O((n -1) /2) 即O(n);

3、优点:
    无须为表中元素的逻辑增加额外的储存空间
    可以快速地存取表中任一位置的元素
4、缺点:
    插入和删除操作需要移动大量元素
    线性表变化较大时,难以确定储存空间的容量
    造成储存空间的“碎片”
*/

/*线性表 顺序储存  储存容量固定
//数组  数组长度  线性表的长度(数组里面有效元素的个数)
//插入和删除
//存取时间性能为  O(1) 的结构  -> 随机存取结构

*/

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define END 0
#define MAXSIZE 20      //储存空间的初始分量




typedef int Status;
typedef int ElemType;  //元素的类型视情况而定  这里假设为int
typedef struct
{
    ElemType data[MAXSIZE];
    int length;

} SqList;

//初始化线性表
Status initList(SqList *list, ElemType data[], int dataLength);

//查询、获取某个元素      这里Elemtype用指针, 因为返回值要用来返回运行状态
Status GetElem(SqList *list, int index, ElemType *element);

/*插入元素
    1、插入点后的元素需要向后面移动一个储存空间
    2、插入前判断:插入位置是否合理、线性表是否充满(抛出异常或者动态增加容量)
    3、表长+1
*/
Status insert(SqList *list, ElemType element, int location);

/*删除元素
    1、位置合理性判断
    2、插入点后的元素向前移动一个单位
    3、表长减1
*/
Status delete(SqList *list,  int location);


int getListLength(int *list);


int main()
{

    int i;
    //初始化线性表
    SqList linearList;
    int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    initList(&linearList, data, 10);

    //获取、查询指定位置的元素  从1开始
    printf("\n获取、查询指定位置的元素\n");
    ElemType element;
    GetElem(&linearList, 2, &element);
    printf("%d\n",  element);


    //插入元素  根据参数类型来判断插入的位置 //默认在表尾进行元素添加  END
    insert(&linearList, 11, 11);

    //删除元素
    delete(&linearList,  0);

    //元素遍历
    printf("\n元素遍历,包括了未初始化的部分\n\n");

    for (i = 0; i < MAXSIZE; i++)
    {
        printf("%d  ", linearList.data[i]);
    }

    return 0;
}

Status initList(SqList *list, ElemType data[], int dataLength)
{
    int i;

    list->length = 0;

    for (i = 0; i < dataLength; i++)
    {

        list->data[i] = data[i];
        list->length++;
    }

    return OK;
}



Status insert(SqList *list, ElemType element, int location)
{
    //元素下标从1开始计数 0-> END 代表插入位置为末尾。
    Status status;
    if (location < 0 || location > list->length + 1 || list->length>= MAXSIZE )  //这里使用0的原因是 因为END = 0
    {
        status =  ERROR;
        printf("元素位置超出范围,插入失败");
    }
    else
    {
        if (location == END || location == list->length + 1)
        {
            list -> data[list->length] = element;
        }
        else
        {
            //在这里需要实现将插入点后的元素都要向后移动一个单位

            int i = 0;
            for (; i < list->length - location; i++)
            {
                list->data[list ->length - i] = list->data[list ->length - i - 1];
            }
            list -> data[location - 1] = element;

        }

        list -> length++;
        status =  OK;
    }


    return status;
}


Status delete(SqList *list,  int location)
{
    Status status;
    if (location < 0 || location > list->length + 1 || list->length>= MAXSIZE )  //这里使用0的原因是 因为END = 0
    {
        status =  ERROR;
        printf("元素位置超出范围,删除失败");
    }
    else
    {
        if (location == END || location == list->length + 1)
        {
            //因为是顺序储存结构 内存是无法释放的 所以只能采取赋默认值的方式
            //这里最重要的是 需要把线性表的长度-1
            list -> data[list->length] = 666;
        }
        else
        {
            //删除点后的元素都要向前移动一个单位

            int i = 0;
            for (; i < list->length - location; i++)
            {
                list->data[location + i - 1] = list->data[location + i];
            }
        }

        list -> length--;
        status =  OK;
    }


    return status;

}

Status GetElem(SqList *list, int index, ElemType *element)
{
    Status status = OK;

    if (index < 1 || index > list -> length)
    {
        status = ERROR;
        printf("测试1\n");
    }
    else
    {
        *element = list -> data[index - 1];
    }

    return status;
}


                
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值