静态分配 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之后要强制转型)
