Fila dentro de fila em C

Bom galera,tenho que criar uma fila dinâmica dentro de outra fila dinâmica em C,porém a primeira fila é composta por índices de acordo com o número digitado pelo usuário.Por exemplo 5: a fila terá valores 0-1-2-3-4.Isso eu consegui.

O exercício pede que depois disso o usuário ao inserir o valor de um índice possa inserir qualquer valor.Por exemplo índice 2 valores 7 e 4.A fila ficaria assim:
0-1-2-3-4
-----7-----
-----4-----
Como posso fazer isso?? Pensei em criar outro struct mas estou em duvida

#include <stdio.h>
#include <malloc.h>

typedef struct dados{
	int val;
	struct dados *prox;
}fila;
fila *novo,*inicio,*fim;

main(){
	inicio=NULL;
	int i,n;
	printf("\nDigite quantos indices quer armazenar:");
	scanf("%d",&n);
	
	for(i=0;i<n;i++){
		novo=(fila*)malloc(sizeof(fila));
		novo->val=i;
		novo->prox=NULL; 	
			if(inicio==NULL){
				inicio=fim=novo;
			}else{
				fim->prox=novo;
				fim=novo; 
			}
	}
	printf("\n\tFila preenchida");
	

}

É só criar um ponteiro para ponteiros do tipo fila que você criou. Fiz um esboço aqui para te ajudar. O programa está funcionando estaticamente, você precisa entender como funcionam as funções e torna-lo dinâmico para que o usuário possa interagir.

#include <stdio.h>
#include <stdlib.h>

struct node {
  int value;
  struct node* next;
};

struct node* create_node(int value) {
  struct node* new_node = malloc(sizeof(struct node*));
  new_node->value = value;
  new_node->next = 0x0;
  return new_node;
}

void print_lists(struct node** lists, size_t size) {
  for (int i = 0; i < size; i++) {
    fprintf(stdout, "%d -> ", i);
    struct node* head = lists[i];
    while (head) {
      fprintf(stdout, "%d ", head->value);
      head = head->next;
    }
    fprintf(stdout, "\n");
  }
}

void insert_value(struct node** lists, size_t index, int value) {
  struct node* head = lists[index];
  struct node* new_node = create_node(value);
  if (!head) {
    lists[index] = new_node;
  } else {
    while (head->next) {
      head = head->next;
    }
    head->next = new_node;
  }
}

int main(int argc, char** argv) {
  size_t index_size;
  index_size = 5;
  struct node** lists = calloc(index_size, sizeof(struct node*));
  insert_value(lists, 2, 7);
  insert_value(lists, 2, 4);
  print_lists(lists, index_size);
}
1 curtida