2013-07-02 2 views
1

두 개의 정렬 된 문자열 배열이 주어지면 결과 교차가되는 배열을 찾으십시오.두 개의 순차 목록을 교차하십시오.

현재이 알고리즘이 있지만 작동하지 않습니다.

참고 : 배열 a와 b가 숫자를 문자열로 포함하기 때문에 atol()이 유효합니다.

char** matchLists(char **a, char **b, int sizeA, int sizeB, int *lSize) 
{ 
    char **list = malloc(sizeof(char *)); 
    int pA = 0, pB = 0, listSize = 0; 

    while(pA < sizeA && pB < sizeB) 
    { 

     if(atol(a[pA]) < atol(b[pB])) 
     { 

      pA++; 

     } 
     else if(atol(a[pA]) > atol(b[pB])) 
     { 

      pB++; 

     } 
     else 
     { 

      list = realloc(list, sizeof(char *) * (++listSize)); 
      list[listSize-1] = b[pB]; 
      pA++; 
      pB++; 

     } 


    } 

    *lSize = listSize; 

    return list; 

} 
+2

"하지만 아니에요 작동 "- 오류를 설명하십시오. –

+0

"작동하지 않습니다. "라는 말은 알고리즘이 수행해야하는 작업을 수행하지 못했음을 의미합니다. – rafaame

+0

리스트에 요소를 추가하기 직전에 매번'realloc '하기 때문에 처음'malloc'은 필요하지 않습니다. 단순히 NULL로 초기화 할 수 있습니다. – Blastfurnace

답변

0

문제가 .. 당신이 문자열을 저장하는 char**을 사용하고 있는지, 이것은 배열 포인터 사이에 혼동이 될 수 있으며 패스에 의해 포인터 문제도 listSize 0 1 안 시작

그래서 함수는 다음과 같이해야합니다 ..

// only lSize here is pass-by-pointer 
char* matchLists(char *a, char *b, int sizeA, int sizeB, int * lSize) 
{ 
    char * list = (char*) malloc(sizeof(char)); 
    int pA = 0, pB = 0, listSize = 1; 

    while(pA < sizeA && pB < sizeB) 
    { 
     if(atol(a[pA]) < atol(b[pB])) 
     { 
      pA++; 
     } 
     else if(atol(a[pA]) > atol(b[pB])) 
     { 
      pB++; 
     } 
     else 
     { 
      list = (char*) realloc(list, sizeof(char)*(++listSize)); 
      list[listSize-1] = b[pB]; 
      pA++; 
      pB++; 
     } 
    } 

    *lSize = listSize; 
    return list; 
} 

전화는 :

char a[256] = "This is not a test."; 
char b[256] = "This is a test."; 

int sizeA = 256; 
int sizeB = 256; 
int lSize = 1; 

char* match = matchLists(a, b, sizeA, sizeB, &lSize); 

printf("%s \n", match);