顺序表——动态分配和静态分配

静态分配

数组采用静态分配时,数组的大小和空间事先已经固定,一旦空间占满,再新加入数据就会溢出,导致程序崩溃。

//顺序表——静态分配 
#include <stdio.h>
#define MaxSize 10        //定义顺序表的最大长度 

//定义
typedef struct{
    int data[MaxSize];        //使用数组存放数据元素 
    int length;                //顺序表当前的长度 
}SqList;

//初始化——1、将顺序表的所有数据元素初始化为0;2、将顺序表的初始长度设为0 
void InitList(SqList &L){        //参数为SqList类型,需要& 
    for(int i=0;i<MaxSize;i++){
        L.data[i]=0;        //将顺序表的所有数据元素初始化为0
    }
    L.length=0;        //将顺序表的初始长度设为0
}

//插入 ——在位置i插入元素e 
bool ListInsert(SqList &L,int i,int e){
    if(i<1||i>L.length+1)
        return false;
    if(i>=MaxSize)
        return false;
    for(int j=L.length;j>=i;j--){
        L.data[j]=L.data[j-1];        //最好时间复杂度为O(1),最坏和平均为O(n)
    } 
    L.data[i-1]=e;
    L.length++;        //插入后表的长度+1 
    return true;
} 

//删除——删除第i个元素 
bool ListDelete(SqList &L,int i){
    if(i<1||i>L.length)
        return false;
    for(int j=i;j<L.length;j++){
        L.data[j-1]=L.data[j];        //最好时间复杂度为O(1),最坏和平均为O(n) 
    } 
    L.length--;
    return true;
} 

//查找——按值查找
int LocateElem(SqList L,int e){
    for(int i=0;i<L.length;i++){
        if(L.data[i]==e)
            printf("该元素为第%d个元素",i+1);
    }
    return 0;
} 
int main(){
    SqList L;            //定义 
    InitList(L);        //初始化,此处不需要& 
    ListInsert(L,1,5);    //在位置1插入元素5
    ListInsert(L,2,6);    //在位置2插入元素6
    for(int i=0;i<L.length;i++){
        printf("插入后的顺序表第%d个元素为:%d\n",i,L.data[i]);
    }
    ListDelete(L,2);    //删除第2个元素 
    for(int i=0;i<L.length;i++){
        printf("删除后的顺序表为:%d\n",L.data[i]);
    }
    LocateElem(L,5);
    return 0;
} 

动态分配

数组采用动态分配时,空间在程序执行过程中可以通过动态存储分配语句分配,不需要一次性为线性表划分所有的空间。

//顺序表——动态分配
#include <stdio.h>    
#include <stdlib.h>        //使用malloc、free的头文件 
#define InitSize 10        //默认最大长度 

//定义
typedef struct{
    int *data;        //指示动态数组的指针
    int MaxSize;    //顺序表的最大容量 
    int length;     //顺序表的当前长度 
}SeqList;

//初始化——使用malloc函数动态申请内存
void InitList(SeqList &L){
    L.data=(int *)malloc(InitSize*sizeof(int));        //使用malloc函数动态申请内存
    L.length=0;        //当前长度设为0 
    L.MaxSize=InitSize;        //默认最大长度 
} 

//动态增加数组长度
void IncreaseList(SeqList &L,int len){
    int *p=L.data;        //将数组中的数据暂时存放到指针p
    L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));        //重新申请内存
    for(int i=0;i<L.length;i++){
        L.data[i]=p[i];        //复制数据 
    } 
    L.MaxSize=L.MaxSize+len;
    free(p); 
} 

//插入
bool ListInsert(SeqList &L,int i,int e){
    if(i<1||i>L.length+1)
        return false;
    if(i>=L.MaxSize)
        return false;
    for(int j=L.length;j>=i;j--){
        L.data[j]=L.data[j-1];
    }
    L.data[i-1]=e;
    L.length++;
    return true;
} 

//删除
bool ListDelete(SeqList &L,int i){
    if(i<1||i>L.length)
        return false;
    for(int j=i;j<L.length;j++){
        L.data[j-1]=L.data[j];
    }
    L.length--;
    return true;
} 

//按值查找
void LocateElem(SeqList L,int e){
    for(int i=0;i<L.length;i++){
        if(L.data[i]==e)
            printf("元素%d是第%d个元素",e,i+1);
    }
} 
int main(){
    SeqList L;
    InitList(L);
//    IncreaseList(L,10);    //动态增加数组长度
    ListInsert(L,1,5);    //在位置1插入元素5
    ListInsert(L,2,6);    //在位置2插入元素6
    for(int i=0;i<L.length;i++){
        printf("插入后的顺序表第%d个元素为:%d\n",i,L.data[i]);
    }
    ListDelete(L,2);    //删除第2个元素 
    for(int i=0;i<L.length;i++){
        printf("删除后的顺序表为:%d\n",L.data[i]);
    }
    LocateElem(L,5);
    return 0;
}
posted @ 2023-08-26 07:49  CherriesOvO  阅读(247)  评论(0编辑  收藏  举报