2011-04-30 2 views
0

다음은 연결된 목록에서 검색하는 코드입니다. 그러나 올바른 결과를 제공하지 않습니다. 제발 도와주세요. 나는 그 일에 대해 매우 걱정하고 있습니다.연결된 목록에서 검색

search() { 

    char ser[20]; 
    cout << "enter data to be searched" << endl; 
    gets(ser); 

    for (start=head; start->ptr!=NULL; start=start->ptr) { 
    if (start->info == ser) { 
     cout << "ok" << endl; 
     break; 
    } 
    } 
    cout << "not found" << endl; 
} 

감사합니다, Saima Kanwal Bhutta

답변

1

당신이 무엇을 기대합니까?

if (start->info == ser) { 

이 점 start->info 경우 ser 어레이의 시작을 확인한다. 문자열을 비교하려면 strcmp을 사용하는 것이 좋습니다.

0

2 개의 문자열을 비교하려면 strcmp()를 사용하십시오. "=="를 사용하면 문자열의 내용이 아닌 2 개의 포인터를 비교합니다.

0

귀하의 경우 문자열 시작 주소 대신 문자열의 내용을 비교해야합니다.

올바른 버전 : 더

void search() { 

    char ser[20]; 
    cout << "enter data to be searched" << endl; 
    gets(ser); 

    for (start=head; start->ptr!=NULL; start=start->ptr) 
    { 
    if (strcmp(start->info, ser) == 0) 
    { 
     cout << "found" << endl; 
     return; 
    } 
    } 
    cout << "not found" << endl; 
} 

비트 당신은 for 루프 전에 head 먼저 확인해야 할

언급. 그렇지 않으면 head이 NULL 인 경우 프로그램이 중단됩니다.

+0

gets()가 올바른 것으로 말하기는 어렵습니다. –

0

루프 상태는 위험합니다. 'start'자체가 NULL인지 아닌지 확인하지 않습니다. 또한, 다음 요소를 사용할 수 있는지 여부를 비교하고 있으므로 다음 요소를 사용할 수없는 경우 현재 요소를 잃어 버리게됩니다. 문자열 비교도 잘못되었습니다. 포럼에

for (start=head; start != NULL; start=start->ptr) { 
     if (strcmp(start->info, ser) == 0) { 
      cout << "ok" << endl; 
      break; 
     } 
     } 
1

Saima, 첫째

, 오신 것을 환영합니다, 또한 컴퓨터 프로그래밍의 멋진 좌절, 유익한 세계를 환영합니다 : 다음과 같은 루프를 업데이트합니다.

두 번째로 내 게시물을 편집했습니다. edit 버튼을 클릭하면 소스 코드를 레이아웃하는 방법을 볼 수 있으므로 포럼에서 멋지게 표시합니다.

셋째, ...이라고 말한 return을 의미하는 것 같아서 "찾을 수 없음"메시지가 항상 표시되지 않습니다. 그게 니가 원하는거야?

넷째, 목록 검색 부분에서 사용자 입력 부분을 분리하는 것이 좋습니다 ... 쉽게 수행 할 수 있으며 링크 된 목록 검색을 모든 문자열 (어느 곳에서나 사용할 수 있음)로 사용할 수 있습니다. 사용자가 지금 입력하십시오. 마찬가지로 검색 결과를 분리하여 나중에 검색을 다시 사용하여 상황에 맞는 출력을 생성 할 수 있습니다.

마지막으로, 변수 이름 (나를 용서하십시오)을 빨아 라! 이 같은

그래서 ... 내 ANSI-C 버전이 보일 것이다 무언가 :

int contains(char* target) { 
    for (Node node=head; node->next!=NULL; node=node->next) { 
    if (strcmp(node->data, target)==0) { 
     return 0; // TRUE 
    } 
    } 
    return 1; // FALSE 
} 

위의 코드를 만드는 데 도움이 연결리스트의 부분에 대해 "매우 표준"이름은 많이 더 읽기 쉽고 유지 보수가 용이합니다. 또한 WTF는 "ser"입니다 ... "target"은 어떻습니까?

머리가 다 이상하다면 걱정하지 마세요. 지금은이 조언을 무시하십시오.

건배. 키이스.

+1

왜 사실을 0, 거짓을 1로 사용하고 있습니까? –

0

버퍼의 길이를 지정할 방법이 없으므로 위험합니다. char 배열과 함께 사용할 대안이 있지만 여기에서는 std :: string을 사용하는 것이 더 쉽습니다. find 함수를 별도의 함수로 추출했습니다. 이렇게하면 검색 할 값을 얻는 방법이나 원하는 결과에 관계없이 동일한 기능을 사용하여 목록을 검색 할 수 있습니다.

Node* find(Node* head, const string& needle) { 
    for (; head; head = head->ptr) { 
     if (head->info == needle) { 
      return head; 
     } 
    } 
    return 0; 
} 

void search(Node* head) { 
    string needle; 
    cout << "Data to be searched: "; 
    if (!getline(cin, needle)) { 
     // Do something appropriate, such as throw an exception, return 
     // an error code (if you change the function's interface), or 
     // simply exit. 
     abort(); 
    } 

    Node* found = find(head, needle); 
    if (found) { 
     cout << "Found.\n"; 
    } 
    else { 
     cout << "Not found.\n"; 
    } 
} 
관련 문제