6-2 顺序表操作集分数 20作者 陈越单位 浙江大学本题要求实现顺序表的操作集。

文章介绍了如何在C语言中使用顺序表进行初始化,通过返回值传递地址而不是参数,以及处理边界情况下的插入和删除操作。涉及到malloc内存分配和指针的使用。
摘要由CSDN通过智能技术生成
/*在建立空表的操作上我们要明确区分。
    顺序表是通过数组存储,按照顺序,定义一个整数来存放数组长度
    链式表是借用指针来存储存储结构。
    本题中明显是顺序表,但是与平常的建立空表又不一样,平常是传递结构体的地址给建立空表的函数,将长度归0,以此来达到初始化
    在本题上我们需要特别注意,首先函数没有传入的参数,而是通过返回值赋值来达到目的,返回值为指针,所以我们可以知道要使用指针
    因为没有申请空间,所以先要申请空间,就是通过malloc,使得建表函数获取拥有这样一段空间的地址的指针。并在最后将这个地址通过函数返回值赋给了主函数中的指针,也就是使它能指向那份空间,所以即使建表的函数中的指针在不使用该函数时指针销毁也没事,因为我们要的是这个空间,最后在主函数中释放内存即可*/
List MakeEmpty(){
    List L;
    L=(List)malloc(sizeof(struct LNode));
    L->Last=-1;//因为题目中说的是线性表中最后一个元素的位置,若初设为0也代表其有一个元素,所以我们应该设置为-1来代表
    return L;
}
/*代码分析:这是一个查找代码,*/
Position Find(List L,ElementType X){
	int i;
    for(i=0;i<=L->Last;i++){
        if(X==L->Data[i])return i;
    }
    return ERROR;
}
/*代码分析:插入数据,!!!首先我们要考虑输入的数据,根据边界情况分类讨论
    首先插入位置应该要符合要求,不可以超过当前线性表长度(即不可不在线性表范围内)
    其次表要有能插入的空间
在这要注意,由于在表尾与不在表尾的操作不同所以我们要分情况讨论*/
bool Insert(List L,ElementType X,Position P){
    if(L->Last==MAXSIZE-1){
        printf("FULL");
        return false;
    }//我有一个疑问:这里P的非法位置是指末尾前还是线性表最大长度前呢
    //!!答案当插入位置比第一位置小或者比最后一位置后一位置还要大时
    else if(P<0||P>L->Last+1){
        printf("ILLEGAL POSITION");
        return false;
    }
    //在表尾插入
    if(P==L->Last+1){
        L->Data[P]=X;
        L->Last++;
    }
    //在非表尾插入,那么就需要将插入位置后面的所有数据往后面移动一位,并且为了防止被覆盖需要从最后一个开始移动
    else{
    	int i;
        for(i=L->Last;i>=P;i--){
            L->Data[i+1]=L->Data[i];
        }
        L->Data[P]=X;
        L->Last++;
    }
    return true;
}
//删除直接覆盖要删除的
bool Delete(List L,Position P){
    if(P<0||P>L->Last){
        printf("POSITION %d EMPTY",P);
        return false;
    }
    int i;
    if(P==L->Last){
        L->Last--;
    }
    //这里删除也要分是否删除表尾,若不分这里的for无法删除表尾,因为在判断条件时候就已经通过不了了
    else{
            for(i=P+1;i<=L->Last;i++){
            L->Data[i-1]=L->Data[i];
        }
    L->Last--;
    }
    return true;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值