[c++] lista dwukierunkowa - struktura

zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] lista dwukierunkowa - struktura

Post autor: zxc18 »

Mam prosbe, napisalem taki program (zdaje sobie sprawe ze jest niezgodny z poleceniem, ale nie wiem jak zrobic ten 1 podpunkt - tablica wskaznikow na struktury ?) - uzylem listy dwukierunkowej bo wydala mi sie odpowiednia do tego programu.
Streszczajac sie, mam problem z funkcja : sortuj wedlug modeli , i nie wiem jak sie do tego zabrac ... znaczy kombinuje z qsortem .. czy moge uzyc do tego funkcji qsort i jak przekazac do niej pierwszy element listy (jak rozumuje : lista - kontener, tablica - kontener czyli qsort(lista, rozmiar listy, rozmiar pojedynczego elementu listy - czyli TWezel, funkcja )
Jednym slowem spojrzcie sami i prosze bardzo o porade i moze jakis fragmencik kodu tej funkcji, a jezeli cos jeszcze jest skopane to poprawcie. Krytyka bardzo mile widziana, bo dopiero ksztaltuje swoj styl (jesli to mozna tak nazwac ) i potrzebne mi negatywne opinie..



Bardzo prosze o wszelkie krytyczne uwagi i poprawki ..
No i o pomoc w zorbieniu sortowania wg modeli ... i jak to wszystko realokowac ??
Bardzo bardzo dziekuje za okazna pomoc, dzieki ktorej bardzo duuuzo sie nauczylem i ciagle ucze
Ostatnio zmieniony 9 sty 2008, o 13:28 przez zxc18, łącznie zmieniany 1 raz.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] lista dwukierunkowa - struktura

Post autor: kadiii »

Mam prosbe, napisalem taki program (zdaje sobie sprawe ze jest niezgodny z poleceniem, ale nie wiem jak zrobic ten 1 podpunkt - tablica wskaznikow na struktury ?)
Przecież pytałeś już o to i dostałeś pełną odpowiedź, jak nie zrozumiałeś trzeba było pytać. Poza tym trudno powiedzieć czy kod jest niezgodny z poleceniem bo go 'chyba' nie ujawniłeś ;) .

Kod: Zaznacz cały

typedef struct {
char marka[20];
char model[30];
unsigned int moc_KM;
float cena_tys;
} AUTO;
int rozmiar;
cin>>rozmiar;
AUTO **tab_wsk=new AUTO*[rozmiar];//oczywiście możesz to potem realokować.
Zauważ, że takie roziązanie jest łatwiejsze i szybsze. Teraz sortowanie możesz napisać nawet sam bo operujesz na tablicy wskaźników jak na zwykłej tablicy. W tablicy wskażników masz adresy twoich struktur i jeżeli chcesz posortować te struktury to sortujesz jedynie ich adresy. Tak obrazowo: Masz fabrykę pełną aut. Gdybyś chciał je posortować np. cenami to mógłbyś poprzenosić je odpoweidnio, ale byłoby to raczej niewygodne. Lepiej posortować odpowiadające im zdjęcia na własnym biurku(analogia do adresów). Czyli tablica wskażników na struktury jest właśnie taką "skrzynką" z kolejnymi zdjęciami aut(adresami struktur). Koniec obrazu;)
Jeszcze jakieś pytania?
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] lista dwukierunkowa - struktura

Post autor: zxc18 »

polecenie to:

Napisać program, który umożliwi użytkownikowi wykonanie następujących operacji:
- utworzenie nowej danej typu AUTO i przechowanie w tablicy wskaźników na struktury
AUTO jej adresu,
- wybór ze zbioru zapamiętanych marek i modeli najtańszego,
- posortowanie zbioru aut w kolejności alfabetycznej wg marek lub modeli (wybiera
użytkownik),
- wyświetlenie zarejestrowanych typów i danych aut.

Hmm czyli musze edytowac / deletowac caly kod ? bo nie mam pomyslu jak polaczyc to co napisales z moim kodem .. hmm .. juz wogole sie w tym pogubilem
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] lista dwukierunkowa - struktura

Post autor: kadiii »

Nie przejmuj się w końcu poznałeś abstrakcyjny typ danych jakim jest lista. Jeżeli jednak chcesz wykonać polecenie musisz raczej zacząć od nowa. Zastanów się powoli, przeczytaj mój obrazowy opis(może pomoże) a na pewno zacznie ci wychodzić. W razie kłopotów pytaj.
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] lista dwukierunkowa - struktura

Post autor: zxc18 »

heh dzieki, ja nie poddam sie szybko i skoro zaczalem tak robic to doprowadze to do konca ..
a jutro zrobie zgodnie z poleceniem ..

wracajac do tematu, co myslisz o tym co napisalem wczesniej, uzycie funkcji qsort ?

