我有一个结构:
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:%dn", p.age);
struct person p2 = getStruct(&startPtr, 0);
p2.age++;
printf("Age2:%dn", p2.age);
struct person p3 = getStruct(&startPtr, 0);
printf("Age3:%dn", p3.age);
return 0;
}
现在,我的insert函数和getStruct函数工作正常。但我不能增加年龄值。我的输出是:
Age1:22
Age2:23
Age3:22
我想做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;
}
此处:
struct person p2 = getStruct(&startPtr, 0);
您通过值返回一个person
,也就是说您制作了一个副本。然后修改副本,而不是原始副本。你需要这样做:
struct person *p2 = getStruct(&startPtr, 0);
p2->age++;
printf("Age2:%dn", p2->age);
也就是说,返回一个指针,您可以用它来修改它指向的内容。这还需要对getStruct()
进行轻微更改,您尚未发布其代码。