其他分享
首页 > 其他分享> > 数据结构— —顺序表(静态分配、动态分配)

数据结构— —顺序表(静态分配、动态分配)

作者:互联网

1.线性表存储/物理结构

1)顺序表(顺序存储结构)
定义: 顺序存储方式的线性表。
逻辑上相邻的元素存储在物理上也相邻的存储单元中,元素间关系由存储的邻接关系体现。
基本操作的实现:
2)链表(链式存储)

2.顺序表的实现— —静态分配

在这里插入图片描述

简单小代码:

#include <stdio.h>
#define MaxSize 10  //定义最大长度
typedef struct{
    int data[MaxSize];   //静态数组存放数据
    int length;          //顺序表的当前长度
}SqList;//顺序表的类型定义

//基本操作之初始化一个顺序表
void InitList(SqList &L)
{
    for(int i=0;i<MaxSize;i++)//将所有数据元素设置为默认初始值
        L.data[i]=0;
    L.length=0;
}

int main()
{
    SqList L;     //声明一个顺序表L
    InitList(L);//初始化顺序表L
    //...未完待续~
    return 0;
}

???默认初始值是否一定要添加

现在来把初始化代码去掉,看看会发生什么
运行结果:
在这里插入图片描述
— —哦,出错!为什么会出现什么这种现象呢?
— —这是因为内存中会有遗留的“脏数据”。在声明顺序表时,分配的连续内存空间并不知道之前存储的数据,所以不设置默认值会受之前存储数据的影响,出现一些奇怪的数字。

— —有人会说:啊,C语言不是会自动给 int 型变量设置初始值嘛?
— —这里要说,设置默认值是多少这是编译器做的事情,换一个编译器就可能不会帮你做初始化工作。

3.顺序表的实现— —动态分配

在这里插入图片描述

简单小代码:

#include <stdio.h>
#include <stdlib.h>
#define InitSize 10
typedef struct{
    int *data;
    int MaxSize;
    int length;
}SeqList;

void InitList(SeqList &L){
   L.data=(int *)malloc(InitSize*sizeof(int));//存储空间大小:10*4B
   L.length=0;
   L.MaxSize = InitSize;
}

//增加动态数组的长度
void IncreaseSize(SeqList &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;    //顺序表最大长度增加len
    free(p);    //释放原来的内存空间
}

int main()
{
    SeqList L;     //声明一个顺序表L
    InitList(L);//初始化顺序表L
    //...往顺序表中插入几个元素
    IncreaseSize(L,5);
    return 0;
}

4. 顺序表的特点

1)随机访问,即可以在O(1)时间内找到第 i 个元素。
2)存储密度高,每个节点只存储数据元素
3)拓展不方便(即使采用动态分配方式实现,时间复杂度也比较高)
4) 插入、删除操做不方便,需要移动大量元素

标签:malloc,顺序,静态,动态分配,int,MaxSize,数据结构,data
来源: https://blog.csdn.net/qq_43581971/article/details/120351746