【数据结构】顺序存储结构线性表C语言版

本文介绍了线性表的顺序存储结构,即使用数组存储线性表的数据元素。通过代码展示了如何实现线性表的相关操作,并讨论了其优点(如快速存取)和缺点(如插入删除效率低,空间碎片问题)。提供了工程源码的下载链接。
摘要由CSDN通过智能技术生成

【定义】线性表的顺序存储结构是指用一段地址连续的存储单元(就是数组)依次存储线性表的数据元素

【线性表的顺序存储结构代码】

#define MAXSIZE 50
typedef int ElemType;
typedef int Status;
struct list
{
    int Elem[MAXSIZE];
    int length;//这个长度是用过的数组的长度,也就是线性表的长度,区分数组的长度MAXSIZE
};
typedef struct list List;
一个这样的线性表的就是一个包含了数组和int类型的线性表长度的结构体,其中length值是一个从1到MAXSIZE的值,这个值会随着线性表的插入和删除而变化

【线性表的操作的函数代码】

/**
*返回值为是否成功
**/
Status GetElem(List *L,int i, ElemType *e)
{

    if(L->length <0||i < 0 || i > L->length)
    {
        return ERROR;//判断线性表是否存在,要查找的元素是否数组越界
    }
    *e = L->Elem[i-1];
    return OK;
}
/**在第i个位置之前上插入相应值,同时链表长度增加,这个插入不是将值替换*/
Status Listinsert(List *L,int i,ElemType e)//链表,位置,
{
    int k = L->length;//临时变量用来存放数组下标
    if(L->length == MAXSIZE) //判断表是否是满的
    {
        return ERROR;
    }
    if(i<0||i>L->length+1) //判断插入位置是否合理
    {
        return ERROR;
    }
    if(i>0||i<=L->length)//插入的地方不是表尾
    {
        for(k=L->length-1 ; k >=i-1; k--)
        {
            L->Elem[k+1] = L->Elem[k];
        }
    }
    L->Elem[i-1]= e;//恰好是表尾的话就直接插入到这位置
    L->length++;
    return OK;

}
Status ListDelete(List *L,int i)
{
    int k;
    if(L->length == 0||i<0 ||i>L->length)//空表,删除位置是否合适的判断
        return ERROR;


    for(k=i-1; k<L->length-1; k++)
    {
        L->Elem[k] = L->Elem[k+1];
    }
    L->length--;
    return OK;
}

void getLlength(List *L)
{
    printf("当前链表长度为%d\n",L->length);
}
【测试用的主函数的代码】

int main()
{
    List L = {{0},0};
    int choose ;
    int i;
    int e;
    int j;
    while(1)
    {

        printf("***************************************************\n");
        printf("输入操作\n");
        printf("1.插入元素\n");
        printf("2.删除元素\n");
        printf("3.获取当前表长\n");
        printf("4.显示所有的元素值\n");
        printf("5.显示某位置的元素值\n");
        printf("***************************************************\n");

        scanf("%d",&choose);
        switch(choose)
        {

        case 1:
            printf("输入元素值和位置\n");
            scanf("%d %d",&e,&i);

            if(Listinsert(&L,i,e) == 0)
            {
                printf("error\n");
                exit(0);
            }
            getLlength(&L);
            break;
        case 2:
            printf("输入位置\n");
            scanf("%d",&i);

            if(ListDelete(&L,i) == 0)
            {
                printf("error\n");
                exit(0);
            }
            getLlength(&L);


            break;
        case 3:
            getLlength(&L);
            break;
        case 4:
            for(j = 0; j< L.length; j++)
            {
                printf("%d   ",L.Elem[j]);
            }
            printf("\n  ");
            break;
        case 5:
            printf("输入元素位置\n");
            scanf("%d",&i);
            if(GetElem(&L,i,&e) == 0)
            {
                printf("error\n");
                exit(0);
            }
            printf("当前的元素的为%d\n",e);
            break;
        }
    }
    return 0;
}
【线性表的顺序存储结构的优缺点】

优点: 无须为表示表中的元素之间的逻辑关系而增加额外的存储空间,可以快速的存取表中的任意位置的元素

缺点:插入和删除操作需要移动大量的元素,线性表的长度变化较大的时候难以确定存储空间的容量,造成存储空间的“碎片”
【工程源码下载链接】

http://download.csdn.net/detail/u013583717/7999421

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值