顺序表
1.顺序结构的特点
- 表中数据存放在一组连续的空间之中。
- 数据元素在存储空间中的鼠须贺他们的物理逻辑顺序相同。
- 根据元素编号可计算出它们的存储地址 公式:ADR(ai) = ADR(a1) + (i - 1) * S。
2.注意
- 一维数组占据是一串连续的存储空间,可以静态分配,也可以动态分配。
- 存储的数据元素数据超过了数组的大小就会发生“溢出”,当发生“溢出“的时候可以动态分配一个更大的数组,但频繁的重新分配可能会降低程序的性能。
3.顺序表的结构体类型定义
typedef int DataType; //线性表的数据结构类型
#define MaxSize 2000 // 2000是预估的线性表的最大长度,表示的是能存放的做多的元素
typedef struct {
DataType list[MaxSize]; //DateType为线性表中的数据元素类型
int len; //顺序表的长度,现在表中已存的数据元素个数
}SeqList;
4.顺序表的运算
- 顺序表的初始化:因为是静态的线性表,所以只需要将长度设置为0即可
void initlist(SeqList* L)
{
L->len = 0;
}
void CreateList(SeqList *L)
{
int i = 0;
printf("输入线性表的长度:\n");
cin >> L->len;
printf("输入线性的元素:\n");
for (int i = 0; i < L->len; i++)
{
int t;
cin >> t;
L->list[i] = t;
}
}
void ClearList(SeqList* L)
{
L->len = 0;//逻辑清空,实际内存还在被占用
}
void OutPutList(SeqList* L)
{
for (int i = 0; i < L->len; i++)cout << L->list[i] << " ";
}
int GetLength(SeqList* L)
{
return L->len;
}
int IsEmty(SeqList* L)
{
if (L->len != 0)return 1;
else L-> len;
}
int GetElem(SeqList* L, int i)
{
if (i < 0 || i > L->len)
{
printf("error!");
exit(1);
}
return L->list[i];
}
int SearchList(SeqList* L, DataType elem)
{
int i = 0;
for (int i = 0; i < L->len; i++)
{
if (elem == L->list[i])return i;
}
return -1;
}
void InsertList(SeqList* L, DataType elem, int i)
{
if (L->len == MaxSize)
{
printf("overflew!");
exit(1);
}
if (i < 0)i = 0;
else if (i > L->len)i = L->len;
for (int k = L->len; k >= i; k--)
{
L->list[k + 1] = L->list[k];//调正位置
}
L->list[i] = elem;//插入元素
L->len++;//增加长度
}
void ComList(SeqList* L, SeqList *L2)
{
for (int i = 0; i < L2->len; i++)
{
L->list[L->len + i] = L2->list[i];
}
L->len = L->len + L2->len;
}