C:使用列表的数组的最后一个元素

时间:2015-02-25 03:32:41

标签: c arrays list struct

我使用这些函数从一组有序对中创建凸边界。如果有人熟悉格雷厄姆扫描,那么我相信它将有助于理解这些功能的本质。无论如何,都有描述每个功能的用途。

我不认为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;
}

2 个答案:

答案 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。否则,很容易遇到未定义的行为。