当前位置:   article > 正文

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

顺序表静态分配 定义新表

前言

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

目录

前言

顺序表的定义

顺序表的静态分配

顺序表的动态分配

malloc函数

free函数

 C语言中 -> 和 . 的区别

 代码

 总结


顺序表的定义

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

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

顺序表的静态分配

代码如下所示

  1. #include <stdio.h>
  2. #define MaxSize 10
  3. typedef struct { //定义顺序表结构体
  4. int data[MaxSize];
  5. int length;
  6. }SqList;
  7. void InitList(SqList* L){ //初始化数组
  8. for(int i = 0; i<MaxSize;i++){
  9. (*L).data[i] = 0;
  10. }
  11. (*L).length = 0; //初始化长度为0
  12. };
  13. int main() {
  14. SqList L;
  15. InitList(&L);
  16. for(int j =0;j<10;j++){
  17. printf("data[%d]=%d ",j,L.data[j]);
  18. }
  19. return 0;
  20. }

效果如下所示 :

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

顺序表的动态分配

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

malloc函数

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

 使用malloc函数时需注意:

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

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

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

free函数

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

 C语言中 -> 和 . 的区别

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

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

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

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

  1. #include <stdio.h>
  2. typedef struct {
  3. int data[MaxSize];
  4. int length;
  5. }SqList;
  6. int main(){
  7. SqList L; //定义顺序表L
  8. return 0;
  9. }

 代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define InitSize 10 //定义初始长度
  4. typedef struct //定义顺序表结构体
  5. {
  6. int *data; //指针指向顺序表第一个元素的地址
  7. int Maxsize; //顺序表最大容量
  8. int length; //当前长度(已存放了多少个元素)
  9. }SqList; //结构体名:SqList
  10. void InitList(SqList *L) //初始化顺序表
  11. {
  12. L->data = (int *)malloc(InitSize * sizeof(int)); //开辟一段连续的地址空间
  13. L->length = 0; //初始长度为0
  14. L->Maxsize = InitSize; //更新表的最大容量
  15. for (int i = 0; i < L->Maxsize;i++)
  16. L->data[i] = 0; //最初元素值为0
  17. }
  18. void IncreaseSize(SqList *L, int len) //增加表长
  19. {
  20. int *p = L->data; //存方原来顺序表的首地址,
  21. L->data = (int *)malloc((L->Maxsize + len) * sizeof(int)); //根据新增长度重新开辟一段连续的地址空间构建新的顺序表
  22. for (int i = 0; i < L->Maxsize;i++) //将原来表中内容拷贝到新表中
  23. L->data[i] = p[i];
  24. for (int i = L->Maxsize; i < (L->Maxsize+len);i++) //其余元素值值为0
  25. L->data[i] = 0 ;
  26. L->Maxsize = L->Maxsize + len; //更新当前表的最大容量
  27. free(p); //释放原来表的内存空间
  28. }
  29. int main(void)
  30. {
  31. SqList L; //创建一个顺序表L
  32. InitList(&L); //初始化
  33. printf("The initial list:\n");
  34. for(int j =0;j<10;j++){
  35. printf("data[%d]=%d ",j,L.data[j]);
  36. }
  37. printf("\n");
  38. IncreaseSize(&L,5); //增加顺序表长度
  39. printf("Increase the length of the list:\n");
  40. for(int j =0;j<15;j++){
  41. printf("data[%d]=%d ",j,L.data[j]);
  42. }
  43. return 0;
  44. }

效果如下所示:

 总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/474640
推荐阅读
相关标签
  

闽ICP备14008679号