线性表之顺序表的实现(C语言)

线性表基础知识

  1. 线性表定义:由n(n>=0)个相同类型的元素组成的有序集合。从a1开始,到an结束。
  2. 线性表特点:元素个数有限、元素数据类型都相同(占用空间相同)、元素有逻辑上的(先后)顺序性。
  3. 顺序表(线性表的顺序表示,逻辑上相邻的两个元素在物理位置上也相邻):定义,优缺点,操作(插入、删除),各操作时间复杂度,动态分配。(本篇)
  4. 链表(线性表的链式表示,逻辑上相邻的两个元素在物理位置上不相邻):单链表节点的定义,优缺点,操作(插入、删除、查找)。(见下篇)

顺序表实现

练习题描述:

初始化顺序表,元素不限,实现插入、删除、查找功能:

输入要插入的元素值和插入位置,并打印输出顺序表;

输入要删除的元素位置,输出顺序表和删除的元素值;

输入要查找的元素值,输出元素位置。

1. 定义顺序表
#define MaxSize 20
typedef int ElemType;//让顺序表存储其他类型元素时,可以快速完成代码修改
typedef struct{
    ElemType data[MaxSize];//定义数组存储元素
    int length;//顺序表长度
}SqList;
2. 插入
//顺序表插入元素操作,pos是插入位置
bool list_insert(SqList &l,int pos,ElemType elem){
    if(pos<1 || pos>l.length){//非法输入位置,不能插入
        return false;
    }else if(l.length == MaxSize){//存储空间满了,不能插入
        return false;
    }else {//先移动后面元素,以空出位置放入要插入的元素
        int i;
        for (i = l.length; i >= pos; i--) {
            l.data[i] = l.data[i - 1];
        }
        l.data[pos - 1] = elem;
        l.length++;//顺序表长度加1
        return true;
    }
}
3. 删除
//顺序表删除元素操作,pos是删除位置
bool list_delete(SqList &l,int pos,ElemType &elem){
    if(pos<1 || pos>l.length){//非法删除位置,不能删除
        return false;
    }else {//先把要删除的元素值放入elem中,再移动后面元素
        int i;
        elem = l.data[pos - 1];
        for (i = pos; i < l.length; i++) {
            l.data[i - 1] = l.data[i];
        }
        l.length--;//顺序表长度减1
        return true;
    }
}
4. 查找
//顺序表查找元素操作,返回元素elem在顺序表中的位置
int locate_elem(SqList l,ElemType elem){
    int i;
    for(i=0;i<l.length;i++){
        if(elem == l.data[i]){
            return i+1;//数组下表加1才是顺序表的下标
        }
    }
    return 0;//循环结束未找到
}
5. 打印顺序表
//顺序表打印
void print_list(SqList l){
    for(int i=0;i<l.length;i++){
        printf("%3d",l.data[i]);//每个元素占3个空格
    }
    printf("\n");
}
6. 主函数
int main() {
    SqList L;//定义顺序表
    int i;
    L.length=0;//初始化长度
    for(i=0;i<10;i++){//简单放入10个元素
        L.data[i]=i+1;
        L.length++;
    }
    bool ret;//接收返回值
//输入要插入的元素e1,插入到第pos1个位置
    int pos1;
    ElemType e1;
    printf("input insert element and position:");
    scanf("%d %d",&e1,&pos1);
    ret = list_insert(L,pos1,e1);
    if(ret){//ret == true时打印
        print_list(L);
    }else{//输出错误提示
        printf("insert false\n");
    }
    printf("-----------------------\n");

//输入要删除的元素位置pos2,删除元素值存储到e2中
    int pos2;
    ElemType e2;
    printf("input delete position:");
    scanf("%d",&pos2);
    ret = list_delete(L,pos2,e2);
    if(ret){
        print_list(L);
        printf("delete e2 = %d\n",e2);
    }else{
        printf("delete false\n");
    }
    printf("-----------------------\n");

//输入要查找的元素值elem,返回位置pos3
    int pos3;
    ElemType elem;
    printf("input locate element:");
    scanf("%d",&elem);
    pos3 = locate_elem(L,elem);
    if(pos3){
        printf("locate pos3 = %d",pos3);
    }else{
        printf("locate false\n");
    }

    return 0;
}
7. 测试

以上代码加上头文件便可以直接运行了,代码中有详细注释。如有疑问,欢迎指出~

下篇:线性表之链表的实现http://t.csdnimg.cn/4vD34

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

多多想

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

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

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

打赏作者

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

抵扣说明:

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

余额充值