【问题标题】:How to add up int pointer values in a linked list in C++?如何在 C++ 中的链表中添加 int 指针值?
【发布时间】:2010-12-11 07:37:39
【问题描述】:

我一直在做这个家庭作业,但我不知道我做错了什么。我的程序应该如何工作:
用户输入任意数量的正数,
数字在一个链表中,
输入的数字应相加,
除以输入的数字数量,
导致平均,
但是,它并没有像我预期的那样工作,我已经玩了 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);
}

【问题讨论】:

  • 你应该更好地描述问题,而不是“它没有解决”。什么不起作用?你期望会发生什么,反而会发生什么?你哪里有问题?

标签: c++ list pointers linked-list


【解决方案1】:

现在,您正在将数据结构(链表)与您打算使用它的目的混合在一起。考虑将您的逻辑拆分为:

  • 您的 I/O 代码。
  • 链表实现。
  • 采用链表并计算平均值的函数。

【讨论】:

  • 现在,每当您添加一个节点时,您也会将该节点的值添加到总数中(在move_current_to_end 中,通过add_node 的代理)。相反,add_node 应该只将节点添加到列表中 - 实际的总/长度计算应该在所有内容都添加到列表后完成。请参阅乔纳森的回答以完成后一部分。
  • hm...虽然我不能在这个作业中使用 for 循环...我必须使用我所拥有的...编辑:没有意识到输入已提交,无论如何,我需要让事物在遍历时计算节点的总数和数量。
  • 不知道你说的递归是什么意思。
  • 一个使用终止基本情况调用自身以打破循环的函数。
  • 无论做什么,都不要使用递归。这是一个可怕的想法。
【解决方案2】:

你有很多其他的东西,你没有说你的代码是做什么的,但我会做这样的事情(未经测试):

 int count = 0;
 int total = 0;

 for (ptr = head_ptr; ptr != NULL; ptr = ptr->next)
 {
     total += ptr->number;
     count++;
 }

【讨论】:

  • 我忘了提到我需要“遍历”列表,以便合计输入的数字并计算列表中的节点数。因此,我的大难题...
  • 我不明白。我的代码确实遍历了列表,它确实计算了节点的数量,并且它还添加了总和 - ???
  • 但我不能使用 for 循环,我必须使用我所拥有的
  • 根据你的说法,你所拥有的东西是行不通的。所以我认为你需要以不同的方式编写它。您的版本过于复杂。不幸的是,您的描述也是如此。当我解决一个问题时,你会提出另一个问题。
  • 我只需要让它计算出使用这些函数的节点总数和#。
【解决方案3】:

我知道这对你的作业没有帮助,但这里有一个 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;
}

~

【讨论】:

    【解决方案4】:

    道歉:会附上评论来询问这个介绍性问题。但显然你需要比我目前更高的代表。

    @布兰登。我可以让你清楚地说明是这些功能吗:

    int get_number_data(int &number)

    void add_node(int &number)

    void move_current_to_end()

    void display_avg()

    只有这些你被允许使用? (我引用你的话:“我只需要让它计算出使用这些函数的节点总数和#”

    如果是这样。为什么?它们是你的讲师指定的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2015-12-02
      • 2022-06-18
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多