文章目录
线性表的顺序存储(C语言)
一. 静态
1. 定义一个静态顺序表
# define MaxSize 50
typedef struct{
int data[MaxSize];
int length;
}SqList;
2. 初始化
void InitList(Sqlist &L)
{
for(int i = 0; i < MaxSize; i++)
{
L.data[i] = 0; //防止内存中有脏数据,所以进行初始化
}
L.length = 0; //将初始长度设为0
}
3. 插入:在表L的第i个位置插入元素e(注意这里的i是位序)
bool ListInsert (Sqlist &L, int i, int e)
{
if(i < 1 || i > L.length+1)
{
return false;
}
if(L.length >= MaxSize)
{
return false;
}
for(int j = L.length; j >= i; j--)
{
L->data[j] = L->data[j-1];
}
L->data[i-1] = e;
L.length++;
return true;
}
4. 删除:删除表L的第i个位置的元素,并将该元素的值保存到e中
bool ListDelete(Sqlist &L, int i, int &e)
{
if(i < 1|| i > L.length)
{
return false;
}
e = L->data[i];
for(int j = i; i < L.length; i++)
{
L->data[j-1] = L->data[j];
}
L.length--;
}
5.查找
(1)按位查找(i为位序)
在线性表中找到第i个元素,并返回其值
int GetElem(Sqlist &L, int i)
{
return L->data[i-1];
}
(2)按值查找
在线性表中找到第一个值为e的元素,并返回其位序
int LocateElem(Sqlist &L, int e)
{
for(int i = 0; i < L.length; i++)
{
if(L->data[i] = e)
return i+1;
}
return 0; //退出循环,说明查找失败
}
二. 动态分配
1. 定义一个动态的顺序表
# define InitSize 10
typedef struct{
int *data;
int MaxSize;
int length;
}Sqlist;
2. 初始化
void InitList(Sqlist &L)
{
L.MaxSize = InitSize;
L->data = (int*)malloc(sizeof(int)*InitSize);
L.length = 0;
}
3. 增加线性表长度
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 += len; //最大容量改变
free(p); //释放内存空间
}