删除作为堆栈链接列表一部分的 Stack 的给定索引处的元素
Remove element at a given index of a Stack that is a part of linked list of stacks
我正在构建 StackList。这是 StackNodes 的链表。 StackNode 上的每个堆栈都是恒定大小的(它是一个 int 数组)。如果堆栈已满,我使用 malloc 创建一个新的 StackNode 并将其附加到 StackList。
我需要实现一个函数调用
int popAt(int index);
哪个应该return索引指定的元素。
场景:
每个堆栈的长度 = 10;
StackList 共有 5 个堆栈。因此,我的 StackList 中的元素数量是每个堆栈 10 * 5 组 = 41 - 50(最多可以是 50)。我想删除索引 = 25 处的元素。这意味着它位于我的 StackList 的 2ed StackNode 和该 StackNode 堆栈中的第 4 个索引。当我删除第 25 个元素时,我需要将其顶部的每个元素向下推一个元素。
我的解决方案:
Copy elements on 2nd stack that is above 24th element one position down.
do {
Copy next StackNode->stack's first element to the end of Current stacks
//Problem here
select next StackNode
} while ( linked list has StackNodes)
问题:
我想将堆栈中的所有元素向下移动一个位置。是否可以在不遍历数组(每个 StackNode 上的堆栈)的情况下执行此操作,因为如果我有 n 个 StackNode,那么我需要遍历 n * 堆栈大小。即,如果我的 3ed 堆栈从 0x8000 开始,那么实际数据从 0x8004 开始,因为我删除了第一个元素并将其附加到第二个堆栈的末尾。所以我需要将值 0x8004 到 0x8000 等等,直到 0x8028 到 0x8024,然后继续对所有其他堆栈执行此操作。有没有比使用 for 循环移动每个元素更好的解决方案。我知道函数 memcpy 但由于内存地址重叠,我不确定传入
是否是个好主意
memcpy(0x8000, 0x8004, 9) //assume my stack size is 10;
注:
链表是由以下结构定义的 StackNode 类型
struct StackNode {
int* stack;
StackSet* nextStack;
StackSet* previousStack;
}
希望我足够清楚:)
谢谢
你说得对,如果内存区域重叠,memcpy()
将不起作用。
对于这种情况,存在一个不同的函数,memmove()
。它的工作原理与 memcpy()
相同,但包含额外的检查以处理重叠的内存区域。
我正在构建 StackList。这是 StackNodes 的链表。 StackNode 上的每个堆栈都是恒定大小的(它是一个 int 数组)。如果堆栈已满,我使用 malloc 创建一个新的 StackNode 并将其附加到 StackList。
我需要实现一个函数调用
int popAt(int index);
哪个应该return索引指定的元素。
场景:
每个堆栈的长度 = 10;
StackList 共有 5 个堆栈。因此,我的 StackList 中的元素数量是每个堆栈 10 * 5 组 = 41 - 50(最多可以是 50)。我想删除索引 = 25 处的元素。这意味着它位于我的 StackList 的 2ed StackNode 和该 StackNode 堆栈中的第 4 个索引。当我删除第 25 个元素时,我需要将其顶部的每个元素向下推一个元素。
我的解决方案:
Copy elements on 2nd stack that is above 24th element one position down.
do {
Copy next StackNode->stack's first element to the end of Current stacks
//Problem here
select next StackNode
} while ( linked list has StackNodes)
问题:
我想将堆栈中的所有元素向下移动一个位置。是否可以在不遍历数组(每个 StackNode 上的堆栈)的情况下执行此操作,因为如果我有 n 个 StackNode,那么我需要遍历 n * 堆栈大小。即,如果我的 3ed 堆栈从 0x8000 开始,那么实际数据从 0x8004 开始,因为我删除了第一个元素并将其附加到第二个堆栈的末尾。所以我需要将值 0x8004 到 0x8000 等等,直到 0x8028 到 0x8024,然后继续对所有其他堆栈执行此操作。有没有比使用 for 循环移动每个元素更好的解决方案。我知道函数 memcpy 但由于内存地址重叠,我不确定传入
memcpy(0x8000, 0x8004, 9) //assume my stack size is 10;
注:
链表是由以下结构定义的 StackNode 类型
struct StackNode {
int* stack;
StackSet* nextStack;
StackSet* previousStack;
}
希望我足够清楚:) 谢谢
你说得对,如果内存区域重叠,memcpy()
将不起作用。
对于这种情况,存在一个不同的函数,memmove()
。它的工作原理与 memcpy()
相同,但包含额外的检查以处理重叠的内存区域。