Zadanie z list jednokierunkowych

0

Witam, Jeśli ktoś ma czas, może podrzuciłby jakaś wskazówkę. Treść zadania jest następująca

Dla listy zdefiniowanej typami:
struct Tcos { int liczba; char znak; Tcos *next};
napisac funkcje, która do listy zaczynajacej sie pod jakims adresem dopisuje najpierw element zawierajacy sume pól liczbowych tych elementów listy, w których pole znak jest cyfra, a zaraz za nim dopisuje element zawierajacy sume pól liczbowych pozostałych elementów. Pola znakowe powinny byc równe odpowiednio ‘p’ (w elemencie przedostatnim ) i ‘o’ (w elemencie ostatnim)

Oto moje wypociny:

#include <iostream>

using namespace std;
int dodzn=0;
int dod=0;
struct Tcos{ int liczba; char znak; Tcos *next;
};
void drukuj_liste_it(Tcos *adres){
while(adres!=NULL){
cout<<adres->liczba<< "   "<<adres->znak<<endl;
adres=adres->next;
}
}
void dodaj(Tcos *adres, Tcos *head){
while(adres!=0){
if(adres->znak>=0&&adres->znak<=9)
dodzn=dodzn+(adres->liczba);
else
dod=dod+(adres->liczba);
adres=adres->next;
}
Tcos *przedostatni;
Tcos *ostatni;
przedostatni= new Tcos;
ostatni= new Tcos;
adres->next=przedostatni;
przedostatni->liczba=dodzn;
przedostatni->znak='p';
przedostatni->next=ostatni;
ostatni->liczba=dod;
ostatni->znak='o';
ostatni->next=NULL;
adres=ostatni->next;
};
int main()
{
    Tcos *glowa, *aktualny, *poprzedni, *tmp;
  // dodatkowe dane pomocnicze
  int dana, ile, ilew, i;
  char znakpom;

  cout << "Program lista_1 - prezentacja listy jednokierunkowej\n\n";

  // Tworzenie listy - kolejno wczytywane rekordy
  // dopisywane są na koniec listy
  cout << "0 konczy wpisywanie\n";
  aktualny = NULL;
  poprzedni = NULL;
  glowa = poprzedni;
  cout << "Podaj liczbe i znak do wstawienia: ";
  cin >> dana>>znakpom;
  while (dana!=0)
  {
    // zapamiętujemy dotychczasowy koniec listy
    poprzedni = aktualny;
    // tworzymy nowy element
    aktualny = new Tcos;
    // zapisujemy do niego odczytane dane
    aktualny->liczba = dana;
    (*aktualny).znak=znakpom;
    // teraz jest to ostatni element listy
    aktualny->next = NULL;
    // natomiast poprzedni ostatni już nie jest ostatnim
    if (poprzedni != NULL) // Zabezpieczenie na początek
      poprzedni->next = aktualny;
    else
      glowa = aktualny;

    // i odczytujemy nowe dane
    cout << "Podaj liczbe i znak do wstawienia: ";
    cin >> dana>>znakpom;
  };

  cout << "\nPo wprowadzeniu:\n";
  drukuj_liste_it(glowa);
  // dotad mam dobrze jesli chodzi przynajmniej o funkcje main, problemy zaczynaja sie wraz z funkcja dodaj
  Tcos *glowapom;
  glowapom=glowa;
  dodaj(glowapom,glowa);
  drukuj_liste_it(glowa);
    return 0;
}

W zadaniu jest napisane aby wykonac tylko funkcje, jednak chcialem sprawdzic czy dziala ona do stworzonej przeze mnie listy. Jestem początkujący i każda łopatologiczna wskazówka będzie cenna ;D
Acha funkcja którą stworzyłem nie działa jakieś pomysły dlaczego?

0

Tworzysz sobie funkcje która sprawdza czy ten char jest cyferką, np taką:

bool IsDigit(char n){
    return n>='0' && n<='9';
}

Później w funkcji tworzysz 2 zmienne pomocnicze, trzymające sumy odpowiednio dla węzłów z cyfrą w znak i dla pozostałych wariantów.Później jedziesz przez wszystkie elementy i sprawdzasz co tam stoi, dodając wartości z "liczba" do odpowiedniej sumy.. Później dodajesz dwa nowe węzły do listy..
W teorii to tyle.. A w praktyce idę spać i może jutro jutro zerknę na to dokładniej:)
P.S W code::blocks klikasz ctrl+a prawy i "format this fila(A Style)"

0

;) Ha, ha, dzięki za odpowiedź. To z tym format AStyle bardzo pomocne;D. Wracając do zadania wydaje mi się, że zrobiłem dokładnie jak mówisz tylko sprawdzanie czy znak jest cyfrą umieściłem w samej funkcji już
. Nie wiem jednak jaki jest błąd w tym co zrobiłem. Domyślam się że może źle używam wskaźników przy tworzeniu dodatkowych elementów listy.

