我使用这些函数从一组有序对中创建凸边界。如果有人熟悉格雷厄姆扫描,那么我相信它将有助于理解这些功能的本质。无论如何,都有描述每个功能的用途。
我不认为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;
}
答案 0 :(得分:0)
通常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];
获取列表的最后一个元素,并在最后一个元素之后指定元素的值,由于各种原因这是有问题的。
答案 1 :(得分:0)
popBack
您只需要减小列表的大小。你的功能根本没有任何意义。您在函数中所需要的只是:
void popBack(list *p)
{
p->size--;
}
顺便说一句,习惯上返回弹出的项目。您应该将功能更改为:
point popBack(list *p)
{
p->size--;
return p->values[p->size];
}
getLast
您将返回错误的项目。如果size
等于1,则需要返回列表中的第一项 - 即p->values[0]
而非p->values[1]
该功能可以简化为:
point getLast(list *p)
{
return p->values[p->size-1];
}
getNextToLast
更改为getLast
后,此功能需要返回p->values[p->size-2]
。它可以简化为:
point getNextToLast(list *p)
{
return p->values[p->size - 2];
}
<强>杂强>
您必须引入检查以确保您不会超出数组p->values
。否则,很容易遇到未定义的行为。