顺序表
逻辑上相邻的数据元素物理上也相邻
&:引用符号
静态分配
maxsize一旦确定就不可更改(存储空间是静态的) //缺点哦
ps:如果不进行初始化的话,内存中可能会由遗留的“脏数据”
#define MaxSize 10//
typedef struct{
int data[MaxSize];
int length;
}SqList;
动态分配
#define InitSize 10
typedef struct{
ElemType *data
int MaxSize;
int length;
}SeqList;
malloc:申请一整片连续的储存空间 //包含在#include<stdlib.h>中
L.data = (ElemType *) malloc (sizeof(ElemType) * InitSize);
(ElemType *):malloc函数执行结束后会返回一个申请的存储空间开始地址的指针,我们需要强制转型为我们定义的数据元素类型指针,然后赋值给顺序表中的data指针变量。
(sizeof(ElemType) * InitSize):malloc申请多大的空间就由这个参数决定。
来一个完整的:
顺序表的实现–动态分配,增加动态数组的长度
#include <iostream>
#include <stdlib.h>
using namespace std;
#define InitSize 10 //默认的最大值
typedef struct{
int *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表当前的长度
}SeqList;
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);
}
void InitList(SeqList &L){
//用malloc申请一片连续的存储空间
L.data = (int *)malloc(InitSize*sizeof(int));
L.length = 0;
L.MaxSize = InitSize;
}
int main(){
SeqList L;
InitList (L);
//...往顺序表里面随便插入几个元素...
IncreaseSize(L,5) ;
cout<<"结束了嗷,铁子"<<endl;
return 0;
}
顺序表大特点:
- 随机访问,可以在0(1)时间内找到第i个元素。
- 存储密度高,=1.
- 拓展容量不方便,静态分配不可以拓展,动态分配时间复杂度高
- 插入删除操作不方便,需要移动大量元素。
插入算法
void ListInsert(SqList &L, int i, int e){
for(int j = L.length; j >= i; j--)
L.data[j] = L.data[j-1]; //元素后移一位
L.data[i-1] = e; //在i处插入呗
L.length ++; //长度加1
}
注意:顺序表中所有元素都得相邻(可以提前用条件判断语句判读i是否合法 即i属于[1 , length+1] );此外,若表满,也应该提示。(给别人用着舒服)
ps:健壮性
bool ListInsert(SqList &L, int i, int e){
if(i<1 ||i>L.length + 1 )
return false;
if(L.length >= MaxSize)
return false;
for(int j = L.length; j >= i; j--)
L.data[j] = L.data[j-1]; //元素后移一位
L.data[i-1] = e; //在i处插入呗
L.length ++; //长度加1
return true;
}
用某一个类型的指针+[下标]的形式访问数据,系统给你拿数据的时候,每一次取几个字节与你指针指向的类型有关(呼应前面:malloc之后要强制转型)