2011-11-23 3 views
0

링크 된 목록과 설정 기능이 있습니다.링크 된 목록의 노드 값 바꾸기

struct my_struct { 
    int value; 
    int type; 
    char *name; 
    struct my_struct *next; 
}; 

struct my_struct *setValue(struct my_struct *s, char *name, int b) { 
    if(s!=NULL) { 
     while(s != NULL) { 
      if(strcmp(s->name,name) == 0) { 
       s->value = b; 
      } 
      s=s->next; 
     } 
     return s; 
    } 
    return NULL; 
} 

여기에서 name은 검색 키워드이고 b는 s-> value의 새 값입니다. 왜 s -> value는 바꿀 수 없습니까? 그 기능을 수행 한 후에는 출력이 이상합니다. 나는 이해할 수 없다, 무슨 일이 있었는지.

+0

이 함수가 항상 NULL 인 포인터를 반환하는 이유는 무엇입니까? 무엇을 반환해야합니까? – wildplasser

답변

2

아래와 같이 문자열 동등성을 strcmp으로 테스트해야합니다. 귀하의 코드에서 두 포인터가 동일하면 테스트하고 있습니다 [related post].

#include <string.h> 

if(strcmp(s->name, name) == 0) { // if both strings are equal 
    s->value = b; 
} 

반환 명세서의 위치는 흥미 롭습니다. 원하지 않는 마지막 항목의 주소가 반환됩니다.

@Matthew 이슬린의 주석 사항에 따라

, 다음에 루프를 변경합니다 경우

while(s != NULL) { 
    ... 
} 

당신이 함수의 반환 값에 루트 노드를 설정하고, s은 항상 후 NULL 될 것입니다 연결된 목록을 반복하므로 함수는 항상 NULL을 반환합니다. 팀 같은

+0

감사합니다. Tim, 효과가 있습니다. 하지만 "s-> value = b"가 아닙니다. – miqbal

+0

strcmp에 대한 답에 따라 질문을 편집했습니다. 그러나 문제는 여전히 변할 수 없다. – miqbal

+0

p라는 이름의리스트에 네 개의 노드를 추가합니다. 그런 다음 setValue (struct my_struct * p, "name_here", new_value)를 호출합니다. 다시 목록을 표시합니다. 하지만 최근에는 목록에 추가되었습니다. 그리고 목록의 길이는 1입니다. – miqbal

1
  • 문자열 비교
  • 당신은 당신의 while 루프의 다음 상태를 비교 한 다음 현재 상태를 처리 설명했다. 나는. 새 값을 설정하기 전에 while 루프를 중단하기 때문에 목록에서 마지막 항목의 값을 변경할 수 없습니다.
+0

이해가 안 돼요. 두번째 것. – miqbal

+1

's-> next! = NULL'은's! = NULL'이어야합니다. 현재 루프는 마지막 노드를 제외한 각 노드를 통과합니다. –

+0

@Matt : 네, 맞아요. 그러나 여전히 s-> value는 바꿀 수 없습니다. – miqbal

0

이미 루프에 대한 도움을 얻었으므로 남은 부분을 시도해 보겠습니다.

s-> 이름과 이름 모두에 메모리가 올바르게 할당 되었습니까? 둘 다 길이가 같고 널 (null)로 끝나야합니다. strcmp() 기능은 모든 응답에 대해 equal 응답과 할당 된 메모리 및 널 종료를 제공하는 모든 사실을 의미합니다.

재미있는 결과가 있다면 어딘가에 메모리 누수가있을 것입니다. 최대 문자 수를 가진 strncmp을 시도해보고 비교하고 무슨 일이 일어나는지보십시오.