matematykaszkolna.pl
Kolejka - wydruk Informatyka: #include <stdio.h> #include <stdlib.h> struct elFIFO { struct elFIFO* nast; int data; }; struct FIFO { struct elFIFO* p; struct elFIFO* k; int x; }; struct FIFO* push(struct FIFO* kolejka,int x) { struct elFIFO* newel=(struct elFIFO*)malloc(sizeof(struct elFIFO)); newel−>data=x; newel−>nast=NULL; if(kolejka−>p==NULL) { kolejka−>p=newel; kolejka−>k=newel; } else { newel−>nast=kolejka−>p; kolejka−>p=newel; } printf("\nDodano: %d\n",kolejka−>p−>data); }; void pokaz(struct FIFO* kolejka) { if(kolejka−>p==NULL) { printf("Brak elementow w kolejce!"); } else{ if(kolejka−>p==kolejka−>k) { printf("Jest jeden element w kolejce %d",kolejka−>p−>data); } else { struct elFIFO* el=(struct elFIFO*)malloc(sizeof(struct elFIFO)); el=kolejka−>p; while(el) { printf("%d, ",el−>data); el=el−>nast; } } } } struct FIFO* pop(struct FIFO* kolejka) { struct elFIFO* r; if(kolejka−>p==NULL) printf("Brak elem. w kolejce!"); else{ if(kolejka−>p==kolejka−>k) { printf("Usunieto element: %d",kolejka−>p−>data); kolejka−>p=NULL; kolejka−>k=NULL; } else { printf("Usunieto element %d",kolejka−>p−>data); r=kolejka−>p−>nast; free(kolejka−>p); kolejka−>p=r; } } }; int main() { int x,wybor; struct FIFO* kolejka=(struct FIFO*)malloc(sizeof(struct FIFO)); kolejka−>p=NULL; kolejka−>k=NULL; kolejka−>x=0; do { printf("\nMenu:\n1. Dodawanie\n2. Odejmowanie\n3. Wyswietlenie\n4. Koniec\nWybor:"); scanf("%d",&wybor); if(wybor==1) { printf("Element: "); scanf("%d",&x); push(kolejka,x); } if(wybor==2) { pop(kolejka); } if(wybor==3) { pokaz(kolejka); } if(wybor==4) free(kolejka); }while(wybor!=4); return 0; } Czy konieczne jest utworzenie malloc w funkcji pokaz? Jak wydrukować elementy? Czy ten wydruk jest poprawny, czy można go przedstawić w prostszy sposób
4 cze 13:28
Mariusz: Funkcji malloc używasz gdy rezerwujesz pamięć na węzeł czyli w funkcji push Piszesz kolejkę czy stos ? Jeśli kolejkę to elementy wstawiasz na koniec a usuwasz z początku Jeśli stos to elementy wstawiasz na początek i usuwasz także z początku Pisząc kolejkę rozważ wprowadzenie dodatkowego wskaźnika na ogon a przyspieszysz w ten sposób wstawianie elementów Jeśli chodzi o kolejkę priorytetową to powinieneś najpierw poznać takie struktury danych jak drzewo binarne czy kopiec Wypisywanie elementów ? To nie jest tak że na stosie i kolejce masz dostęp tylko do jednego elementu i musisz go zdjąć aby dostać się do następnych ?
4 cze 13:52
Informatyka: Ja chciałem wypisać elementy od head do tail. Owszem, aby dostać się do kolejnych elementów w stosie czy kolejce, trzeba ściągnąć początek, ale można stworzyć funkcję, która wyświetla każdy element począwszy od head, a skończywszy na tail.
4 cze 14:04
Informatyka: void pokaz(struct FIFO* kolejka) { if(kolejka−>p==NULL) { printf("Brak elementow w kolejce!"); } else{ if(kolejka−>p==kolejka−>k) { printf("Jest jeden element w kolejce %d",kolejka−>p−>data); } else { struct elFIFO* el=(struct elFIFO*)malloc(sizeof(struct elFIFO)); el=kolejka−>p; while(el) { printf("%d, ",el−>data); el=el−>nast; } } } } Napisałem taką funkcję, ale nie mam dostępu do jej wszystkich elementów.
4 cze 14:07
Informatyka: No dobra, źle to zrozumiałem, w stosie i kolejce mamy dostęp jedynie do jednego elementu.. Nie mamy dostępu do wszystkich elementów.
4 cze 14:15
Mariusz: W funkcji pop zwalniasz pamięć na węzeł tylko gdy kolejka−>p!=kolejka−>k struct FIFO* push(struct FIFO* kolejka,int x) { struct elFIFO* newel=(struct elFIFO*)malloc(sizeof(struct elFIFO)); newel−>data=x; newel−>nast=NULL; if(kolejka−>p==NULL) { kolejka−>p=newel; kolejka−>k=newel; } else { newel−>nast=kolejka−>p; kolejka−>p=newel; // Jesteś pewny że dwie powyższe linijki będą działać ? //Sprobuj tego kolejka−>k−>nast =newel kolejka−>k = newel } printf("\nDodano: %d\n",kolejka−>p−>data); }; Jako typ zwracany dałeś struct FIFO* a nigdzie go nie zwracasz Może wystarczyłoby dać typ void ?
4 cze 14:18
Mariusz: Nie potrzebujesz rezerwować pamięci dla iteratora w funkcji przeglądającej kolejkę
4 cze 14:27
Informatyka: Czy wypisywanie kolejki powinien być następujący: void pokaz(struct FIFO* kolejka) { if(kolejka−>p==NULL) { printf("Brak elementow w kolejce!"); } else { struct elFIFO* el; el=kolejka−>p; printf("%d, ",el−>data); } } Mamy tu dostęp do elementów będących tylko na wierzchu.
4 cze 14:37
Informatyka: Dałem na void, ponieważ niczego nie zwracam w funkcji push.
4 cze 14:38
Mariusz: newel−>nast=kolejka−>p; kolejka−>p=newel; Te dwie linijki są dla stosu Ty potrzebujesz następujących linijek kolejka−>k−>nast =newel kolejka−>k = newel W funkcji pop zwalniasz pamięć w złym miejscu
4 cze 15:21
Informatyka: Wydaje mi się, ze wszystko jest dobrze w funkcji pop.
4 cze 15:36
Informatyka: if(kolejka−>p==kolejka−>k) { printf("Usunieto element: %d",kolejka−>p−>data); free(kolejka−>p); free(kolejka−>k); kolejka−>p=NULL; kolejka−>k=NULL }
4 cze 15:43
Mariusz: uses crt; type TData=integer; PNode = TNode; TNode = record key: TData; next: PNode end; TList = record first: PNode; last: PNode end; procedure initialize(var L:TList); begin L.first := NIL; L.last := NIL end; function isEmpty(L:TList):boolean; begin isEmpty := L.first = NIL end; procedure pushFront(var L: TList;w: TData); var p: PNode; begin new(p); p.key := w; p.next := NIL; if(L.first = NIL)then begin L.first := p; L.last := p end else begin p.next := L.first; L.first := p end; end; procedure pushBack(var L: TList;w: TData); var p: PNode; begin new(p); p.key := w; p.next := NIL; if(L.first = NIL) then begin L.first := p; L.last := p end else begin L.last.next := p; L.last := p end end; procedure popFront(var L: TList); var p: PNode; begin if L.first <> NIL then begin p := L.first; if L.first = L.last then L.last := NIL; L.first := p.next; dispose(p); end; end; procedure printNodes(L: TList); var p: PNode; counter:longint; begin p := L.first; counter := 0; while p <> NIL do begin write(p.key,' −> '); p := p.next; counter := counter + 1; end; writeln('NIL'); writeln('Liczba elementow listy :',counter); end; var k,n,m:integer; L: TList; esc:char; begin clrscr; initialize(L); repeat for k:= 1 to 20 do pushFront(L,k); for k:= 21 to 40 do pushBack(L,k); printNodes(L); while not isEmpty(L)do popFront(L); esc := readkey; until esc = #27; end. Tutaj masz stos i kolejkę w Pascalu Spróbuj przepisać na C
5 cze 00:19