1. 静态链表
分配一整片连续内存空间,各个结点集中安置。用数组实现。
//定义一个静态链表
#define MaxSize 10
struct Node{
ElemType data;
int next;
};
void testSLinkList(){
struct Node a[MaxSize];
//…
}
由于静态链表已经被淘汰了,现在基本很少用到。
2. 顺序表
顺序表特点:
1.可以随机访问,时间复杂为O(1)。(连续存放)
2.存储密度高(只放数据)
3.不易拓展
4.插入删除需要移动大量元素。
- 静态分配法:(数组大小不能变化)
//定义一个顺序表:(静态分配)
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}Sqlist;
//初始化一个顺序表;
void InitList (Sqlist &L){
for(int i=0;i<MaxSize;i++){
L.data=0;
L.length=0; //必须做,防止脏数据
}
int main()
{
SqList L;
InitList(L):
//…
return 0;
}
- 动态分配法:(大小可以变化)
//定义一个顺序表:
#define InitSize 10
typedef struct{
int *data; //指示动态分配的指针
int MaxSize; //顺序表最大容量
int length; //顺序表当前长度
}SeqList;
//初始化一个顺序表
void InitList(SeqList &L){
L.data=(int*)malloc(sizeof(int)*InitSize));//malloc申请一片连续的存储空间
L.length=0;
L.MaxSize=InitSize;
}
int main(){
SeqList L;
InitList(L);
//....
return 0;
}
//增加动态数组的长度
void IncreaseSize(SqList &L,int len){ //len表示需要拓展多少长度
int *p=L.data; //p和data指针指向同一个位置
L.data=(int*)malloc(L.MaxSize+len)*sizeof(int));//申请了一片空间可以存下所有的数据元素(包括以前的和增加的)
for(int i=8;i<L.length;i++){ //将数据复制到新的位置
L.data[i]=p[i];
}
L.MaxSize=L.MaxSize+len;
free(p); //释放原来的空间
}
时间开销大。
- 顺序表的插入:(基于静态分配)
//插入一个元素
bool InsertList(SqList &L,int i,int e){ //在第i个位置插入元素e
if(i<1||i>L.length+1) //i输入不合法
return false;
if(L.length>=MaxSize) //该存储空间已经满了,不能插入
return false;
for(int j=L.length;j>=i;j--){ //将第i个元素后的元素后移
L.data[j]=L.data[j-1];
}
L.data[j-1]=e;
L.length++;
return true;
}