2016-11-13 2 views
-1
struct link_node 
{ 
    char node_str[ MAX_STR_LEN ]; 
    struct link_node *next; 
}; 

int compare_node(struct link_node *n1, struct link_node *n2) 
{ 
    if(n1[0] < n2[0]) 
    { 
     return -1; 
    } 
    else if(n1[0] == n2[0]) 
    { 
     return 0; 
    } 
    else 
    { 
     return 1; 
    } 
} 

이것은 현재 연결된 목록에서 노드의 첫 글자를 비교하는 코드입니다. 프로그램이 실행되고 있지 않으므로 코드의 오류가 어디에 있는지 확인하고 싶습니다. 코드가 괜찮아 보이나요? 오류는 코드의 다른 위치에있을 수 있습니다.링크 된 목록의 노드 비교 c

+0

링크 된 목록의 구조를 표시해야합니다. – karliwson

+0

구조체 link_node { char node_str [MAX_STR_LEN]; struct link_node * next; }; –

+0

@Tim Eilers "노드의 첫 글자"란 무엇입니까? :) 노드의 첫 글자는 "n"입니다. :) –

답변

0

아니요. 올바르지 않습니다.

이제 막 2 struct link_node 개 개체를 비교하려고합니다. C는 연산자 오버로딩을 수행하지 않으므로 의미가 없습니다. 객체 내부의 실제 데이터를 비교해야합니다. 예 :

// Note: probably better to use n1-> instead of n1[0]. 
// node_str[0] *is* correct usage of `[]` though. 
if(n1[0].node_str[0]< n2[0].node_str[0]) 
{ 
    return -1; 
} 

모든 것은

int compare_node(struct link_node *n1, struct link_node *n2) 
{ 
    return n1->node_str[0] - n2->node_str[0]; 
} 

유일한 차이점은 지금은 그냥 단지 +는했습니다, - 제가 1과 -1 수익을 얻을 수 없다는 것입니다 또는 0

로 단순화 될 수있다 당신이 link_nodes의 배열로 전달하는 경우이 (다른 대답 대신 []->을 사용하는 것을

참고. 당신은 [] 표기법을 사용할 수 있지만, 아마이 경우 가능성이 없습니다.

1

structnode_str 요소에 액세스해야합니다. 구조체에 대한 포인터를 함수에 전달하면 -> 표기법을 사용하여 구조체 요소에 액세스 할 수 있습니다.

int compare_node(struct link_node *n1, struct link_node *n2) 
{ 
    if (n1->node_str[0] < n2->node_str[0]) 
     return -1; 
    // etc... 
} 

보통 비교 함수는 단순히 첫 번째 항목이 두 번째 항목보다 작은 경우, 항목이 항목 하나가 큰 경우에는 "0보다 큰"같거나하는 경우 "적게 0이 아닌", "0"을 반환해야 항목 2보다. 이 경우 비교 함수를 다음과 같이 줄일 수 있습니다.

int compare_node(struct link_node *n1, struct link_node *n2) 
{ 
    return n1->node_str[0] - n2->node_str[0]; 
} 

이렇게하면 각 문자열의 첫 문자에 대한 비교가 수행됩니다. 전체 문자열을 비교하려는 경우 strcmp() :

int compare_node(struct link_node *n1, struct link_node *n2) 
{ 
    return strcmp(n1->node_str, n2->node_str); 
}