Exercício de Fila Circular

Boa noite. Estou tendo conteúdo sobre filas circulares. Já fui atrás de vários exemplos, pois a professora acabou deixando só um exemplo. Estou programando em C, no Code Blocks. Gostaria de uma luz, como faço para começar este exercício abaixo:
“Crie um programa que gerencie uma fila de tarefas a serem cumpridas. As tarefas são compostas de três strings que contém uma ação a ser executada, a data e local. O usuário pode escolher entre inserir uma nova tarefa, somente verificar a próxima tarefa que ele deve cumprir ou verificar e marcar a tarefa como cumprida.”

Se puderem ajudar, agradeceria demais :wink:

Qual a sua dificuldade em específico? “Como faço pra começar” é muito vago. Você pesquisou ao menos a definição de lista circular?

Veja por exemplo: https://www.programiz.com/dsa/circular-queue

Abraço.

Sim sim, tô pesquisando bastante exemplos, por enquanto tô declarando em struct as variáveis. Meu problema estar em pedir esses dados no programa

consegui escrever isso de código, porém não estou conseguindo pedir opções no começo, para saber se quer inserir tarefa e afim.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 2

struct tarefa {
char acao[50];
char data[50];
char local[50];
};

// Variaveis declaradas aqui são visiveis por todas as funções
//int fila[MAX];
struct tarefa fila[MAX];
int inicio = 0;
int fim = 0;
int fila_cheia = 0;

int consistirFilaCheia() {
//indices de armazenamento e recuperação iguais, quando maiores do que zero indicam fila cheia.
if ((fim > 0) && (fim == inicio)) {
fila_cheia = 1;
return 1;
}

// indica que foram inseridos MAX elementos e não ocorreu nenhuma remoção, o que indica fila cheia. 
if ((fim == MAX) && inicio == 0) {
    fila_cheia = 1;
    return 1;
}

return 0;

}

int consistirTarefaFila(int indice) {
if (indice < inicio || indice > fim) {
return 0;
}

return 1;

}

//Insere um item no final da fila
int armazena(struct tarefa t1) {
printf(“Item a ser inserido na fila: %s\n”, t1.acao);

// Houve uma remoção e o fim deve ir para 0
if ((fim == MAX) && (inicio > 0)) {
    fim = 0;
    fila_cheia = 1;
}

fila[fim] = t1; 
fim++;

printf("Inserção OK.\n");
return 0;

}

//Remove um item da fila (o primeiro que entrou)
int remover() {
//Se inicio = 0 e fim = 0, a fila está vazia. Ou ainda, se foram inseridos 4 elementos (por exemplo) e removidos 4 elementos, fim e inicio irão apontar para a posição 5, indicando que a fila está vazia.
if (((inicio == 0) && (inicio == fim)) || ((inicio == fim) && (fila_cheia == 0))){
printf(“Fila vazia.\n”);
return 0;
}

//Verifica se já foram removidos todos os elementos de fila[0] até fila[MAX-1]. Se isso já ocorreu, o próximo elemento a ser removido é o que está em fila[0].
if (inicio == MAX)
    inicio = 0;

inicio++;
return 0;

}

int main() {
struct tarefa t1;
struct tarefa t2;
struct tarefa t3;

strcpy(t1.acao, "Tarefa de casa");
strcpy(t1.data, "01/01/2017");
strcpy(t1.local, "Em casa");

strcpy(t2.acao, "Uma tarefa");
strcpy(t2.data, "01/02/2017");
strcpy(t3.local, "Na empresa");

strcpy(t3.acao, "Eu sou uma tarefa");
strcpy(t3.data, "01/03/2017");
strcpy(t3.local, "Na piscina");

if (consistirFilaCheia() == 1) {
    printf("Fila cheia\n");
} else {
    armazena(t1);
}

if (consistirFilaCheia() == 1) {
    printf("Fila cheia\n");
} else {
    armazena(t2);
}

// Consultar indice 1 (item 2 da fila)
int indice;
indice = 0;

if (consistirTarefaFila(indice) == 1) {
    printf("Tarefa encontrada: %s\n", fila[indice].acao);
} else {
    printf("Tarefa não encontrada\n");
}

if (consistirFilaCheia() == 1) {
    printf("Fila cheia \n");
} else {
    armazena(t3);
}

printf("Removendo tarefa: %d \n", indice);
remover();

if (consistirTarefaFila(indice) == 1) {
    printf("Tarefa encontrada: %s\n", fila[indice].acao);
} else {
    printf("Tarefa não encontrada\n");
}

}

Separe seu código em funções, cada um com uma tarefa específica. Por exemplo, seu main poderia ser assim:

struct tarefa{
    char[50] acao;
    char[50] data;
    char[50] local;
    int estaConcluida; // 0 para pendente, 1 para concluída
}; 

FilaCircular* filaDeTarefas;

int main(void){
  int opcao = 0;
  
  while opcao != -1 {
    // aqui você exibe as opções
    opcao = scanf();

   switch(opcao){
    case -1 : break; // sairá do loop e do programa
    case 0 : incluirTarefa();
    case 1 : verTarefa();
    case 2 : marcarComoConcluida();
   }
  }
}

void incluirTarefa(){
  // pede os dados, cria um struct e insere na fila 
  tarefa tar;

  tar.acao = "X";  // usa scanf para pegar a ação
  tar.data = "Y"; // usa scanf para pegar a data
  tar.local= "Z";  // usa scanf para pegar o local
  tar.estaConcluida = 0;

  adicionarNaFila(filaDeTarefas, tar);
}

void adicionarNaFila(FilaCircular& fila, tarefa tar){
  // adiciona a tarefa "tar" na fila circular "fila"
}

Obs: o código é só para explicar como poderia ser a estrutura. Ele não funciona.

Abraço.