Kolejka - wydruk
Informatyka: #include <stdio.h>
#include <stdlib.h>
struct el
FIFO
{
struct el
FIFO* nast;
int data;
};
struct FIFO
{
struct el
FIFO* p;
struct el
FIFO* k;
int x;
};
struct FIFO* push(struct FIFO* kolejka,int x)
{
struct el
FIFO* new
el=(struct el
FIFO*)malloc(sizeof(struct el
FIFO));
new
el−>data=x;
new
el−>nast=NULL;
if(kolejka−>p==NULL)
{
kolejka−>p=new
el;
kolejka−>k=new
el;
}
else
{
new
el−>nast=kolejka−>p;
kolejka−>p=new
el;
}
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 el
FIFO* el=(struct el
FIFO*)malloc(sizeof(struct el
FIFO));
el=kolejka−>p;
while(el)
{
printf("%d, ",el−>data);
el=el−>nast;
}
}
}
}
struct FIFO* pop(struct FIFO* kolejka)
{
struct el
FIFO* 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