2.3 顺序表基本操作之求表长,按值按位查找,删除,销毁
昨天已经学完了顺序表的部分基本操作,今天学习剩下的基本操作。重点是查找和删除。
1.删除
按值删除
成功返回1否则返回0
int ListDeleteByData(SeqList *L, ElemType data)
{
int i = 0, j = 0;
if (ListEmpty(L))
return 0;
for (i = 0; i < L->length; i++)
{
if (L->data[i] != data)
{
L->data[j] = L->data[i];
j++;
}
}
L->length = j;
if (i == j)
{
return 0;
}
return 1;
}
按位置删除
思路:按位置删除数据元素,将第i个元素后面的值均向前移动一个位置
int ListDelete(SeqList *L, int i, ElemType e)
{
int j;
if (i < 1 || i > L->length)
return 0;
i--;
for (int j = i; j < L->length - 1; j++)
{
L->data[j] = L->data[j + 1];
}
L->length--;
return 1;
}
2.按值查找
顺序表中查找第一个元素值等于e的元素,返回其位序
思路:遍历顺序表即可,值相等返回位序否则返回0
int LocateElem(SeqList *L, ElemType e)
{
int i;
for (i = 0; i < L->length; i++)
{
if (L->data[i] == e)
{
return i + 1;
}
}
return 0;
}
3.按位查找
返回第i个元素的值
int LocateElem(SeqList *L, int i, ElemType e)
{
if (i < 1 || i > L->length)
return 0;//不是很严谨,意思一下
return L->data[i - 1];
}
4.求表长
int ListLength(SeqList *L)
{
return L->length;
}
5.销毁
void DestoryList(SeqList *L)
{
free(L);
}
总结:
1.顺序表是用一组地址连续的存储单元,依次存储线性表中的数据元素。
特点是逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。优点则是通过元素序号查找元素方便。
2.顺序表这些基本操作中重点注意的是初始化,插入,删除。
初始化:手动申请顺序表的存储空间,将length设为0即可。
插入:(从空表依次插入)每插入一次length++;(给定位置插入)将该位置及后面的元素全部后移一位,给该位置赋值length++。
删除:(给定位置删除)将该位置后面的所有元素全部前移一位length–;(按值删除)把一个数组看成两个数组,将不等于该值的元素存入第二个数组根据两数组长度判断是否删除成功。