顺序表#
用顺序结构的方式实现线性表的顺序存储。把逻辑上相邻的元素存储在物理地址位置上也相邻的存储单元中。 顺序表的实现,静态分配
#include<iostream>
#define Maxsize 10
using namespace std;
typedef struct {
int data[Maxsize];
int lengh;
}SqList;
void InitList(SqList&L) {
for (int i = 0; i < Maxsize; i++)
L.data[i] = 0;
L.lengh = 0;
}
int main()
{
SqList L;
InitList(L);
for (int j = 0; j< Maxsize; j++)
{
cout<< L.data[j]<< endl;
}
system("pause");
return 0;
}
正规情况,上述输出一般不会被实行,因为我们定义了lengh,违规访问大于lengh的元素是不合理的。一般情况应该用基本操作来实现。 顺序表的实现,动态分配 动态案例
#include<iostream>
#include<stdlib.h>
#define Initsize 10;
typedef struct {
int Maxsize=Initsize;
int *data;
int length;
}SqList;
void InitList(SqList &L);
void Increasesize(SqList &L, int len);
int main() {
SqList L;
InitList(L);
Increasesize(L,5);
system("pause");
return 0;
}
void InitList(SqList &L) {
L.data = (int*)malloc(L.Maxsize * sizeof(int));
L.length = 0;
L.Maxsize = Initsize;
}
void Increasesize(SqList &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);
}
顺序表的特点 1.随机访问,即可以在O(1)时间内找到第i个元素。 2.存储密度高,每个节点只存储数据元素。 3.拓展容量不方便。
顺序表的插入和删除##
顺序表的插入,先将要插入的位置以及之后的数据向后移动,然后在此处插入元素,基本代码如下:
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;
L.length++;
}
}
上述代码的健壮性不高,因为没有对i进行判断,使1<i<L.length+1,并且应判断L.length是否大于最大长度,可留作练习后面自行判断。 顺序表的删除 时间复杂度: 最好情况:删除表尾,不需要移动其他元素,i=n,循环0次,最好时间复杂度为O(1); 最坏情况:删除表头,循环n次,时间复杂度为O(n); 平均时间复杂度:删除任意一个地方的元素概率相同,p=1/n;平均循环次数=(n-1)p+(n-2)p+…1p=n(n-1)/2n=(n-)/2 时间复杂度为O(n);
顺序表查找##
顺序表的查找过程中,条件语句用于判断所查找的值是否在顺序表中,可以直接用“= =”来进行条件判断,一般考研中如果没有明确说明大纲的使用语言,这种类似伪代码的代码形式是可以的,但是其不够严谨,因为“==”不能判断类似结构体这种的数据类型,如果要求语言类别,应该尽量使用相应的语言去完善代码,从而保证代码的健壮性。
|