qsort(lista - czyli jej pierwszy element w moim przypadku "pierwszy", rozmiar listy - czyli ten fnLicznik co zlicza, sizeof(TWezla) - bo to element listy, i ta funkcja ) ??
mozna tak zrobic ?? bo widzialem podobny przyklad i mysle by przemycic cos z niego do mojego programu, probowalem zrobic podoba funkcje w miejsce ex, wstawic pierwszy, bo to pierwszy element listy, a wiem ze nazwa tablicy = adres jej pierwszego elementu .. no ale cholerka nie wiem jak to zrobic za bardzo, tak by funkcja wszystko ladnie sobie przekazywala itd ...

Kod: Zaznacz cały

void print(example * ex, int len)
{
     int i;
     
     qsort(ex,len,sizeof(example),cmpFirst);
     printf("Porownanie pierwszego elementu:
");
     for(i=0;i<len;i++)
     {
         printf("%d %d
",(ex+i)->first,(ex+i)->second);  
gdzie example *ex to bylo:

Kod: Zaznacz cały

example * add(example * ex,int first, int second, int *len)
{
      example * help = ex;
      if(help == NULL)
      {
         help = (example*)malloc(sizeof(example)); // itd ...
      }  
jesli masz dostep do przykladowych programow to moglbys mi podrzucic ja przeanalizuje
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] lista dwukierunkowa - struktura

Post autor: kadiii »

Kod: Zaznacz cały

 int licznik = fnLicznik(pierwszy,ostatni); // tutaj cos kombinowalem ...
   
    TWezel baza[licznik]; // w sumie nie wiem po co jak jest zle .. //to co wyzej :( 
To nie jest poprawna deklaracja tablicy. Aby zrobić tak jak chciałeś musisz użyć dynamicznej alokacji.
Poza tym w twoim kodzie jest masa zmiennych, nie zawsze czytelnie nazywanych. Wklej może cały kod będą przynajmniej wszystkie definicje zmiennych(np. example).
Moim zdaniem lepiej byłoby ci odstawić to na dziś i spróbować z tablicą wskaźników. Będzie ci łatwiej zrozumieć zarówno samą koncepcję przechowywania struktur, użycie qsorta oraz ułatwi ogarnięcie listy z czym są widzę spore problemy.
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] lista dwukierunkowa - struktura

Post autor: zxc18 »

prosze:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
typedef struct example
{
     int first;
     int second;   
}example;
int cmpFirst(const void *a, const void *b)
{
    return ((example*)a)->first - ((example*)b)->first; 
}
int cmpSecond(const void *a, const void *b)
{
    return ((example*)a)->second - ((example*)b)->second; 
}
example * add(example * ex,int first, int second, int *len)
{
      example * help = ex;
      if(help == NULL)
      {
         help = (example*)malloc(sizeof(example));
      }
      else
      {
          help = (example*)realloc(help, *len+1); 
      }
      if(help == NULL)
      {
          return NULL;
      }
      (help+*len)->first  = first;
      (help+*len)->second = second;
      if(help == NULL)*len = 0;
      else (*len)++;
      return help;
}
example * del(example * ex,int index, int *len)
{       
       int i;
       if(ex!= NULL)
       {
           for(i=index;i<*len;i++)
           {
              *(ex+i) = *(ex+(i+1));
           }
           ex = (example*)realloc(ex, *len-1);
           if(ex == NULL)*len = 0;
           else (*len)--;
       }
       return ex;
}
void print(example * ex, int len)
{
     int i;
     
     qsort(ex,len,sizeof(example),cmpFirst);
     printf("Porownanie pierwszego elementu:
");
     for(i=0;i<len;i++)
     {
         printf("%d %d
",(ex+i)->first,(ex+i)->second);                 
     }
     qsort(ex,len,sizeof(example),cmpSecond);
     printf("Porownanie drugiego elementu:
");
     for(i=0;i<len;i++)
     {
         printf("%d %d
",(ex+i)->first,(ex+i)->second);                 
     }     
}
void printMenu()
{
    printf("
1	Dodaj
2	Usun
3	Pokaz

0	Koniec
");         
}
int main()
{
    example * Ex = NULL;
    int len=0;
    int option = -1;
    int first, second, index;
   
    while(option!=0)
    {
       printMenu();
       scanf("%d",&option);
       switch(option)
       {
          case 1:
               printf("Podaj pierwszy i drugi:");
               scanf("%d%d",&first, &second);
               Ex = add(Ex, first, second,&len);
               break;
          case 2:
               printf("Podaj indeks:");
               scanf("%d",&index);
               Ex = del(Ex, index,&len);
               break;
          case 3:
               print(Ex,len);
               break;               
          case 0:               
               break;
          default:
               break;             
       }
    }
    free(Ex);
    return 0;   
}
masz jakies przyklady na ktorych moge sie wzorowac ? bo sam raczej nic nie wymysle .. nie widzialem ani jednego przykladu, sama sucha teoria z ktorej nic nie moge wyniesc, a ja jestem raczej praktykiem - musze zobaczyc, dotknac, pobawic sie - zrozumiec
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[c++] lista dwukierunkowa - struktura

Post autor: Undre »

Przykladow w necie od groma, use google

( przykladowo : )
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] lista dwukierunkowa - struktura

Post autor: zxc18 »

pospieszylem sie z pomogl kurde nie rozumie takich " :: " .. nie zglebialem jeszcze klas, konstruktorow, iteratorow czy czegos tam

ok, to moze zostawmy to liste dwukierunkowa.. chcialbym zrobic ten program zgodnie z poleceniem:

struct AUTO {
char marka[20];
char model[30];
unsigned int moc_KM;
float cena_tys;
}
Jest deklaracją pewnej struktury;
Napisać program, który umożliwi użytkownikowi wykonanie następujących operacji:
- utworzenie nowej danej typu AUTO i przechowanie w tablicy wskaźników na struktury
AUTO jej adresu,
- wybór ze zbioru zapamiętanych marek i modeli najtańszego,
- posortowanie zbioru aut w kolejności alfabetycznej wg marek lub modeli (wybiera
użytkownik),
- wyświetlenie zarejestrowanych typów i danych aut.

nie mam pojecia, jak to zrobic, wiem ze Kadiii mi pisal jakies konstrukcje, ale nie potrafie tego wykorzystac ...
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c++] lista dwukierunkowa - struktura

Post autor: soku11 »

Apropo tych wskaznikow to bm zrobil tak:
Tworzymy nowa strukture i dajemy wskaznik na jej element:

Kod: Zaznacz cały

struct AUTO* nowa()
{
  struct AUTO *tmp;
  tmp=(struct AUTO)*malloc(sizeof(struct AUTO));
  if(!tmp)
  {
    printf("Blad allokacji pamieci!");
    return NULL;
  }
  return tmp;
}
Juz to gdzies pisalem w podobnym temacie. Funkcja zwraca wskaznik na nowo utworzona strukture, lub NULL jesli nie mozna zaalokowac pamieci.
teraz wpisujemy do tablicy wskaznikow:

Kod: Zaznacz cały

#define elementow 10
...
struct AUTO *tablica_wskaznikow[elementow]
...
struct AUTO *nowy_element;
nowy_element=nowy();
if(now_element) tablica_wskaznikow[0]=nowy_element;
Tak po krotce

POZDRO
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] lista dwukierunkowa - struktura

Post autor: kadiii »

Dokładnie tak. I żeby to miało tą dynamiczność jak lista zaalokuje jeszcze dynamicznie samą tablicę wskaźników żeby nie była stała tylko właśnie dynamiczna. Pozdrawiam
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c++] lista dwukierunkowa - struktura

Post autor: soku11 »

To bedzie wygladac jakos tak:

Kod: Zaznacz cały

struct AUTO **tab_wskaznikow;
tab_wskaznikow=(struct AUTO**)malloc(sizeof(struct AUTO*));
?? Czy jakos inaczej?? POZDRO

BTW. Oczywiscie to dla jednego elementu, a pozniej przydaloby sie uzywac realloca albo calloca
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[c++] lista dwukierunkowa - struktura

Post autor: Undre »

zxc18 pisze:kurde nie rozumie takich " :: " .. nie zglebialem jeszcze klas, konstruktorow, iteratorow czy czegos tam
Dalem ci linka do goscia z twojej polibudy, myslalem ze tak to ma u was wygladac w sumie. A co do klas - piszesz w C++, zatem piszac struct uzywasz ( moze nieswiadomie ) klasy

Nie zmienia to faktu, ze latwo w google wpisac "lista dwukierunkowa" lub w angielskim odpowiedniku "two way linked list"
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] lista dwukierunkowa - struktura

Post autor: zxc18 »

a czemu nie struct TAuto *tab_wskaznikow[rozmiar];
tab_wskaznikow = new TAuto; // ??

TAuto **tab_wsk; /* to wskaznik do wskaznika pierwszego elementu tablicy ?
w sumie to sie wydaje logiczne, to po co jest ten zapis co dalem wczesniej ? TAuto *tab_wskaznikow[rozmiar];

EDIT: undre, wierz mi szukalem, ale co z tego jak moj angielski lekko kuleje znalazlem nawet fajna funkcje sort(iterator begin, itereator end) w ale nie umie jej wykorzystac ..
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] lista dwukierunkowa - struktura

Post autor: kadiii »

a czemu nie struct TAuto *tab_wskaznikow[rozmiar];
tab_wskaznikow = new TAuto; // ??
To by spowodowało jedynie przypisanie do pierwszego elementu tablicy nowego obiektu TAuto, ale gdyby się skończyła tablica (ilość aut>=rozmiar) to już nie możesz więcej tworzyć obiektów. Jeśli jednak masz tablicę dynamiczną to możesz ja dowolnie(w zakresie dostępnej pamieci) zwiększać tym samym możesz zapisać ile chcesz elementów a nie narzuconą z góry ilość.
TAuto **tab_wsk;
dokładnie to wskażnik początek tablicy wskaźników, a tam msz wskaźnik na twój obiekt.
czyli możesz zapisać tak:
AUTO **tab_wsk=new AUTO*[rozmiar];
gdzie rozmiar będzie jakimś wstępnym rozmiarem, który po wyczerpaniu możesz zwiększyć realokując taką tablicę.
ODPOWIEDZ