[c++] lista dwukierunkowa - struktura
-
- 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
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
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.
- kadiii
- 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
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ś .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 ?)
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ć.
Jeszcze jakieś pytania?
-
- 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
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
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
- kadiii
- 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
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.
-
- 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
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 ...
gdzie example *ex to bylo:
jesli masz dostep do przykladowych programow to moglbys mi podrzucic ja przeanalizuje
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);
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 ...
}
- kadiii
- 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
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 :(
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.
-
- 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
prosze:
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
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;
}
-
- 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
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 ...
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 ...
-
- 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
Apropo tych wskaznikow to bm zrobil tak:
Tworzymy nowa strukture i dajemy wskaznik na jej element:
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:
Tak po krotce
POZDRO
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;
}
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;
POZDRO
- kadiii
- 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
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
-
- 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
To bedzie wygladac jakos tak:
?? Czy jakos inaczej?? POZDRO
BTW. Oczywiscie to dla jednego elementu, a pozniej przydaloby sie uzywac realloca albo calloca
Kod: Zaznacz cały
struct AUTO **tab_wskaznikow;
tab_wskaznikow=(struct AUTO**)malloc(sizeof(struct AUTO*));
BTW. Oczywiscie to dla jednego elementu, a pozniej przydaloby sie uzywac realloca albo calloca
- Undre
- Użytkownik
- Posty: 1430
- Rejestracja: 15 lis 2004, o 02:05
- Płeć: Mężczyzna
- Lokalizacja: UĆ
- Podziękował: 3 razy
- Pomógł: 92 razy
[c++] lista dwukierunkowa - struktura
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 ) klasyzxc18 pisze:kurde nie rozumie takich " :: " .. nie zglebialem jeszcze klas, konstruktorow, iteratorow czy czegos tam
Nie zmienia to faktu, ze latwo w google wpisac "lista dwukierunkowa" lub w angielskim odpowiedniku "two way linked list"
-
- 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
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 ..
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 ..
- kadiii
- 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
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ść.a czemu nie struct TAuto *tab_wskaznikow[rozmiar];
tab_wskaznikow = new TAuto; // ??
dokładnie to wskażnik początek tablicy wskaźników, a tam msz wskaźnik na twój obiekt.TAuto **tab_wsk;
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ę.