Проблема реализации динамического массива внутри динамической структуры

Необходимо было сделать очередь с помощью структуры.

#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 шт):

Автор решения: avp

Выдалось свободное время, решил немного размяться.

В общем, я бы подобную задачку с очередью фиксированного размера решал вот так:

#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 для очереди.

Если что-то не понятно, спрашивайте в комментариях.

→ Ссылка