线性表之顺序表的十大操作(从初始化到释放)C语言版

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50  //线性表的存储区的总长度
typedef struct
{
    int *data;   //指向数据区地址,假设存储int型
    int size;  //当前顺序表的长度
}SqList;
void Initialise(SqList *List)  //初始化顺序表
{
    List->data=(int *)malloc(sizeof(int)*MAXSIZE); //为顺序表申请空间
    List->size=0;
    printf("---------申请空间结束");
}
void DelList(SqList *List)  //释放顺序表
{
    free(List->data);  //free释放了data指针指向的内存块,告诉系统该块内存闲置,但date仍然指向该内存块首地址,故需赋值为NULL;
    List->data=NULL;
    List->size=0;
    printf("\n删除成功");
}
int JudEmpty(SqList *List)  //判断顺序表书否为空
{
    if(List->size==0)
        return 1;
    else
        return -1;
}
int Length(SqList *List)  //求顺序表表长
{
    int size=0;
    for(int i=0;List->data[i]!=NULL;i++)
        size++;
    return size;
}
void Output(SqList *List) //输出顺序表
{
    for(int i=0;i<List->size;i++)
    {
        printf("\n第%d个数据是: %d",i,List->data[i]);
    }
    printf("\n---------输出结束。");
}
void Insert(SqList *List,int l,int data) //插入
{
    if(l<1||l>List->size+1||l>=MAXSIZE)  //判断插入位置是否合法,需要在第一个元素到最后一个元素的后一位之间,且不能超过最大长度
    {
        printf("illgal location");
        return -1;
    }
    for(int i=List->size;i>l-1;i--)
    {
            List->data[i]=List->data[i-1];  //所有元素后移一位
    }
    List->data[l-1]=data;  //插入data在l的位置(下标是l-1)
    List->size++;
    printf("\n插入位置: %d\n---------插入结束",l);
}
int Loc_Search(SqList *List,int l)  //按位查找
{
    if(l<=0||l>List->size)
        return -1;
    return List->data[l-1];
}
int Val_Search(SqList *List,int value)  //按值查找
{
    for(int i=0;i<List->size;i++)
        if(List->data[i]==value)
            return i+1;
    return -1;
}
int Loc_Delete(SqList *List,int l,int *e)  //按位删除元素并记录删除的元素在e
{
    if(l<=0||l>List->size)
       return -1;
    *e=List->data[l-1];
    for(int i=l;i<List->size;i++)   //若表长为1则不进入for循环,跳到表长减一算作删除了第0号元素
        List->data[i-1]=List->data[i];
    List->size--;        //最后一个未覆盖的数据因表长减一算作删除;
    return 1;
}
int Val_Delete(SqList *List,int value)  //按值删除元素并返回删除元素的位置
{
    if(JudEmpty(List)==1)  //判空,这里由于Jud函数不会返回0所以用判别式
       {
        return -1;
       }
    for(int i=0;i<List->size;i++)
        if(List->data[i]==value)
            return i+1;
    return -2;
}
int main()
{
    SqList test;int e;
    Initialise(&test);
    printf("\n是否为空:%d",JudEmpty(&test));
    Insert(&test,1,1);
    Insert(&test,2,2);
    printf("\n是否为空:%d",JudEmpty(&test));
    printf("\n顺序表长: %d",Length(&test));
    Output(&test);
    int c=Loc_Search(&test,0);
    printf("\n按位查找: %d",c);
    int b=Loc_Search(&test,1);
    printf("\n按位查找: %d",b);
    Loc_Delete(&test,2,&e);
    printf("\n删除的值为:%d",e);
    int a=Val_Search(&test,2);
    printf("\n按值查找: %d",a);
    printf("\n按值删除:%d",Val_Delete(&test,1));
    DelList(&test);
    return 0;
}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值