#include <algorithm>    // por si se llegara a necesitar
#include <iostream>

struct nodo {
   int valor;
   nodo* sig;
   nodo* ant;
};

void inserta(nodo*& ini, nodo*& ult, int v) {
   nodo* p = new nodo{ v, nullptr, ult };
   if (ini == nullptr) {
      ini = p;
   }
   if (ult != nullptr) {
      ult->sig = p;
   }
   ult = p;
}

// función de práctica aquí

int main( ) {
   std::cout << "Elija la cantidad de nodos: ";
   int n;
   std::cin >> n;

   nodo* ini = nullptr, *ult = nullptr;
   std::cout << "Ingrese los valores: ";
   for (int i = 0; i < n; ++i) {
      int valor;
      std::cin >> valor;
      inserta(ini, ult, valor);
   }

   std::cout << "Quiere que la lista enlazada sea circular? ";
   bool circular;
   std::cin >> circular;
   if (circular) {
      ini->ant = ult;
      ult->sig = ini;
   }

   // llamar a función de práctica aquí (si devolviera algo, imprimir lo que devolvió)
}
