我有一个结构:
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.在插入函数中,我已经使用malloc分配内存,但为什么我不能更改第一个值?如何在不从列表中删除/添加节点的情况下更改此值?
我搜索主题,但找不到我想要的答案。所以,如果你能帮助我,我会很感激。
--- ----- EDIT 很抱歉没有发布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;
}
答案 0 :(得分:2)
下面:
struct person p2 = getStruct(&startPtr, 0);
您按价值返回person
,也就是说您复制了一份。然后修改副本,而不是原始副本。你需要这样做:
struct person *p2 = getStruct(&startPtr, 0);
p2->age++;
printf("Age2:%d\n", p2->age);
也就是说,返回一个指针,您可以使用它来修改它指向的内容。这也需要对getStruct()
进行轻微更改,而您的代码尚未发布。