Как добавить значения указателя int в связанный список в C ++? - PullRequest
1 голос
/ 11 декабря 2010

Я какое-то время работал над этим домашним заданием и не могу понять, что я делаю неправильно.Как должна работать моя программа:
Пользователь вводит столько положительных чисел, сколько пожелает,
Числа находятся в связанном списке,
Введенные числа должны быть суммированы,
Разделите на суммувведенные числа,
В результате получается среднее значение,
Однако, это не сработало, как я планировал, и я играю с этим уже более 3 часов.Я бы связался с моей учительницей, но она еще не ответила на мое последнее сообщение, и мне сразу нужна помощь.Заранее спасибо.

Примечание: мне нужно просмотреть список, чтобы сложить все введенные числа и подсчитать количество узлов.

#include <iostream>
using namespace std;

int num, total, num_entries = 1;

struct number_node
{
 int number;
 number_node *next;
};

number_node *head_ptr;
number_node *current_ptr;

int get_number_data(int &number);
void add_node(int &number);
void move_current_to_end();
void display_avg();
void delete_list();

int main()
{
 if(get_number_data(num))
 {
  head_ptr = new number_node;
  head_ptr->number = num;
  head_ptr->next = NULL;

  while(get_number_data(num))
  {
   add_node(num);
  }
  display_avg();
  delete_list();
 }

 system("pause");
 return 0;
}

int get_number_data(int &number)
{
 int keep_data = 1;

 cout << "Enter a positive number (Enter a negative number to stop): ";
 cin >> num;
 if(num < 0)
 {
  keep_data = 0;
 }

 return(keep_data);
}

void add_node(int &number)
{
 number_node *new_rec_ptr;

 new_rec_ptr = new number_node;

 new_rec_ptr->number = num;
 new_rec_ptr->next = NULL;

 move_current_to_end();
 current_ptr->next = new_rec_ptr;
}

void move_current_to_end()
{
 current_ptr = head_ptr;
 num_entries++;

 while(current_ptr->next != NULL)
 {
  current_ptr = current_ptr->next;
  total = current_ptr->number + total;
 }
}

void display_avg()
{
 current_ptr = head_ptr;
 cout << "Average = " << total / num_entries << endl;
}

void delete_list()
{
 number_node *temp_ptr;

 current_ptr = head_ptr;

 do
 {
  temp_ptr = current_ptr->next;

  delete current_ptr;

  current_ptr = temp_ptr;
 }
 while(temp_ptr != NULL);
}

Ответы [ 4 ]

3 голосов
/ 11 декабря 2010

Прямо сейчас вы смешиваете свою структуру данных (связанный список) с тем, для чего вы собираетесь ее использовать.Попробуйте разбить свою логику на:

  • Ваш код ввода-вывода.
  • Реализация связанного списка.
  • Функция, которая берет связанный список и вычисляет среднее.
0 голосов
/ 12 декабря 2010

Извинения: приложил бы комментарий, чтобы задать этот вводный вопрос.Но, очевидно, вам нужен более высокий уровень повторения, чем у меня сейчас.

@ Брэндон.Могу ли я заставить вас четко заявить, что это следующие функции:

int get_number_data (int & number)

void add_node (int & number)

void move_current_to_end ()

void display_avg ()

и только те, которые вам разрешено использовать?(И я процитирую вам: «Мне просто нужно, чтобы он вычислил общее количество и число узлов, использующих эти функции»

Если так. Почему? Они были указаны вашим лектором?

0 голосов
/ 11 декабря 2010

Я знаю, что это не поможет вам с домашней работой, но вот программа на C ++ STL, которая удовлетворяет вашим требованиям:

  • Столько входных данных, сколько пользователь желает
  • Числахранятся в связанном списке
  • Числа складываются
  • Вычисляет и отображает среднее значение

Удачи в вашем классе.

#include <list>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <numeric>

int main()
{
  std::list<double> l;

  std::copy(std::istream_iterator<double>(std::cin),
    std::istream_iterator<double>(),
    std::insert_iterator<std::list<double> >(l, l.begin()));

  size_t size = l.size();
  if(size)
    std::cout << std::accumulate(l.begin(), l.end(), 0.0) / l.size()
      << std::endl;
}

~

0 голосов
/ 11 декабря 2010

У вас есть много других вещей, и вы не сказали, что делает ваш код, но я бы сделал что-то вроде этого (не проверено):

 int count = 0;
 int total = 0;

 for (ptr = head_ptr; ptr != NULL; ptr = ptr->next)
 {
     total += ptr->number;
     count++;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...