数据结构学习:顺序表的创建
如何使用代码创建一个静态顺序表,并初始化
#include <iostream>
using namespace std;
#define MaxSize 10 //定义最大长度
typedef struct{
int data[MaxSize]; //采用静态数组来存放数据元素
int length; //顺序表的当前长度
}SqList; //定义结构体顺序表的名称为SqList
void InitList(SqList &L)
{
for(int i = 0; i < MaxSize; i++)
L.data[i] = 0; //将表里的所有元素设为0初始值
L.length = 0; //顺序表的初始长度为0
}
int main()
{
SqList L; //声明一个顺序表
InitList(L); //初始化顺序表
for(int i = 0; i < MaxSize; i++)
cout<<"data["<<i<<"] = "<<L.data[i]<<endl;
return 0;
}
运行结果为:
data[0] = 0
data[1] = 0
data[2] = 0
data[3] = 0
data[4] = 0
data[5] = 0
data[6] = 0
data[7] = 0
data[8] = 0
data[9] = 0
如果不初始化的话,
#include <iostream>
using namespace std;
#define MaxSize 10 //定义最大长度
typedef struct{
int data[MaxSize]; //采用静态数组来存放数据元素
int length; //顺序表的当前长度
}SqList; //定义结构体顺序表的名称为SqList
void InitList(SqList &L)
{
L.length = 0; //顺序表的初始长度为0
}
int main()
{
SqList L; //声明一个顺序表
InitList(L); //初始化顺序表
for(int i = 0; i < MaxSize; i++)
cout<<"data["<<i<<"] = "<<L.data[i]<<endl;
return 0;
}
打印表中信息为:
data[0] = 503362864
data[1] = 32613
data[2] = 0
data[3] = 0
data[4] = 4199024
data[5] = 0
data[6] = 4198560
data[7] = 0
data[8] = -1926700400
data[9] = 32765
内存中会有遗留的脏数据
但是初始化一般是可以省略的,因为本来这种打印顺序表信息的方式就是违规的,因为定义的当前顺序表的长度为0,我们也并没有向表内存储信息,打印时令i < L.length的话,打印为空。
更好的做法是使用基本操作来访问各个数据表
静态分配存在一些问题顺序表的表长刚开始确定后就无法更改(存储空间是静态的),存储满了以后是无法扩大的提前声明会导致内存空间的不足或者浪费。
所以就要用到动态表
顺序表的实现 —— 动态分配
可以通过使用malloc函数来申请一片连续的内存空间来存储数据,要增加内存空间时,则申请一片更大的空间来储存,并将原来的空间释放
要注意malloc函数的头文件#include<stdlib.h>。
#include <iostream>
#include<stdlib.h>
using namespace std;
#define InitSize 10 //顺序表的初始长度
typedef struct{
int *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
} SeqList; //顺序表的类型定义(动态分配方式)
void InitList(SeqList &L)
{//用malloc函数申请一片连续的存储空间来存储数据
L.data = (int *)malloc(InitSize*sizeof(int));
//(int *)中的int要与结构体中data指针的数据类型保持一致
L.length = 0; //顺序表的初始长度为0
L.MaxSize = InitList;
}
//增加动态数组的长度
void IncreaseSize(SeqList &L,int 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; //声明一个顺序表
InitList(L); //初始化顺序表
IncreaseSize(L,5); //顺序表增加5个元素的空间
return 0;
}