C:使用列表的数组的最后一个元素
C: Last element of an array using a list
我使用这些函数从一组有序对中创建凸边界。如果有人熟悉 Graham 的扫描,那么我相信它将有助于理解这些函数的性质。无论如何,每个功能的用途都有描述。
我认为 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
函数会删除列表末尾的项目,此外,return 也会删除它。否则你可以简单地将它实现为
void popBack(list *p) {
if (p->size == 0)
return;
p->size--;
}
如果您想 return 一个值,那么:
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];
获取列表的最后一个元素,并在最后一个元素之后分配 元素的值,这出于各种原因是有问题的。
popBack
有问题
您只需要减少列表的大小。您的功能根本没有任何意义。函数中你只需要:
void popBack(list *p)
{
p->size--;
}
顺便说一句,通常 return 弹出的项目。您应该将函数更改为:
point popBack(list *p)
{
p->size--;
return p->values[p->size];
}
getLast
有问题
您 return 买错了商品。如果 size
等于 1,则需要 return 列表中的第一项 - 即 p->values[0]
而不是 p->values[1]
函数可以简化为:
point getLast(list *p)
{
return p->values[p->size-1];
}
getNextToLast
有问题
更改为 getLast
后,此功能需要 return p->values[p->size-2]
。可以简化为:
point getNextToLast(list *p)
{
return p->values[p->size - 2];
}
其他
您必须引入检查以确保您不会越界访问数组 p->values
。否则,很容易运行进入未定义的行为。
我使用这些函数从一组有序对中创建凸边界。如果有人熟悉 Graham 的扫描,那么我相信它将有助于理解这些函数的性质。无论如何,每个功能的用途都有描述。
我认为 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
函数会删除列表末尾的项目,此外,return 也会删除它。否则你可以简单地将它实现为
void popBack(list *p) {
if (p->size == 0)
return;
p->size--;
}
如果您想 return 一个值,那么:
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];
获取列表的最后一个元素,并在最后一个元素之后分配 元素的值,这出于各种原因是有问题的。
popBack
您只需要减少列表的大小。您的功能根本没有任何意义。函数中你只需要:
void popBack(list *p)
{
p->size--;
}
顺便说一句,通常 return 弹出的项目。您应该将函数更改为:
point popBack(list *p)
{
p->size--;
return p->values[p->size];
}
getLast
您 return 买错了商品。如果 size
等于 1,则需要 return 列表中的第一项 - 即 p->values[0]
而不是 p->values[1]
函数可以简化为:
point getLast(list *p)
{
return p->values[p->size-1];
}
getNextToLast
更改为 getLast
后,此功能需要 return p->values[p->size-2]
。可以简化为:
point getNextToLast(list *p)
{
return p->values[p->size - 2];
}
其他
您必须引入检查以确保您不会越界访问数组 p->values
。否则,很容易运行进入未定义的行为。