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

一、静态分配

1. 定义并且初始化顺序表

注:
(1)在内存中分配存储顺序表L的空间。包括MaxSize*sizeof(ElemType)和存储length的空间
(2)把各个数据元素的值设为默认值(可省略)
(3)将length长度设为0

#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;	//顺序表初始长度为0
	}
}
int main()
{
	Sqlist L;	//申明一个顺序表
    Initlist(L);	//初始化顺序表
    return 0;
}

2.当没有设置数据元素的默认值时,以下情况会存在脏数据

/*不初始化数据元素,内存不刷0*/
#include <stdio.h>
#define MaxSize 10	//定义最大长度
typedef struct{
	int data[MaxSize];	//用静态的“数组”存放数据元素
	int length;	//顺序表的当前长度
}Sqlist;	//顺序表的定义类型
//基本操作:初始化一个顺序表
void Initlist(Sqlist &L){
	//没有设置数据元素的初始值
		L.length=0;	//顺序表初始长度为0
	
}
int main()
{
	Sqlist L;	//申明一个顺序表
    Initlist(L);	//初始化顺序表
	//尝试“违规”的打印整个data数组
	for(int i=0;i<MaxSize;i++){
		printf("data[%d]=%d\n",i,L.data[i]);
	}
    return 0;
}

运行结果:
在这里插入图片描述

在main函数中for做如下修改:

for(int i=0;i<L.length;i++

此时由于L.length初始化为0,故不执行for循环中的printf语句

3.最好访问方式是使用顺序表中的按位查找方式访问各个数据元素

#include <stdio.h>
#define MaxSize 10
typedef struct {
	int data[MaxSize];
	int length;
}Sqlist;
void Initlist(Sqlist& L) {
	L.length = 0;
}
void Getelem(Sqlist &L, int i) {
	L.data[i - 1] = 5;
}
int main()
{
	Sqlist L;
	int i=1;
	Initlist(L);
	Getelem(L, i);
	printf("L.data[%d]=%d\n", i, L.data[i-1]);
	return 0;
}

二、动态分配

1.动态分配所需函数

C语言中malloc和free函数
malloc函数返回一个指针,需要强制转型为定义的数据元素类型指针
malloc函数的参数指明要分配多大的连续内存空间

L.data=(ElemType *)malloc(sizeof(ElemType)*InitSize);

malloc和free函数包含在#include<stdlib.h>头文件中

2.动态分配部分代码

#include <stdio.h>
#include<stdlib.h>
#define InitSize 10	//默认的最大长度
typedef struct{
	int MaxSize;
	int length;
	int *data;	//指示动态分配数组的指针
}Seqlist;
void Initlist(Seqlist &L){
	//用malloc函数分配一段连续的内存空间
	L.data=(int *)malloc((sizeof(int)*InitSize);
	L.length=0;
	L.MaxSize=InitSize;
}
//动态增加数组的长度
void IncreaseSize(Seqlist &L,int len){
	int *p=L.data;
	L.data=(int *)(malloc(sizeof(int)*(L.MaxSize+len));
	for(int i=0;i<L.length;i++){
		L.data[i]=p[i];	//将数据复制到新的区域
	}
	L.MaxSize=L.MaxSize+len;
	free(p);	//释放原来的内存空间
}
				  						 
int main(){
	Seqlist L;
	Initlist(L);
//往顺序表插入几个元素(此处暂时省略)
    
	IncreaseSize(L,5);
	return 0;
	}

动态增加数组过程:
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值