[C++] Cykliczne listy jednokierunkowe.

nottscounty
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 10 lut 2014, o 13:15
Płeć: Mężczyzna
Lokalizacja: Zielona Góra

[C++] Cykliczne listy jednokierunkowe.

Post autor: nottscounty »

Witam!
Mam problem z programem dotyczącym cyklicznej listy jednokierunkowej, który się nie kompiluje, mógłby ktoś rzucić okiem, co robię źle? Nie jestem zaawansowanym programistą, dopiero z tym zaczynam i chciałbym się nauczyć prawidłowo programować, wrzucam kody plików: żródłowego, nagłówkowego i main


Kod: Zaznacz cały

#include "listy.h"
#include <iostream>
#include <fstream>

using namespace std;


void stworz_wezel(WezelInt *& pocz, int x)
{
    WezelInt *pom;
    pom = new WezelInt;
    pom->wartosc = x;
    if (pocz == NULL)
    {
        pocz = pom;
        pom->nast = pocz;   
    }
    else
    {
        pom->nast = pocz->nast; 
        pocz->nast = pom;
        pocz = pom;
    }
}


void dodaj_poczatek(WezelInt *& pocz,int x)
{
    if (pocz == NULL)
    {
        cout<<"Najpierw stworz liste."<<endl;
        return;
    }
    WezelInt *pom;
    pom = new WezelInt;
    pom->wartosc = x;
    pom->nast = pocz->nast; 
    pocz->nast = pom;
}


void dodaj_koniec(WezelInt *& pocz, int x, int poz)
{
    if (pocz == NULL)
    {
        cout<<"Najpierw stworz liste."<<endl;
        return;
    }
    WezelInt *pom, *s;
    s = pocz->nast;
    for (int i = 0;i < poz-1;i++)
    {
        s = s->nast;
        if (s == pocz->nast)
        {
            cout<<"Nie mniej niż ";
            cout<<poz<<" na liscie"<<endl;
            return;
        }
    }
    pom = new WezelInt;
    pom->nast = s->nast;
    pom->wartosc = x;
    s->nast = pom;
    /*Element dodaje się na końcu*/
    if (s == pocz)
    { 
        pocz=pom;
    }
}


void usun_element(WezelInt *& pocz, int x)
{
    WezelInt *pom, *s;
    s = pocz->nast;
      /* Jeżeli Lista zawiera tylko jeden element*/
    if (pocz->nast == pocz && pocz->wartosc == x)  
    {
        pom = pocz;
        pom = NULL;
        delete pom;
        return;
    }
    if (s->wartosc == x)  /*Usuwanie pierwszego elementu*/
    {
        pom = s;
        pocz->nast = s->nast;
        delete pom;
        return;
    }
    while (s->nast != pocz)
    {
        /*Usuwanie elemnetu pomiedzy*/
        if (s->nast->wartosc == x)    
        {
            pom = s->nast;
            s->nast = pom->nast;
            delete pom;
            cout<<"Element "<<x;
            cout<<" Usunieto z listy"<<endl;
            return;
        }
        s = s->nast;
    }
    /*Usuwanie ostatniego elementu*/
    if (s->nast->wartosc == x)    
    {
        pom = s->nast;
        s->nast = pocz->nast;
        delete pom;		
        pocz = s;
        return;
    }
    cout<<"Element "<<x<<" nie znalezniony na liscie"<<endl;
}

void wyszukaj_element(WezelInt *& pocz,int x)
{
    WezelInt *s;
    int licznik = 0;
    s = pocz->nast;
    while (s != pocz)
    {
        licznik++;
        if (s->wartosc == x)    
        {
            cout<<"Element "<<x; 
            cout<<" znalezione na pozycji "<<licznik<<endl;
            return;
        }
        s = s->nast;
    }
    if (s->wartosc == x)    
    {
        licznik++;             
        cout<<"Element "<<x;
        cout<<" znalezione w pozycji "<<licznik<<endl;
        return;
    }
    cout<<"Element "<<x<<" nie znalezniony na liscie"<<endl;
}