int dodzn=0;
int dod=0;
void dodaj(Tcos *adres, Tcos *head)
{
    while(adres!=0)
    {
        if(adres->znak>=0&&adres->znak<=9)
            dodzn=dodzn+(adres->liczba);
        else
            dod=dod+(adres->liczba);
        adres=adres->next;
    }
    Tcos *przedostatni;
    Tcos *ostatni;
    przedostatni= new Tcos;
    ostatni= new Tcos;
    adres->next=przedostatni;
    przedostatni->liczba=dodzn;
    przedostatni->znak='p';
    przedostatni->next=ostatni;
    ostatni->liczba=dod;
    ostatni->znak='o';
    ostatni->next=NULL;
    adres=ostatni->next;
};
0

Coś w tym stylu, ale lepiej zrób sobie funkcje, która dodaje nowy element do listy..

#include <iostream>
using namespace std;
struct Tcos{
    int liczba;
    char znak;
    Tcos *next;
};
void drukuj_liste_it(Tcos *adres){
    while(adres!=NULL){
        cout<<adres->liczba<< "   "<<adres->znak<<endl;
        adres=adres->next;
    }
}
bool isDigit(char n){
    return n>='0' && n<='9';
}
void fun(Tcos *adres,int &sumaLiczb,int &sumaZnakow){
    while(adres!=NULL){
        if(isdigit(adres->znak)==true){
            sumaLiczb+=adres->liczba;
        }
        else{
            sumaZnakow+=adres->liczba;
        }
        adres=adres->next;
    }
}
int main(){
    Tcos *glowa, *aktualny, *poprzedni, *tmp;
    int dana, ile, ilew, i;
    char znakpom;
    cout << "Program lista_1 - prezentacja listy jednokierunkowej\n\n";
    cout << "0 konczy wpisywanie\n";
    aktualny = NULL;
    poprzedni = NULL;
    glowa = poprzedni;
    do{
        cout << "Podaj liczbe i znak do wstawienia: ";
        cin >> dana>>znakpom;
        poprzedni = aktualny;
        aktualny = new Tcos;
        aktualny->liczba = dana;
        (*aktualny).znak=znakpom;
        aktualny->next = NULL;
        if (poprzedni != NULL)
            poprzedni->next = aktualny;
        else
            glowa = aktualny;
    }while(dana!=0);

    cout << "\nPo wprowadzeniu:\n";
    drukuj_liste_it(glowa);

    int sumaLiczb=0,sumaZnakow=0;
    fun(glowa,sumaLiczb,sumaZnakow);

    poprzedni = aktualny;
    aktualny = new Tcos;
    aktualny->liczba = sumaLiczb;
    (*aktualny).znak='p';
    aktualny->next = NULL;
    poprzedni->next = aktualny;
    poprzedni = aktualny;
    aktualny = new Tcos;
    aktualny->liczba = sumaZnakow;
    (*aktualny).znak='o';
    aktualny->next = NULL;
    poprzedni->next = aktualny;
    cout<<"\nWynik: \n";
    drukuj_liste_it(glowa);
    return 0;
}
0

Coś w ten serek byłoby ok:

#include <iostream>
using namespace std;
struct Tcos{
    int liczba;
    char znak;
    Tcos *next;
};
void drukuj_liste_it(Tcos *adres){
    adres=adres->next;
    while(adres!=NULL){
        cout<<adres->liczba<< "   "<<adres->znak<<endl;
        adres=adres->next;
    }
}
void dodaj_do_listy(Tcos *adres,int liczba,char znak){
    while(adres->next!=NULL)
        adres=adres->next;
    Tcos *nowy = new Tcos;
    nowy->liczba=liczba;
    nowy->znak=znak;
    nowy->next=NULL;
    adres->next=nowy;
}
bool isDigit(char n){
    return n>='0' && n<='9';
}
void fun(Tcos *adres,int &sumaLiczb,int &sumaZnakow){
    while(adres!=NULL){
        if(isdigit(adres->znak)==true)
            sumaLiczb+=adres->liczba;
        else
            sumaZnakow+=adres->liczba;
        adres=adres->next;
    }
}

int main(){
    Tcos *glowa= new Tcos;
    int dana;
    char znakpom;
    cout << "Program lista_1 - prezentacja listy jednokierunkowej\n\n";
    cout << "0 konczy wpisywanie\n";
    glowa->next=NULL;
    glowa->liczba=0;
    glowa->znak=0;
    do{
        cout << "Podaj liczbe i znak do wstawienia: ";
        cin >> dana>>znakpom;
        dodaj_do_listy(glowa,dana,znakpom);
    }while(dana!=0);
    cout << "\nPo wprowadzeniu:\n";
    drukuj_liste_it(glowa);
    cout<<"\nPo dodaniu na koniec listy:\n\n";
    int sumaLiczb=0,sumaZnakow=0;
    fun(glowa,sumaLiczb,sumaZnakow);
    dodaj_do_listy(glowa,sumaLiczb,'p');
    dodaj_do_listy(glowa,sumaZnakow,'o');
    drukuj_liste_it(glowa);
    return 0;
}

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