一、线性表----顺序结构的优缺点
优点:存储密度大、可以随机存取表中任一元素
缺点:在插入、删除某一元素时,可能需要移动大量元素;浪费存储空间;属于静态存储,数据元素的个数不能自由扩充
二、算法ListInsert(&L,i,e) 在顺序表的随机位置插入数据
算法分析:
1、插入位置i是否合法?
2、存储空间是否已满?
3、插入位置以后的元素往后面挪;
4、现有数组长度加一;
2.1 插入算法实现
//实现顺序表的按位置插入算法,创建数组
#define length_max 100 //最大存储空间
#define error -1
#define ok 1
struct Arr // 创建数组结构:数组和当前长度
{
char a[length_max] = { };
int length = 0;
};
int arrInsert(Arr* p, int i, char b) //数组结构体,插入位置,插入的字母
{
if (i<1 || i>p->length+1) //插得位置合理吗
{
return error;
}
if (p->length == length_max) // 满了吗?
{
return error;
}
//需不需要挪动?
if ((p->length + 1) == i) //不需要挪动,正好插在末尾处
{
p->a[i - 1] = b;
}
else //
{
for (int j = 0; j < p->length - i + 1; j++)
{
p->a[p->length - j] = p->a[p->length - j - 1]; // 向后挪
}
p->a[i - 1] = b;
}
p->length++;
return ok;
}
int main()
{
Arr arr;
arrInsert(&arr, 1, 'h'); //第一个位置实际上是数组的0号位
arrInsert(&arr, 2, 'e');
arrInsert(&arr, 3, 'l');
arrInsert(&arr, 4, 'l');
arrInsert(&arr, 5, 'o');
arrInsert(&arr, 3, '5');
for (int i = 0; i < arr.length; i++)
{
cout << arr.a[i];
}
system("pause");
return 0;
}
三、算法ListDelete(&L,i,&e) 在顺序表的随机位置删除数据
算法分析:
1、删除位置i是否合理?
2、线性表是否为空?
3、删除位置后面的元素向前挪覆盖;
4、长度减一
int ArrDelete(Arr* p, int i) //顺序表,删除位置i 实际上删除位置应该是 i-1
{
if (p->length == 0)
{
return error;
}
if (i<1 || i>p->length)
{
return error;
}
for (int j = 0; j< p->length - i; j++)
{
p->a[i - 1 + j] = p->a[i + j];
}
p->length--;
return ok;
}
|