void wyswietl_liste(WezelInt * pocz)
{
    WezelInt *s;
    if (pocz == NULL)
    {
        cout<<"Lista jest pusta, nic do wyświetlenia"<<endl;
        return;
    }
    s = pocz->nast;
    cout<<"cykliczna lista jednokierunkowa: "<<endl;
    while (s != pocz)
    {
        cout<<s->wartosc<<"->";
        s = s->nast;
    }
    cout<<s->wartosc<<endl;
}

Kod: Zaznacz cały


#ifndef lista_h
#define lista_h


using namespace std;

class WezelInt{
	public:
		int wartosc;
		WezelInt *nast; 
		WezelInt();
		WezelInt(int x);
		WezelInt(int x, WezelInt *nastepny);
}*pocz;

	
};

void stworz_wezel(WezelInt *& pocz, int x);
void dodaj_poczatek(WezelInt *& pocz,int x);
void dodaj_koniec(WezelInt *& pocz, int x, int poz);
void usun_element(WezelInt *& pocz, int x);
void wyszukaj_element(WezelInt *& pocz,int x);
void wyswietl_liste(WezelInt * pocz);

Kod: Zaznacz cały

#include <iostream>
#include "listy.h"

using namespace std;

int main(int argc, char** argv) {
 int wybor, element, pozycja;
 

    while (1)
    {
        cout<<endl<<"---------------------------"<<endl;
        cout<<endl<<"------------MENU-----------"<<endl;
        cout<<endl<<"---------------------------"<<endl;     
        cout<<"1.Tworzenie wezla"<<endl;
        cout<<"2.Dodawanie elementu na poczatek"<<endl;
        cout<<"3.Dodawanie elementu na koniec"<<endl;
        cout<<"4.Usuwanie elementu"<<endl;
        cout<<"5.Wyszukiwanie"<<endl;
        cout<<"6.Wyswietlanie"<<endl;
        cout<<"7.Wyjscie"<<endl;
        cout<<"Wprowadź swój wybór : ";
        cin>>wybor;
        switch(wybor)
        {
        case 1:
            cout<<"Wprowadź element: ";
            cin>>element;
            stworz_wezel(element);
            cout<<endl;
            break;
        case 2:
            cout<<"Wprowadź element: ";
            cin>>element;
            dodaj_poczatek(WezelInt *& pocz,element);
            cout<<endl;
            break;
        case 3:
            cout<<"Wprowadź element: ";
            cin>>element;
            cout<<"Wstaw element, za pozycja: ";
            cin>>pozycja;
            dodaj_koniec(WezelInt *& pocz, element, pozycja);
            cout<<endl;
            break;
        case 4:
            if (pocz == NULL)
            {
                cout<<"Lista jest pusta, nic do usunięcia"<<endl;
                break;
            }
            cout<<"Wprowadź element do usuniecia: ";
            cin>>element;
            usun_element( element);
            cout<<endl;
            break;
        case 5:
            if (pocz == NULL)
            {
                cout<<"Lista pusta! Nie można wyszukiwać"<<endl;
                break;
            }
            cout<<"Wprowadź element do wyszukania: ";
            cin>>element;
            wyszukaj_element(WezelInt *& pocz, element);
            cout<<endl;
            break;
        case 6:
            wyswietl_liste(WezelInt * pocz);
            break;        
        case 7:
            exit(1);
            break;
        default:
            cout<<"Zly wybor"<<endl;
        }
    }
	return 0;
}


-- 25 sty 2015, o 22:08 --
Ostatnio zmieniony 26 sty 2015, o 12:30 przez nottscounty, łącznie zmieniany 1 raz.
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[C++] Cykliczne listy jednokierunkowe.

Post autor: Gouranga »

błędy:

Kod: Zaznacz cały

# include <iostream>
WezelInt *& pocz
to tyle z syntaktyki, nie staram się nawet zrozumieć semantyki
Ostatnio zmieniony 26 sty 2015, o 07:35 przez Afish, łącznie zmieniany 1 raz.
Powód: Stosuj tagi code.
nottscounty
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 10 lut 2014, o 13:15
Płeć: Mężczyzna
Lokalizacja: Zielona Góra

[C++] Cykliczne listy jednokierunkowe.

Post autor: nottscounty »

A możesz mnie naprowadzić jak poprawić te błędy?
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C++] Cykliczne listy jednokierunkowe.

Post autor: Vardamir »

