C语言实现动态分配顺序表,静态分配顺序表

文章介绍了如何在C语言中实现静态和动态分配的顺序表。对于静态分配,使用了一个固定大小的数组;而对于动态分配,通过malloc申请内存,并在需要时使用IncreaseSize函数扩展容量。文章提供了初始化、打印和扩展顺序表的函数示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言实现动态分配顺序表,静态分配顺序表

最近在考研,重新手撕一遍数据结构,这篇博客只是想做个记录,不是分享什么,顺便存存代码,写了注释,大家可以参考。

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10 //顺序表的最大长度为10

/*
静态分配的顺序表
*/
 typedef struct{
    int data[MaxSize];  //存储顺序表数值的数组
    int length;         //顺序表的长度
 }Sqlist1;

//这里要改变数组里的内容,必须按地址传递
 void InitalSqlist1(Sqlist1* L){
    L->length=0;    //初始化顺序表长度为0,这一步不能省略

    //初始化顺序表中所有数值内容为0,清除脏数据,但是这一步可以省略
    for(int i=0;i<MaxSize;i++){
        L->data[i]=0;
    }
  
 }

//这里是按值传递
void printSqlist1(Sqlist1 L){
    for(int i=0;i<L.length;i++){
        printf("第%d个元素是%d \n",i,L.data[i]);
    }
}



/*
动态分配的顺序表
*/
#define InitSize 10  //便于我们初始化链表时计算需要分配给的连续存储空间的大小

typedef struct{
    int *data;     //这个指针指向这部分内容存空间的开头,类型取决于这个顺序表存储什么类型的数据
    int maxSize;   //在结构体内部定义最大Size,而不是用宏定义,便于当数据超过最大限度时候,进行修改
    int length;    //顺序表目前拥有数据元素的个数
}Sqlist2;

void InitalSqlist2(Sqlist2* L)
{
    /*用 malloc(参数为需要分配的内存地址大小) 函数申请一段连续的存储空间,
      malloc包含在头文件stdlib.h中,malloc返回一个指针,我们需要对这个指针进行类型转换,转为我们的顺序表要存储的类型
    */
    L->data=(int *)malloc(InitSize*sizeof(int)); //将malloc(初始化顺序表大小*每个数据元素占的内存大小)返回的指针强行转换为int型(因为顺序表存储整数))
    L->length=0;    //初始化顺序表的长度为
    L->maxSize=InitSize; //将最大长度设为初始化长度
}


/*增加动态数组的数据元素个数上限:
    1.重新开辟一个更大的内存空间
    2.将原来的内存空间的顺序表复制过来
    3.free之前的内存空间
*/
void IncreaseSizeSqlist2(Sqlist2* L,int len) //len是需要追加的
{
  int *p=L->data; //先找一个中间指针指向原来的内存空间
  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;//更新最大的元素个数值,不用更新length,因为元素的个数没变,只是扩充了容量
  free(p);//释放原来存储的内存空间,free函数也在stdlib.h中
}

//打印动态分配的顺序表
void printSqlist2(Sqlist2 L){
    for(int i=0;i<L.length;i++)
    {
        printf("第%d个数据元素是%d",i,L.data[i]);
    }
}

 int main()
 {
    Sqlist1 L1;
    InitalSqlist1(&L1);
    printSqlist1(L1);

    Sqlist2 L2;
    InitalSqlist2(&L2);
    printf("增加前,L2的最大长度为%d \n",L2.maxSize);
    IncreaseSizeSqlist2(&L2,10);
    printf("增加后,L2的长度为%d \n",L2.maxSize);
    printSqlist2(L2);
    return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值