数据结构基础——线性表之顺序表的静态/动态分配(附C语言代码)

前言

本文主要记录自己学习数据结构的过程与收获,欢迎各位批评指正。

目录

前言

顺序表的定义

顺序表的静态分配

顺序表的动态分配

malloc函数

free函数

 C语言中 -> 和 . 的区别

 代码

 总结


顺序表的定义

定义:顺序表是用顺序存储的方式实现的线性表。它是用一组地址连续的存储空间依次存储线性表中的数据元素,从而使逻辑上相邻的两个元素在物理上也相邻。

        需要注意的是,由于顺序表中的任意一个数据元素都可以随机存取(即知道该元素的位序即可马上实现存取操作),所以线性表的顺序存储结构是一种随机存取的存储结构。

顺序表的静态分配

代码如下所示

#include 
#define MaxSize 10

typedef struct {                      //定义顺序表结构体
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList* L){             //初始化数组
    for(int i = 0; i

效果如下所示 :

         在静态分配下,一旦顺序表的大小确定,后续需要修改长度是十分不易的,因此引入动态分配的方法使得顺序表长度可变。

顺序表的动态分配

将使用到malloc,free函数,需调用stdlib库。

malloc函数

        malloc是动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。

 使用malloc函数时需注意:

        1.要强制转换函数返回值为自己所需要的类型。

        2.使用完成一定要释放空间,如果不释放会造内存泄漏。

        3.在使用malloc函数开辟的空间中,不要进行指针的移动。

free函数

        free函数可以用来释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。

 C语言中 -> 和 . 的区别

        最本质的区别是 -> 前是结构体指针,而 . 前是结构体变量。

       举个例子,在下面这段代码中定义一个顺序表L,其中:

                L->data 中,L 为结构体指针;

                L.data 中,L为结构体变量。

#include 
typedef struct {
    int data[MaxSize];
    int length;
}SqList;

int main(){
    SqList L;       //定义顺序表L
    return 0;
}

 代码

#include
#include
#define InitSize 10    //定义初始长度
typedef struct         //定义顺序表结构体
{
    int *data;         //指针指向顺序表第一个元素的地址
    int Maxsize;       //顺序表最大容量
    int length;        //当前长度(已存放了多少个元素)
}SqList;               //结构体名:SqList

void InitList(SqList *L)        //初始化顺序表
{
    L->data = (int *)malloc(InitSize * sizeof(int));  //开辟一段连续的地址空间
    L->length = 0;             //初始长度为0
    L->Maxsize = InitSize;     //更新表的最大容量
    for (int i = 0; i < L->Maxsize;i++)
        L->data[i] = 0;        //最初元素值为0
}
void IncreaseSize(SqList *L, int len)      //增加表长
{
    int *p = L->data;                      //存方原来顺序表的首地址,
    L->data = (int *)malloc((L->Maxsize + len) * sizeof(int));     //根据新增长度重新开辟一段连续的地址空间构建新的顺序表
    for (int i = 0; i < L->Maxsize;i++)                          //将原来表中内容拷贝到新表中
        L->data[i] = p[i];
    for (int i = L->Maxsize; i < (L->Maxsize+len);i++)             //其余元素值值为0
        L->data[i] = 0 ;
    L->Maxsize = L->Maxsize + len;         //更新当前表的最大容量
    free(p);                      //释放原来表的内存空间
}
int main(void)
{
    SqList L;       //创建一个顺序表L
    InitList(&L);   //初始化
    printf("The initial list:\n");
    for(int j =0;j<10;j++){
        printf("data[%d]=%d ",j,L.data[j]);
    }
    printf("\n");
    IncreaseSize(&L,5);         //增加顺序表长度
    printf("Increase the length of the list:\n");
    for(int j =0;j<15;j++){
        printf("data[%d]=%d ",j,L.data[j]);
    }
    return 0;
}

效果如下所示:

 总结

        毕竟是数据结构最开始的部分,内容逻辑上都比较简单,如果有出错或可以改进的地方,欢迎各位大佬留言指正。

你可能感兴趣的:(数据结构,数据结构,c语言,开发语言)