2.2线性表的顺序表示
2.2.1顺序表的定义
顺序表:用顺序存储方式的线性表就是顺序表
它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使逻辑上相邻的两个元素在物理位置上也相邻。
线性表的顺序存储结构
每个数据元素的存储位置都和线性表的起始位置相差一个和该数据元素的位序成正比的常数,因此,线性表中的任一数据元素都可以随机存储,所以线性表的顺序储存结构是一种随机的储存结构。。
静态分配:
静态分配时,由于数组大小和空间事先已经固定,一旦空间占满,再加入新的数据就会溢出,导致程序崩溃。
静态数据结构代码:
#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; //不可以超过。如果不赋初值(正常int编译器会赋值为0)但是可能会遇见内存遗留的脏数据,出现奇怪数字
}
L.length=0; //顺序表初始长度为0
}
int main(){
SqList L;
InitList(L);
for(int i=0;i<=L.length;i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
}
动态分配:
如果数组存满了怎么办?
只能放弃治疗,数组长度一旦确定就无法更改。
动态分配的实现
能使数组的内存不断扩增的原理就是每次定义一个更大的数组然后将它复制过去。
注:动态分配不是链式存储,它同样属于顺序存储结构。
malloc函数需要返回一个指针所以,malloc前面的括号来将指针类型转化为所需类型的指针 ,后面的括号用来申请所需空间的大小,用长度乘类型所需的空间大小得出结果。
动态顺序表代码
#include<stdlib.h> //使用malloc函数时需要
#define InitSize 10 //默认顺序表的最大长度
typedef struct{
int *data; //动态数组的指针
int MaxSize; //顺序表的最大容量(在扩大顺序表的时候需要用到)
int length; //顺序表当前的长度
}SeqList; //结构体名称
void InitList(SeqList &L){//初始化定义顺序表
L.data=(int *)malloc(InitSize*sizeof(int));//用malloc函数来申请一片连续的空间(malloc申请,free释放)
L.length=0;
L.MaxSize=InitSize;
}
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; //更新最大长度
free(p); //释放原来申请的动态地址
}
int main(){
SeqList L; //定义顺序表
InitList(L); //初始化顺序表
//...往顺序表中随机插入数据
IncreaseSize(L,5); //将顺序表增加5个长度
return 0;
}
总结: