数据结构:顺序表
1 顺序表的定义
静态分配:
#define MaxSize 100线性表最大长度
//数组静态分配
typedef struct
{
ElemType data[MaxSize];//ElemType为数量类型,可根据实际替换成想要的数据类型,如int
int length;//当前长度
}SqList;
动态分配:
//数组动态分配
#define MaxSize 100线性表最大长度
#define InitSize 100//线性表初始分配量
typedef struct
{
ElemType *data
int MaxSize,length;//最大容量和当前个数
}SqList;
如果是复杂类型,可以先将数据类型定义好:
//线性表P=((p1,e1),(p2,e2),,,(pm,em))
typedef struct//多项式非零项
{
float p;//系数
int e;//指数
}Polynomail;
//数组动态分配
typedef struct
{
Polynomail* elem;//存储空间基地址
int length;//多项式中当前项个数
}SqList;//多项式中的 顺序存储结构类型 SqList
SqList L;
L.data = new Polynomail[InitSize];//记得要手动释放
maxsize为最大长度,length记录当前长度


补充一下简单操作:
初始化:
Status Init_Sq(SqList& L)//Status为函数返回值类型
{
L.data = new ElemType[MaxSize];//分配空间
if (!L.data)exit(OVERFLOW);//分配失败,返回溢出
L.length = 0;//当前长度
return OK;
}
销毁:
void Destory(SqList& L)
{
if (L.data)delete L.data;//释放存储空间
}
清空:
void Clear(SqList& L)
{
L.length = 0;//将线性表长度置为0
}
返回线性表长度:
int GetLength(SqList& L)
{
return(L.length);
}
判断线性表是否为空
int IsEmpty(SqList& L)
{
if (L.length == 0)return 1;
else
{
return 0;
}
}
基本操作:
1 顺序表的取值(根据位置i获取相应位置元素的内容)
随机存取,时间复杂度为O(1)
int GetElem(SqList L, int i, ElemType& e)
{
if (i < 1 || i > L.length)//判断i值是否合理
return ERROR;
e = L.data[i - 1];//下标
return OK;
}
2 按值查找(顺序查找)
在顺序表L中查找第一个元素值等于e的元素,并返回其位置
int LocateElem(SqList L, ElemType e)
{
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == e)
{
return i + 1;//查找成功,返回序号
}
}
return 0;
}
3 顺序表的插入
bool ListInsert(SqList& L, int i, ElemType 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[i - 1] = e;//在i位置上放入e
L.length++;//长度加1
return true;
}
3 删除
bool Delete(SqList& L, int i, ElemType& e)
{
if (i < 1 || i >L.length)
return false;
e = L.data[i - 1];
for (int j = i; j <L.length ; j++)
{
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
4 顺序表优缺点:
优点:
- 存储密度大
- 可以随机存取
缺点: - 在插入、删除某一元素时,需要移动大量元素
- 浪费存储空间
- 属于静态存储形式,数据元素的个数不能自由扩充