我有这些函数,用于从一组有序对中创建凸边界。如果有人熟悉格雷厄姆扫描,那么我相信它将有助于理解这些函数的本质。不管怎样,每个函数的用途都有描述。
我认为 popBack
工作不正常,我将其他两个函数放在了一些反馈中。欢迎提出有关如何修复 popBack
和其他可能错误的建议。
typedef struct
{
float x;
float y;
} point;
typedef struct
{
int size;
int capacity;
point *values;
} list;
// Remove the last item from the list
void popBack(list *p)
{
int x;
if (p->size > 0){
x = p->size - 1;
p->values[x] = p->values[x + 1];
}
}
// Return the last item from the list
point getLast(list *p)
{
point value;
value = p->values[p->size];
return value;
}
// Return the next to the last item
point getNextToLast(list *p)
{
point value;
value = p->values[p->size - 1];
return value;
}
最佳答案
通常,pop
函数会删除列表末尾的项目,并返回它。否则你可以简单地将其实现为
void popBack(list *p) {
if (p->size == 0)
return;
p->size--;
}
如果你想返回一个值,那么:
point popBack(list *p) {
int indexLast = p->size - 1; /* index of the last element in the list */
if (indexLast < 0)
return 0; /* error */
p->size = indexLast; /* also happens to be the new size after one element is removed */
return p[indexLast];
}
目前,您的代码可能没有执行其应该执行的操作的原因是因为这一行:
p->values[x] = p->values[x + 1];
获取列表的最后一个元素,并分配最后一个元素之后的元素的值,这由于各种原因都是有问题的。
关于C:使用列表的数组的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28710636/