Проблема реализации динамического массива внутри динамической структуры
Необходимо было сделать очередь с помощью структуры.
#include <stdio.h>
#include <locale>
#include <stdlib.h>
#include <malloc.h>
typedef struct que_str {
int* queued;
int size, head, tail;
} queue;
В данном случае использовал int* queued для очереди. Далее в функции main выделил память под динамическую структуру.
queue* main_init = (queue*)malloc(sizeof(queue));
После инициализировал переменные внутри данной структуры.
main_init->size = max;
main_init->head = 0;
main_init->tail = 0;
main_init->queued = (int*)malloc(max * sizeof(int));
На этом моменте возникает проблема с правильной инициализацией массива queued. На примере следующей функции push:
void push(queue* top, int elem, int over) {
if (top->head + 1 == over) {
if (top->head + 1 == top->tail) {
printf("\nОчередь переполнена!");
}
else {
top->head = 0;
top->queued[top->head] = elem;
};
}
else {
if (top->head + 1 == top->tail) {
printf("\nОчередь переполнена!");
}
else {
top->queued[top->head] = elem;
top->head += 1;
};
};
};
При первом срабатывании функции top->queued успешно получает первое значение. Однако при второй и последующем срабатывании массив никак не изменяется, все также остается 1 элемент. Все другие переменные работают нормально. Без понятия как решить, помогите пожалуйста.
Ответы (1 шт):
Выдалось свободное время, решил немного размяться.
В общем, я бы подобную задачку с очередью фиксированного размера решал вот так:
#include <stdio.h>
#include <stdlib.h>
struct queue {
int *q;
int mx, sz, head;
};
int
q_push (struct queue *q, int v)
{
if (q->sz == q->mx)
return 0;
q->q[(q->head + q->sz) % q->mx] = v;
q->sz++;
return 1;
}
int
q_pop (struct queue *q, int *r)
{
if (!q->sz)
return 0;
*r = q->q[q->head];
q->sz--;
q->head = (q->head + 1) % q->mx;
return 1;
}
int
main (int ac, char *av)
{
struct queue q = {.q = malloc(10 * sizeof(int)), .mx = 10, .sz = 0, .head = 0};
char s[1000];
while (fgets(s, 1000, stdin)) {
int v = 0;
if (s[0] == 't') {
sscanf(s + 1, "%d", &v);
if (q_push(&q, v) == 0)
puts("Queue full");
else
printf("push %d\n", v);
} else {
if (q_pop(&q, &v))
printf("pop %d\n", v);
else
puts("Queue empty");
}
printf("mx = %d n = %d head = %d\n", q.mx, q.sz, q.head);
}
return puts("End") == EOF;
}
В main очень простой код тестрования пары функций push/pop для очереди.
Если что-то не понятно, спрашивайте в комментариях.