2012-03-21 3 views
0

두 개의 연결된 목록이 있습니다.C : 링크 된 목록의 검색 기능

typedef struct node 
{ 
    char value[256]; 
    struct node *next; 
} Node_t; 

    typedef struct node1 
    { 
     char value1[256]; 
     int count; 
     struct node1 *next; 
    } Node1_t; 

모두 연결리스트 데이터를 가지고, 내가 어떤 데이터가 공통적으로 두 개의 연결리스트간에 데이터를 비교하려는 두 개의 연결리스트와 유사한 데이터를 찾을 수있는 방법은 무엇입니까?

감사합니다.

+0

가장 확실한 방법은 첫 번째 목록의 각 요소를 탐색하고 두 번째 목록의 각 요소와 비교하는 것입니다. – Aziz

+0

@Aziz : 제발 주실 수 있습니까? – Nimit

+0

http://www.c.happycodings.com/Data_Structures/code27.html –

답변

3

두 목록이 정렬되면, 다음과 같은 알고리즘 (의사 코드, 실행의 복잡성 O(n+m))를 사용할 수 있습니다 : 목록 중 하나가 정렬되지 않은 경우

INPUT: list1, list2 (first nodes of the lists you want to compare, sorted!) 

while list1 != null AND list2 != null 
    if list1->value < list2->value 
     list1->value = list1->next 

    elseif 
     list2->value < list1->value 
      list2->value = list2->next 

    else 
     list3->appendValue(list1->value) 
     list1->next 

, 각 요소를 비교해야 두 번째 목록의 각 요소 (런타임 복잡성 O(n*m))와 첫 번째 목록에서 :

INPUT: list1, list2 (first nodes of the lists you want to compare) 

while list1 != null 
    list2temp = list2 

    while list2temp != null 
     if list1->value == list2temp->value 
      list3->appendValue(list1->value) 
     list2temp = list2temp->next 
    list1 = list1->next 

그것은 먼저 목록을 정렬 할 종종 더 나은 다음 첫 번째 방법을 사용,이 O(n log n + m log m)의 런타임 복잡성이 발생합니다. 두 경우 모두 list3에는 두 목록의 공통 요소가 포함됩니다.

+4

(또는 목록을 정렬하고 첫 번째 방법을 사용할 수 있습니다. 복잡성 낮춤) – blueshift

+0

@blueshift : OP가 복잡성에 관심이없는 것 같지만 답변에 사용자 의견을 추가했습니다. 그것을 지적 주셔서 감사합니다. – Zeta

+0

@ Zeta : 답장을 보내 주셔서 감사합니다. 제 2 의사 코드를 사용하고 있습니다 만, list1-> value == list2temp-> value를 확인할 때 "불완전한 유형의 포인터를 역 참조"하는 오류가 발생하면이 블록을 C 프로그램? – Nimit

2
list = head; 
while (list) { 
    list1 = head1; 
    while (list1) { 
    if (yourcompare(list->value, list1->value) == 0) { 
     // do something with common data 
     // if only possible case: then break; 
    } 
    list1 = list1->next; 
    } 
    list = list->next; 
} 

list1의 일치하는 값이 다시 일치하지 않으면 '짧은 업데이트'와 같은 부기 데이터를 추가 할 수 있습니다. 그래서 당신은 'if (! list1-> updated) {...; list1-> updated = TRUE;} '내부에있는 동안.

+0

+1, 내 실수를 지적했다. – ApprenticeHacker

+0

당신의 짝퉁은 무엇입니까 ?? – Nimit

+0

yourcompare()는 두 데이터가 동일한 지 비교하기 위해 작성해야하는 비교 함수의 동의어입니다. value1 value2이면 equal to 및 -1 또는 -1에 대해 0을 반환합니다. 이것은 strcmp() 일 수 있지만 'I'와 'Ay'와 같은 음성 학적으로 동일한 자체 작성 soundex() - 함수 일 수도 있습니다. –