2017-03-22 2 views
0

最小値を含むノードと最大値を含むノードとの距離を求めようとしています。私はそれが線形二重連鎖リストであることを言及します。私が書いたコードは私の問題を解決するものではなく、私は他のロジックも見つけられません。リニアダブルチェーンリスト(C++)で2つのノード間の距離を求める

はここのコードです:

#include<iostream> 
#include<stdio.h> 


struct Nod { 
    int info; 
    Nod* next; 
    Nod* prev; 
}; 


Nod* createNode(int nr) { 
    Nod* nod = new Nod; 
    nod->info = nr; 
    nod->next = NULL; 
    nod->prev = NULL; 

    return nod; 
} 


bool checkDuplicates(Nod* lst, int nr) { 
    Nod* tmp = lst; 
    while (tmp != NULL) { 
     if (tmp->info == nr) { 
      return true; 
     } 
     tmp = tmp->next; 
    } 
    return false; 
} 

void insertNode(Nod*& lst, Nod* nou) { //at the beginning 
    if (lst == NULL) { 
     lst = nou; 
    } 
    else { 
     if (checkDuplicates(lst, nou->info) == false) { 
      nou->next = lst; 
      lst->prev = nou; 
      lst = nou; 
     } 
     else { 
      printf("Valoarea (%d) exista deja! \n", nou->info); 
     } 

    } 
} 

void printList(Nod* lst) { 
    Nod* tmp = lst; 
    if (tmp) { 
     while (tmp != NULL) { 
      printf("%d \n", tmp->info); 
      tmp = tmp->next; 
     } 
    } 
} 

void distance(Nod* lst) { 
    if (lst) { 
     /*Finding min and max*/ 
     Nod* tmp = lst; 

     int min = tmp->info; 
     int max = tmp->info; 

     int poz_min = 1; 
     int poz_max = 1; 

     while (tmp != NULL) { 
      if (tmp->info < min) { 
       min = tmp->info; 
       poz_min++; 
      } 
      if (tmp->info > max) { 
       max = tmp->info; 
       poz_max++; 
      } 
      else { 
       tmp = tmp->next; 
      } 

     } 

     int dist = poz_max-poz_min; 

     if (dist<0) { 
      dist = dist*(-1); 
     } 

     printf("\n Min: %d [poz: %d] , Max: %d [poz: %d], Distance: %d. \n ", min, poz_min, max, poz_max, dist); 
    } 
    else { 
     printf("Null list.\n"); 
    } 
} 

void main() { 
    Nod* lst = nullptr; 
    Nod* nou = createNode(5); 
    insertNode(lst, nou); 

    nou = createNode(2); 
    insertNode(lst, nou); 

    nou = createNode(1); 
    insertNode(lst, nou); 

    nou = createNode(7); 
    insertNode(lst, nou); 

    printList(lst); 

    distance(lst); 

} 
+0

*私が書いたコードでは問題が解決しない* - OK、デバッガを使用して、コードがロジック/プランと違反している場所を見つけましたか? - *他のロジックは見つからない* - プログラマがそのことを言ったら、彼らは仕事から解雇されるだろう。あなたはコードを書いて、コードがあなたのプランと違うところを見つけ、プランを調整します。 – PaulMcKenzie

+0

@PaulMcKenzieこんにちは!返信ありがとうございます!はい、私はデバッガを使用しましたが、それは私を助けませんでした。だからこそ私はここにいくつかの提案をした。 – Alin

+2

デバッガの仕事は、あなたのプログラムがやっていること、変数の価値などを段階的にあなたに示すことです。あなたが解決しようとしている問題、つまりそれを決定することはわかりません。変数に期待していなかった値がある場合、またはプログラムが期待したものと異なるパスをとる場合は、バグがあることがわかります。 – PaulMcKenzie

答えて

0

完了!再度、感謝します!

int dist_min(Nod* lst, int min) { 
    int i = 1; 
    while (lst != NULL) { 
     if (lst->info == min) { 
      return i; 
     } 
     else { 
      i++; 
     } 
     lst = lst->next; 
    } 
} 

int dist_max(Nod* lst, int max) { 
    int i = 1; 
    while (lst != NULL) { 
     if (lst->info == max) { 
      return i; 
     } 
     else { 
      i++; 
     } 
     lst = lst->next; 
    } 
} 

void distance(Nod* lst) { 
    if (lst) { 
     /*Finding min and max*/ 
     Nod* tmp = lst; 
     Nod* tmp1 = lst; 
     int min = lst->info; 
     int max = lst->info; 

     while (tmp != NULL) { 
      if (tmp->info < min) { 
       min = tmp->info; 
      } 
      if (tmp->info > max) { 
       max = tmp->info; 
      } 

      tmp = tmp->next; 
     } 

     /*Finding positions*/ 
     int poz_min = dist_min(lst,min); 
     int poz_max = dist_max(lst,max); 


     int dist = poz_min - poz_max; 

     if (dist < 0) { 
      dist = dist * (-1); 
     } 

     printf("\n Min: %d [poz: %d] , Max: %d [poz: %d], Distance: %d. \n ", min, poz_min, max, poz_max, dist); 



    } 
    else { 
     printf("Null list.\n"); 
    } 
} 
0

最初のリストの先頭に分の距離を見つけることによって、問題を分割して、スタートに最大の距離を見つけることが容易になるだろう。距離は両方の距離の絶対差です。

開始点までの距離を調べるには、最小値または最大値を探し、カウンタが見つかるまでインクリメントするだけです。

+0

ありがとう@stefaanv!私はそれを解決しました! – Alin

関連する問題