算法
算法特征:
1.有穷性
2.确定性
3.可行性
4.输入和输出
算法好坏评价:
算法效率的度量:
线性表
-
顺序存储:线性表
-
链式存储 :
指针实现
静态链表(借助数组实现)
顺序表存储定义
使用数组静态定义:即存储空间一旦满,再加入新的数据将产生溢出。
#define Maxsize 50 //定义线性表的最大长度
typedf struct
{
Elemtype *data;//顺序表的元素
int length; // 顺序表的当前长度
}Seqlist; //顺序表的定义
使用数组动态定义:即存储数据的空间满时,可以使用realloc申请更大的空间,代替原来的空间。
#define MaxSize 100 //表的长度初始定义
typedef struct
{
ElemType *data; //指示动态分配数据的指针
int MaxSize, length; //数组的最大的容量和当前的个数
} SqList; //动态分配数据顺序表的类型定义
c语言动态申请空间:L.data=(Elemtype*)malloc(sizeof(Elemtype)*InitSize)
特点:‘
1.顺序表是一组地址连续的存储单元。故表中的元素逻辑顺序与物理顺序相同。
2.可以随机存储,且存储密度大。
3.缺点是在插入和删除需要移动大量元素。
顺序表插入
bool ListInsert(Sqlist &L, int i, ElemType e)
{
//将元素e插入到顺序表L中的第i个位置
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[i-1] = e;
L.length++;
return true;
}
此时插入的平均时间复杂度是O(n)。
顺序的删除
bool Listdele(Sqlist &L, int i, ElemType &e)
{
//删除顺序表L中的第i个位置,并用e作为返还值
if(i<1 || i > L.length +1) //判断i的位置是否有效
return false;
e = L.data[i-1];
for(int j=i; j<L.length; j--) //找到插入i位置,并将其以及之后的元素后移
L.data[j-1]= L.data[j];
L.length--;
return true;
}
此时删除的平均时间复杂度是O(n)。