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。否则,很容易运行进入未定义的行为。