2010-12-11 56 views
1

J'ai travaillé à ce devoir de devoir pendant un certain temps et je ne peux pas comprendre ce que je fais mal. Comment mon programme est censé travailler:
L'utilisateur entre autant de nombres positifs comme ils le souhaitent,
Les chiffres sont dans une liste chaînée,
Les chiffres entrés doivent être additionnés,
diviser par le nombre de numéros est entré,
Il en résulte une moyenne,
Cependant, cela ne fonctionne pas comme je l'avais prévu et je joue avec cela depuis plus de 3 heures maintenant. Je contacterais mon professeur mais elle n'a pas encore répondu à mon dernier message et j'ai besoin d'aide tout de suite. Merci d'avance.Comment ajouter des valeurs de pointeur int dans une liste chaînée en C++?

Remarque: J'ai besoin de parcourir la liste pour additionner tous les nombres saisis et compter le nombre de nœuds.

#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); 
} 
+0

devrait vous donner un.? Une meilleure description des problèmes que «ça ne marche pas» Ce qui ne fonctionne pas Qu'est-ce que vous attendez et ce qui se passe à la place? Où avez-vous des problèmes? – sth

Répondre

3

En ce moment, vous mixez votre structure de données (liste chaînée) avec ce que vous avez l'intention de l'utiliser pour. Envisagez de diviser votre logique en:

  • Votre code d'E/S.
  • Implémentation de la liste chaînée.
  • Fonction qui prend une liste liée et calcule la moyenne.
+0

Je ne sais pas très bien ce que vous voulez dire en divisant la logique ... – Brandon

+0

Maintenant, quand vous ajoutez un noeud, vous ajoutez également la valeur de ce noeud au total (dans 'move_current_to_end' par le proxy de' add_node'). Au lieu de cela, 'add_node' ne doit ajouter que le noeud à la liste - Le calcul du total/longueur réel doit être fait après que tout a été ajouté à la liste. en déployant la dernière partie. – Paul

+0

hm ... Je ne peux pas utiliser une boucle for dans cette tâche si ... Je dois travailler avec ce que j'ai là ... EDIT: ne se rendait pas compte que l'entrée soumise, de toute façon, je dois avoir la chose calcule le total et le nombre de nœuds pendant qu'il traverse. – Brandon

0

Vous avez beaucoup d'autres choses là-bas et vous ne dites pas ce que votre code fait, mais je ferais quelque chose comme ça (non testé):

int count = 0; 
int total = 0; 

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

J'ai oublié de mentionner que j'ai besoin de "parcourir" la liste afin de totaliser les nombres entrés et de compter le nombre de nœuds dans la liste. Ainsi, mon grand dilemme ... – Brandon

+1

Je ne comprends pas. Mon code traverse la liste, il compte le nombre de nœuds, et il ajoute aussi la somme - ??? –

+0

mais je ne peux pas utiliser une boucle for, je dois utiliser ce que j'ai – Brandon

0

Je sais que ce won « t vous aider à faire vos devoirs, mais voici un programme C++ STL qui répond à vos besoins:

  • autant d'entrées que l'utilisateur désire
  • numéros sont stockés dans une liste chaînée
  • Les chiffres sont additionnés
  • Calcule et affiche en moyenne

Bonne chance avec votre classe.

#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

Excusés: aurait attaché un commentaire à poser cette question d'introduction. Mais apparemment, vous avez besoin d'un représentant plus élevé que je dois actuellement le faire.

@Brandon.Puis-je vous dire clairement que ce sont ces fonctions:

int get_number_data (int & nombre)

add_node void (int & nombre)

de move_current_to_end void()

de display_avg vide (

et seulement ceux-ci que vous êtes autorisé à utiliser? (Et je cite vous: « Je viens de l'avoir comprendre le total et et nombre de noeuds en utilisant ces fonctions »

Si oui, pourquoi ont-ils été spécifiés par votre professeur