Wyswietlanie listy w odwrotnej kolejnosci

0

Witam,
Mam problem z programem w C++. Muszę wyświetlić podane liczby w odwrotnej kolejności. Ogólna myśl jest taka: na wejściu mam podać ilość wierszy, a potem w każdym wierszu dowolną ilość liczb, które na wyjściu zostaną wyświetlone w odwrotnej kolejności oraz w tych samych wierszach. Udało mi się coś stworzyć, ale nie wiem jak wkleić tutaj tę ilość wierszy. Mam również problem, bo przy wyświetlnaniu w odwrotnej kolejności zajda mi pierwszą liczbę. Proszę o pomoc:

#include <iostream>

using namespace std; 

struct Lista
{ 
   int dane; 
   Lista *nastepny; 
}; 
 
Lista *tmp; 
Lista *pierwszy; 

void dodaj_element(int dodaj) 
{ 
   tmp=new Lista; 
    
   tmp->dane = dodaj; 
   tmp->nastepny = pierwszy; 
    
   pierwszy = tmp; 
}

void wyswietl() 
{ 
   tmp=pierwszy; 
   while (tmp != NULL) 
   { 
      cout << tmp->dane << " ";    
      tmp = tmp->nastepny; 
   } 
} 

int main() 
{ 
   int liczba;
   int iloscWierszy;
     
   pierwszy = NULL;  
    
   while (cin.get() != '\n'){ 
       cin >> liczba;
       dodaj_element(liczba);
}
   wyswietl(); 

system("PAUSE"); 
   return 0; 
}
0
void listDisplay( List* root )
{
     if( !root )
          listDisplay( root->nastepny );

     cout << root->dane << " ";
}
0

Dobra, mam coś takiego:

 int main() 
{ 
   int liczba;
   int iloscWierszy;
   pierwszy = NULL;
   
 
        cin >> iloscWierszy;
        
        for (int i=-1; i<iloscWierszy; i++){
        
        while (cin.get() != '\n'){ 
        cin >> liczba;
        dodaj_element(liczba);
       
        }     
 }
     wyswietl();

system("PAUSE"); 
   return 0; 
} 

Dane wprowadzane są prawidłowo, ale z wyświetlaniem jest problem. Zjada pierwszą liczbę i wyświetla wszystko w jednym wierszu. Bardzo proszę o wskazówki.

0
#include <iostream>
#include <limits>
#include <list>
#include <iterator>
#include <sstream>

int main()
{
	int rowCount;
	std::cin >> rowCount;
	std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	
	for(int i = 0; i < rowCount; i++)
	{
		std::string line;
		std::getline(std::cin, line);

		std::istringstream lineStream(line);
		std::istream_iterator<int> numbersIterator(lineStream);
		
		std::list<int> numbers;
		std::copy(numbersIterator, std::istream_iterator<int>(), std::front_inserter(numbers));
		
		std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));
		std::cout << std::endl;
	}

	return 0;
}

To jest C++, a nie to coś tam zrobił ;).

0

Ale @Rev dalej wyswietlasz liste w normalnej kolejnosci ;-)
Proponuje zatem:

copy( numbers.rbegin(), numbers.rend(); ostream_iterator< int >( cout, " " );

@sslider23 loguje sie z komorki, dlatego pisze minimum. To co napisalem, to funkcja rekurencyjna, dopoki root nie pokazuje na NULL to wywolanie rekurencyjne bedzie wywolywalo kolejne poziomy rekurencji. A potem bedzie wypisywalo dane i wracalo z powrotem z kazdego poziomu, przez co dane beda wypiywane od konca ( ale tylko wypisywane, to nie spowoduje, ze nagle lista sie odwroci ).

0

Ale @Rev dalej wyswietlasz liste w normalnej kolejnosci ;-)

Ale @MJay, proponuję sprawdzić co robi std::front_inserter. Twój kod do wyświetlania też jest od czapy, bo on elementy też dodaje na początek listy, a nie na koniec.

0

Ale przecież autorowi chodzi o to aby dodawać elementy na koniec listy. Użyj back_insertera i wyświetl elementy od końca..

0

Autorowi chodzi o to, żeby wyświetlić te elementy odwrotnie. Użyj front_insertera i wyświetl elementy od początku.

0

Ok, dzięki za pomoc. Postaram się coś z tym wykombinować. A potrafi mi ktoś odpowiedzieć czemu w moim kodzie przy wyświetlaniu zjada mi pierwszą liczbę?

0

Nie pierwszą liczbę, tylko pierwszą cyfrę pierwszej liczby. cin.get() wyciąga ją ze strumienia i chcesz tam znaleźć coś, czego już tam nie ma.

1 użytkowników online, w tym zalogowanych: 0, gości: 1