顺序结构存储的线性表操作
顺序结构存储的线性表是一种使用连续内存空间来存储元素的数据结构。在这种结构中,元素之间的相对位置通过物理存储位置直接反映出来,即元素在内存中的地址是连续的。下面,我们将基于您提供的代码片段,详细讨论顺序结构线性表的基本操作,包括初始化、查找、插入、删除以及区间删除。
1. 初始化(MakeEmpty
)
List MakeEmpty(){
List l;
l = (struct LNode*)malloc(sizeof(struct LNode));
l->Last=-1; // 初始化时,表为空,Last设为-1表示没有元素
// 注意:这里假设LNode结构体中至少包含Last(表示最后一个元素的索引)和Data(存储元素的数组)
// 但Data数组并未在MakeEmpty中初始化,通常需要在结构体定义时静态分配或动态分配
// 这里假设Data已经在LNode中定义,并且有足够的空间
return l;
}
2. 查找(Find
)
Position Find(List L, ElementType X){
int i;
for (i = 0; i <= L->Last; i++)
if(L->Data[i]==X) return i; // 找到元素X,返回其位置
return ERROR; // 假设ERROR是一个定义好的错误码,表示未找到
}
3. 插入(Insert
)
bool Insert(List L, ElementType X, Position P){
if (L->Last == MAXSIZE - 1) { // 检查是否已满
printf("FULL");
return false;
}
if (P < 0 || P > L->Last + 1) { // 检查插入位置是否合法
printf("ILLEGAL POSITION");
return false;
}
// 将P位置及之后的元素向后移动一位
for (int i = L->Last; i >= P; i--)
L->Data[i+1] = L->Data[i];
L->Data[P] = X; // 在P位置插入新元素
L->Last++; // 更新Last指针
return true;
}
4. 删除(Delete
,单个元素)
bool Delete(List L, Position P){
if (P < 0 || P > L->Last) {
printf("POSITION %d EMPTY", P);
return false;
}
// 将P位置之后的元素向前移动一位
for (int i = P+1; i <= L->Last; i++) {
L->Data[i-1] = L->Data[i];
}
L->Last--; // 更新Last指针
return true;
}
5. 区间删除(Delete
,多个元素)
List DeleteRange(List L, ElementType minD, ElementType maxD){
int count=0;
for(int i=0; i<=L->Last; i++){
if(L->Data[i] >= minD && L->Data[i] <= maxD) count++; // 统计需要删除的元素数量
}
// 从后向前遍历,避免覆盖未处理的元素
for(int i=L->Last; i>=0; i--){
if(L->Data[i] >= minD && L->Data[i] <= maxD){
// 向前移动元素,覆盖需要删除的元素
for(int j=i; j<L->Last-count; j++)
L->Data[j] = L->Data[j+1];
L->Last--; // 更新Last指针
}
}
// 注意:这里简化了处理逻辑,实际中可能需要更复杂的逻辑来确保效率
// 例如,可以先找到第一个和最后一个需要删除的元素的位置,然后一次性移动
return L; // 返回修改后的线性表
}
注意:上述区间删除函数DeleteRange
的实现为了简化理解,采用了较为直观但可能不是最高效的方法。在实际应用中,为了提高效率,可以考虑先找到第一个和最后一个需要删除的元素的位置,然后一次性移动剩余的元素。此外,原函数名Delete
与单个元素删除函数冲突,这里改为DeleteRange
以避免混淆。