2016-03-07 4 views
1

Я пытаюсь сделать fn вызванной частотой, которая возвращает частоту данного целого в связанном списке. до сих пор:Частота в связанных списках

int IntSLList::frequency(int e) 
    { 

      int total = 0; 
      IntSLLNode *temp; 
      for (temp = head; temp!=0 && !(temp-> info ==e) ; temp = temp->next) 
      { 
       total++; 
      } 
      return total; 

но число, которое он возвращает (должен вернуть 1), но возвращает 8 мой связанный список имеет 10 элементов (0-9

+0

Try двигая условие для увеличения ' total' * внутри * цикл 'for' (' while' может иметь больше смысла) и держать цикл 'for' строго проверенным для конца списка. – crashmstr

+1

Для этого количества кода и этого размера списка вы должны легко пройти через код по строкам и посмотреть, что происходит, когда значения меняются, и когда цикл 'for' завершается. – crashmstr

ответ

1

Проверка на равной е должно быть сделано в тело для цикла

int IntSLList::frequency(int e) 
{ 
    int total = 0; 
    IntSLLNode *temp; 
    for (temp = head; temp!=0 ; temp = temp->next) 
    { 
     if(temp->info == e) 
      total++; 
    } 
    return total; 
} 
+0

Использовать 'nullptr' вместо 0 при проверке null. – Donnie

+2

Собственно, просто '...; темп; ... '(нет необходимости сравнивать ни с чем, а также' temp' не нужно находиться вне цикла здесь), но 'while (temp)' имеет больше смысла, чем цикл 'for'. – crashmstr

+0

благодарит человека, который помог. –

1

Это условие:. temp!=0 && !(temp-> info ==e) заставляет вас считать до первого из 2-х вещей:

  1. Конец списка.
  2. Первый раз, когда вы достигаете e.

Это не ваше поведение, поэтому вам необходимо отрегулировать состояние. Что мы хотим?

  1. Мы идем от начала списка до конца, независимо от количества, поэтому наш цикл для петли выглядит так: for(IntSLLNode *temp = head; temp; temp = temp->next).
  2. На каждом элементе мы хотим проверить, если у нас есть число, равное e:

if (temp->info == e) { 
    total++; 
} 

Это дает нам окончательный цикл:

int IntSLList::frequency(int e) { 
    int total = 0; 
    for (IntSLLNode *temp = head; temp; temp = temp->next) { 
     if(temp->info == e) { 
      total++; 
     } 
    } 
    return total; 
}