顺序表的操作(动态)

本文介绍了动态顺序表的操作,包括结构、初始化、长度计算、空表判断、元素打印、插入、删除、摧毁、清空、获取指定位置值、元素位置查找及前后继元素求解。同时提供了完整的代码示例和运行结果。
摘要由CSDN通过智能技术生成

顺序表的操作(动态)

静态定义一个顺序表,是通过数组来定义, 顺序表所占的内存空间开辟在内存的栈上, 随着函数调用的结束, 这块内存区域会被系统自动回收;

动态定义顺序表, 顺序表所占的内存空间开辟在内存的堆上, 这块区域不会随着函数调用的结束被系统自动回收, 而是需要程序员自己去释放它。

顺序表的基本操作

1.顺序表的结构
typedef struct SeqList //SeqList可以省略
{
   
    ElemType elem*;//存储空间的基址,即开辟的动态数组的首地址
    int length;//有效数字的个数,顺序表当前存储元素的个数;
    int ListSize;//用来定义开辟空间的容量

}SeqList; //这里的SeqList相当于 struct SeqList 即可以通过SeqList L;直接声明顺序表变量
2.顺序表的初始化
void InitList(SeqList *L)
{
    L->elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));//分配空间,即最大的元素数量乘以每个元素占的字节数。最后把指针类型强制转换位该元素类型的。
    if(!L->elem)//内存分配失败会返回NULL
        exit(OVERFLOW);//直接结束进程超量溢出,给系统返回错误代码-2
    L->length=0; //把顺序表的长度设置为0
    L->ListSize=MAXSIZE;//把当前顺序表的最大容量设置为MAXSIZE
}
3.顺序表的长度
int ListLength(SeqList L)
{
   
    return L.length;//返回线性表的的长度
}
4.判断顺序表是否为空
//判断线性表是否为空
int ListEmpty(SeqList L)
{
   
    if(L.length==0)//如果长度为0,返回1
        return 1;
    return 0;//默认非空,返回0;
}
5.打印出线性表的所有元素
//打印出线性表所有的元素
void PrintList(SeqList L)
{
   

    if(IsEmpty(L))
        printf("该顺序表为空表!\n");
    else
        for( int i=0; i<ListLength(L); i++)
        {
   
            printf("%d ",*(L.elem+i));
        }
}
6.向顺序表的指定位置插入元素
int InsertList(SeqList *L,int pos,ElemType e)//pos 插入的位置 e 插入的元素
{
   
    int j;//作为循环变量
    //先判断插入的位置是否合法
    if(pos<1||pos>L->length+1)
    {
   
        printf("插入位置不合法!\n");
        return ERROR;
    }
    //判断所剩空间是否充足,如果已满则需扩充空间
    else if(L->length==L->ListSize)
    {
   
        ElemType *temp;//建立一个指针存储返回的新的起始地址
        temp=realloc(L->elem,(L->ListSize+LISTCREMENT)*sizeof(ElemType));//realloc为更改存储空间大小的函数
        //判断是否分配内存成功
        if(!temp)
        {
   
          printf("分配内存失败!\n");
            exit(OVERFLOW);
        }
        else
        {
   
            L->elem=temp;
            L->ListSize+=LISTCREMENT;
        }
    }
    //从最后一个元素开始,向右平移一个单位,直到要插入的元素空出来
    else
    {
   
        for(j=L->length; j>=pos; j--)
            *(L->elem+j)=*(L->elem+j-1);//让后一个元素等与前一个元素
        *(L->elem+pos-1)=e;
        L->length++;//表长加一
    }
    return OK;
}
7.删除顺序表指定位置的元素
int DeleteList(SeqList *L,int pos,ElemType *e)//用e来保存删除位置的元素
{
   
    int i;//循环变量
    //判断删除的位置是否合理
    if(L->length==0)
    {
   
        printf("线性表是空表,不能进行删除!\n");
        return 0;
    }
    else if(pos<1||pos>L->length)
    {
   
        printf("删除位置不合理\n");
        return ERROR;
    }
    //从要删除的位置的右边开始,元素左移
    else
    {
   
        for(i=pos; i<L->length; i++)
            *(L->elem+i-1)=*(L->elem+i);

       L->length=L->length-1;
    }

    return OK;
}
8.摧毁顺序表

int DestroyList(SeqList *L)
{
   
    free(L->elem);
    L->elem=0;//空指针
    L
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值