2016-10-22 1 views
0

나는 구조체가 :링크 된 목록에있는 구조체에 int 값을 변경

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; 
} 

이제 삽입 기능과 getStruct 기능이 올바르게 작동합니다. 하지만 나이 값을 늘릴 수는 없습니다. 내 출력은 다음과 같습니다

Age1:22 
Age2:23 
Age3:22 

내가 삽입 기능에서 Age3 (23)을 만들고 싶어, 내가 처음 값을 변경할 수없는 이유를 나는 이미의 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; 
} 

답변

2

:

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

당신은 person값으로 반환, 즉 복사본을 만듭니다. 그런 다음 원본이 아닌 복사본을 수정합니다. 대신 다음을 수행해야합니다.

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

즉 포인터가 무엇인지 가리키는 포인터를 반환합니다. 또한 코드를 게시하지 않은 getStruct()으로 약간의 변경이 필요합니다.

+0

정확하게 말하면, op 구조체의 주소를'getStruct' 함수에서 반환해야합니다. – sjsam

+0

함수를 추가했습니다. 명확한 대답을 주셔서 감사합니다, 그래서'getStruct' 함수는'struct person *'을 리턴해야한다고 생각합니다. – pilkington

+0

@ pilkington : 그렇습니다. 간단히'return & currentPtr-> data'를 사용할 수 있습니다. –

관련 문제