线性表的顺序存储结构

数据结构是计算机学科的基础,也是算法的基础,要想做一个合格的程序员,学会学懂数据结构是必须的。

在我看来,数据结构中最简单的莫过于线性表的顺序存储结构。

//线性表(顺序存储结构)的基本函数
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20           //存储空间初始化分配量
typedef int Status;          //作为函数状态码
typedef int ElemType;        //ElemType类型根据实际情况而定,这里假设为int
typedef struct{
    ElemType data[MAXSIZE];  //存储数组元素,最大为MAXSIZE
    int length;              //线性表当前长度
}SqList;
/***************************************************/
void ClearList(SqList *L);                          //清空链表
int ListEmpty(SqList L);                            //判断线性表是否为空
Status GetElem(SqList L,int i,ElemType *e);         //取出表中的某一个元素
Status ListInsert(SqList *L,int i,ElemType e);      //在表中插入一个元素
int LocateElem(SqList L,ElemType e);                //查找与给定值相同的元素
Status ListDelete(SqList *L,int i,ElemType *e);     //删除掉表中的某一个元素
/****************************************************/
int main()
{
 
  

}
/**********************************************/
//函数名:GetElem
//描述  :取出第i个元素
//参数  :链表L,i,e
//返回值:状态值
/**********************************************/
Status GetElem(SqList L,int i,ElemType *e){
    if(L.length==0 || i<1 || i>L.length){
        return ERROR;
    }
    *e = L.data[i-1];
    return OK;
}
/**********************************************/
//函数名:ListInsert
//描述  :在第i个位置,插入一个新元素
//参数  :链表指针L,i,e
//返回值:状态值
/**********************************************/
Status ListInsert(SqList *L,int i,ElemType e){
    int k;
    if(L->length==0 || i<1 || i>L->length+1 || L->length==MAXSIZE){
        return ERROR;                   //当表为空表,或者表已经存满,或者插入位置不当ERROR!
    }
    if(i <= L->length){                 //如果在线性表内插入
         for(k = L->length; k > e-1; k--){
            L->data[k] = L->data[k-1];   //原来的线性表位置向后移位
         }
         L->data[i-1] = e;
          L->length++;                  //线性表长度增加1
    }else{                              //如果在线性表的末端增加一个新元素
         L->length++;
         L->data[L->length - 1] = e;    //在末尾插入即可
    }
    return OK;
}
/**********************************************/
//函数名:ListDelete
//描述  :删除第i个位置的元素,并取出来该元素
//参数  :链表指针L,i,e
//返回值:状态值
/**********************************************/
Status ListDelete(SqList *L,int i,ElemType *e){
    int k;                               //for循环时的下标
    if(L->length==0 || i<1 || i>L->length){
        return ERROR;                    //当表为空表,或者删除位置不当,返回ERROR!
    }
    *e = L->data[i-1];                   //取出第i个元素
    if(i < L->length){                   //删除的位置不再线性表末端
        for(k = i-1; k < L->length-1; k++){
            L->data[k] = L->data[k+1];   //删除操作
        }
    }else{
        free(L+L->length-1);             //释放最后一位元素的存储空间
    }
    L->length--;                         //线性表长度自减
    return OK;
}
/**********************************************/
//函数名:ListEmpty
//描述  :判断该表是否为空表
//参数  :表L
//返回值:状态值
/**********************************************/
int ListEmpty(SqList L){
    if(L.length==0){
        return FALSE;
    }
    return TRUE;
}
/**********************************************/
//函数名:LocateElem
//描述  :定位元素的值为e的元素
//参数  :表L,元素值e
//返回值:查找成功则返回位置,查找失败,则返回0
/**********************************************/
int LocateElem(SqList L,ElemType e){
    int k;
    k = L.length;
    if(k==0){
        return ERROR;       //空表则返回0
    }
    for(k = 0; k < L.length; k++){
        if(L.data[k] == e){
            return k+1;    //查找成功,返回位置
        }
    }
    return ERROR;          //查找失败
} 

仔细思考我们可以发现,线性表的顺序存储结构的缺点在于插入和删除某一元素非常耗时,因为它需要后面的元素都移动。而取出某一个元素则非常容易。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nwsuaf_huasir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值