第二章 线性表 : 顺序表

顺序表

sequential list

i 个元素的存储地址 : L o c ( a i ) = L o c ( a 1 ) + ( i − 1 ) × c Loc(a_i)=Loc(a_1)+(i-1)\times c Loc(ai)=Loc(a1)+(i1)×c

顺序表的存储结构定义

#define MaxSize 1000
typedef int DataType;
typedef struct{
    DataType data[MaxSize];
    int length;
}SeqList;

初始化顺序表

void InitList(SeqList *L){
    L->length = 0;
}

建立顺序表

int CreatList(SeqList *L, DataType a[], int n){
    if(n > MaxSize){
        printf("顺序表的空间不够, 无法建立\n");
        return 0;
    }
    for(int i = 0; i < n; i ++)
        L->data[i] = a[i];
    L->length = n;
    return 1;
}

判空操作

int Empty(SeqList *L){
    if(L->length == 0) return 1; /* 顺序表为空返回 1 */
    return 0;
}

求顺序表的长度

int Length(SeqList *L){
    return L->length;
}

遍历操作

void PrintList(SeqList *L){
    for(int i = 0; i < L->length; i ++)
        printf("%d ", L->data[i]);
} 

按值查找

int Locate(SeqList *L, DataType x){
    for(int i = 0; i < L->length; i ++)
        if(L->data[i]==x) return i+1;
    return 0;
}

按位查找

int Get(SeqList *L, int i, DataType *ptr){
    if(i<1 || i>L->length){
        printf("位置非法, 查找失败\n");
        return 0;
    }
    else{
        *ptr = L->data[i-1];
        return 1;
    }
}

插入操作

在元素的第 i 个位置上插入一个新元素 x , 1 ≤ i ≤ n 1\leq i \leq n 1in

int Insert(SeqList *L, int i, DataType x){
    if(L->length >= MaxSize){
        printf("上溢错误, 插入失败\n");
        return 0;
    }
    if(i<1 || i>L->length+1){
        printf("非法插入位置\n");
        return 0;
    }
    for(int j = L->length; j >= i; j --)
        L->data[j] = L->data[j-1];
    L->data[i-1] = x;
    L->length ++;
    return 1;
}

删除操作

int Delete(SeqList *L, int i, DataType *ptr){
    if(L->length==0){
        printf("顺序表为空, 无法删除\n");
        return 0;
    }
    if(i<1 || i>L->length){
        printf("非法位置, 删除失败\n");
        return 0;
    }
    *ptr = L->data[i-1];
    for(int j = i; j < L->length; j ++)
        L->data[j-1] = L->data[j];
    L->length --;
    return 1;
}
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值