顺序表的基本操作
ListInster(&L,i,e): 插入操作--在表的第i个位置上插入e元素
假设在顺序表中插入元素c在第2个位置 即找到脚标为1的地址插入后面的元素依次往后移。
#define MaxSize 10 //定义最大长度
typedef struct{
EleType data[MaxSize];//用静态数组存放元素,使用静态方式实现
int length; //顺序表的当前长度
} sqlList; //顺序表的类型定义
void ListInsert(SqList &L,int i, int e){ /
for(int j=L.length;j>=i;j--) //i元素后面的元素后移
L.data[j] = L.data[j-1]; //将前一个元素放到后一个元素
L.data[i-1] =e; //在i处插入e
L.length++; //长度加1
}
// 1 这里注意i的合法值
优化判断条件
bool ListInsert(SqList &L,int i, int e){
if(i<1 || i>l.length+1)// 插入位置小于1或者大于表长度输出错误
return flase;
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; //在i处插入e
L.length++; //长度加1
return true;
}
int main(){
SqList L; //声明一个顺序表
InsertList(L); //初始化顺序表
.
. //插入元素
.
ListInsert(L,4,3); //位置4插入3
return 0;
}
时间复杂度
for: 关注最深层循环语句的执行次数与问题规模n的关系
最好情况 插入表尾,不需要移动
i=n+1 循环0次 时间复杂度:O(1)
最坏情况 插入表头,n个元素全部移动
i= 1 循环n次 时间复杂度:O(n)
平均情况 任意位置的插入概率相同 i = 1.2.3.4.....,length+1 的概率是 p = 1/n+1
平均循环次数;n/2
平均时间复杂度:O(n/2) =O(n)