Cześć! Próbuję zaimplementować dynamicznie kolejkę FIFO w C++.
Oto kod źródłowy:
using namespace std;
struct node {
int data;
node *next;
};
struct queue {
int size;
node *head;
node *tail;
node *tmp;
};
void initialize(queue &q) {
q.size = 0;
q.head = NULL;
q.tail = NULL;
}
bool empty(queue &q) {
if (q.size == 0) return true;
else return false;
}
void push(queue &q, int d) {
node* nd = new node;
nd -> data = d;
if (q.head == NULL) {
q.tail -> next = NULL;
q.tail -> data = d;
q.head = q.tail;
q.size++;
} else {
q.tail -> next = NULL;
q.tail -> data = d;
q.size++;
}
}
void pop(queue &q) {
if (q.head == NULL) {
cout << "Kolejka jest pusta!";
} else if (q.tail == q.head) {
delete q.head;
q.head = q.tail = NULL;
q.size--;
} else {
q.tmp = q.head -> next;
delete q.head;
q.tmp = q.head;
q.size--;
}
}
int first(queue &q) {
return q.head -> data;
}
int size(queue &q) {
return q.size;
}
int main() {
queue Q = *new queue;
initialize(Q);
push(Q, 1);
push(Q, 3);
push(Q, 6);
push(Q, 8);
push(Q, 2);
first(Q);
size(Q);
return 0;
}```
Kompilator w linii 32 wskazuje na błąd krytyczny "Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)"
Pomoże ktoś początkującemu koledze? :)
Z góry dzięki!
alagnerclose
czycleanup
? A co do ukrywania dostępu do wewnętrznych zmiennych w C robi się to przez konwencję - po prostu nie dotykasz pól struktur nigdzie indziej poza funkcjami obsługującymi daną strukturę. Trochę mniejsza ochrona, ale ostatecznie kod tak samo prosty.alagnerDla ... cout zamiast printf?
No to akurat jest taka rzecz, którą lubię bardziej w C. W sensie, jak piszę coś w C++, to akurat używam klas, RAII i prywatnego dostępu z C++, zarządzania pamięcią też zdecydowanie z C++, ale printf z C - po prostu formatowanie cout mnie odrzuca :D Niemniej zgoda, że ta kolejka aż się prosi o klasę z konstruktorem i destruktorem. Trochę chciałem się podroczyć, bo ostatnio za często widuję argumentację typu "bo tak się robi i już" :Dalagner