nottscounty pisze:Witam!
Mam problem z programem dotyczącym cyklicznej listy jednokierunkowej, który się nie kompiluje, mógłby ktoś rzucić okiem, co robię źle? Nie jestem zaawansowanym programistą, dopiero z tym zaczynam i chciałbym się nauczyć prawidłowo programować, wrzucam kody plików: żródłowego, nagłówkowego i main
Nawet nie przeglądałem co tam wrzuciłeś..

Nie kompiluje się, to znaczy że wyrzuca błędy. Jakie? Jeśli chcesz się nauczyć prawidłowo programować to musisz czytać błędy i korzystać z tego co sygnalizują.
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[C++] Cykliczne listy jednokierunkowe.

Post autor: Gouranga »

po 1. w dyrektywach preprocesora między hashem a nazwą dyrektywy nie daje się spacji
po 2. operatory wyłuskania i adresowania wzajemnie się redukują, zapis *& zmienna jest równoważny z samym zmienna
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C++] Cykliczne listy jednokierunkowe.

Post autor: Vardamir »

Gouranga pisze:po 1. w dyrektywach preprocesora między hashem a nazwą dyrektywy nie daje się spacji
po 2. operatory wyłuskania i adresowania wzajemnie się redukują, zapis *& zmienna jest równoważny z samym zmienna
Może i się nie daje, ale kompilatory to przepuszczają (przynajmniej dwa które sprawdziłem)

Ale co Ty piszesz.. Przecież *& to przekazanie wskaźnika przez referencje do funkcji. Inna bajka, że można to robić przez podwójny wskaźnik, ale nie powinno generować błędów kompilacji.

Lepiej niech zamieści jakie błędy dostaje przy kompilacji.
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[C++] Cykliczne listy jednokierunkowe.

Post autor: Gouranga »

Vardamir, przeklęty c++, w prawdziwym C *& się zniesie
Ostatnio zmieniony 26 sty 2015, o 22:16 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C++] Cykliczne listy jednokierunkowe.

Post autor: Vardamir »

Z oczywistych błędów, jeśli już patrzymy na pierwsze linijki, czyli dodawane pliki/biblioteki:
- piszesz w c++, więc korzystaj z rozszerzeń .hpp, .cpp,
- dodajesz w main tylko plik nagłówkowy, powinieneś ten zawierający plik nagłówkowy i metody,
- w sumie pięć razy dodajesz bibliotekę <iostream> co oznacza, że kompletnie nie masz pojęcia co robisz,
- w argumentach main podajesz int argc, char** argv choć zapewne nie wiesz do czego to służy i z tego nie korzystasz,
- dołączasz biblioteki <cstdio>, <cstdlib> z których nie korzystasz, więc po co?
nottscounty
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 10 lut 2014, o 13:15
Płeć: Mężczyzna
Lokalizacja: Zielona Góra

[C++] Cykliczne listy jednokierunkowe.

Post autor: nottscounty »

Poprawiłem błędy z bibliotekami, przy kompilacji pokazują się błędy z wywoływaniem metod:
-expected primary-expression before '*' token
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C++] Cykliczne listy jednokierunkowe.

Post autor: Vardamir »

No to lecimy dalej:
- using namespace std; jesli już z tego korzystamy to nie powinno się znaleźć w pliku nagłówkowym
- masz #include "listy.h", a za chwilę #ifndef lista_h nie wiem jak się pliki nazywają, ale tutaj jest potrzebna konsekwencja. Zapewne dodajesz coś co nie istnieje lub tworzysz definicje niepołączne z deklaracjami.
- #include <fstream> to też jest zbędne
- <iostream> dalej dwa razy, ale jak na początki nauki programowania może przejść
- osobna sprawa, dlaczego korzystasz z klasy zamiast struktury na przechowywanie węzła

Jeśli piszesz program to musisz zastanawiać się nad każdą linijką, a nie wpisywać (kopiować) co popadnie na zasadzie 'może zadziała'. Trzeba być świadomym z czego się korzysta.

Edit.
Gouranga, przyznaje. To dodaj_poczatek(WezelInt *& pocz,element); pojawia się w main i nie ma kompletnie żadnego sensu. Nie przeglądałem zawartości wcześniej, a odnośnie twojej wypowiedzi miałem na myśli definicje i deklaracje metod.
ODPOWIEDZ