【问题标题】:Changing an int value in struct which is in linked list更改链表中结构中的 int 值
【发布时间】:2016-10-22 05:29:47
【问题描述】:

我有一个结构:

struct person{
     char* name;
     char* surname;
     int age;
};

我在另一个链表结构中使用这个结构:

struct listNode {
     struct person data;
     struct listNode *nextPtr;
};

typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;

我正在尝试将一个结构插入到链接列表中。之后,我想通过索引获取这个结构并更改年龄值。主要是,我有这些代码:

int main() {

    ListNodePtr startPtr = NULL;

    struct person p;

    p.age = 22;
    p.surname = "Pilkington";
    p.name = "Anthony";

    insert(&startPtr, p);
    printf("Age1:%d\n", p.age);

    struct person p2 = getStruct(&startPtr, 0);
    p2.age++;
    printf("Age2:%d\n", p2.age);

    struct person p3 = getStruct(&startPtr, 0);
    printf("Age3:%d\n", p3.age);

    return 0;
}

现在,我的 insert 函数和 getStruct 函数可以正常工作了。但我不能增加年龄值。我的输出是:

Age1:22
Age2:23
Age3:22

我想让Age3 23。在insert函数中,我已经用malloc分配了内存,但是为什么我不能改变第一个值?如何在不从列表中删除/添加节点的情况下更改此值?

我搜索主题,但找不到我想要的答案。所以,如果你能帮助我,我很感激。

---编辑----- 抱歉没有发布 getStruct 方法,我在下面添加它:

struct person getStruct(ListNodePtr *sPtr, int index) {
    ListNodePtr currentPtr;
    struct person c;

    int counter = 0;

    currentPtr = *sPtr;

    while (currentPtr != NULL) {
        if (counter == index) {
            c = currentPtr->data;
        }
        counter++;
        currentPtr = currentPtr->nextPtr;
    }

    return c;
}

【问题讨论】:

    标签: c struct linked-list


    【解决方案1】:

    这里:

    struct person p2 = getStruct(&startPtr, 0);
    

    你返回一个person按值,也就是说你做了一个副本。然后你修改副本,而不是原件。您需要这样做:

    struct person *p2 = getStruct(&startPtr, 0);
    p2->age++;
    printf("Age2:%d\n", p2->age);
    

    即返回一个指针,您可以使用它来修改它所指向的内容。这也需要对getStruct() 稍作更改,您尚未发布其代码。

    【讨论】:

    • 很好,确切地说,操作需要从getStruct 函数返回相关结构的地址..
    • 我添加了这个功能。感谢您的明确回答,所以我认为getStruct 函数应该返回struct person*
    • @pilkington:是的,那么你可以简单地return &currentPtr->data
    • 它可以在 getStruct 中更改一些细节。再次感谢@JohnZwinck
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 2010-09-08
    • 2021-05-11
    • 1970-01-01
    • 2021-03-05
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多