Код не проверен, но вот набросок. Вы передаете индекс таблицы, а для функции вставки также индекс значения, которое вы хотите вставить. Для удаления значение помещается в стек Lua.
#define getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
void insert_at_head (lua_State *L, int tbl_idx, int val_idx) {
int e;
/* shift elements right to make room */
for (e = getn(L, tbl_idx) + 1; e > 1; e--) {
lua_rawgeti(L, tbl_idx, e-1);
lua_rawseti(L, tbl_idx, e);
}
lua_pushvalue(L, val_idx);
lua_rawseti(L, tbl_idx, 1);
}
void remove_from_head_and_push (lua_State *L, int tbl_idx) {
int e;
int n = getn(L, tbl_idx);
if (n == 0)
return luaL_error("removed from head of empty list");
lua_rawgeti(L, tbl_idx, 1); /* push first element */
/* shift elements left */
for (e = 2; e < n; e++)
lua_rawgeti(L, tbl_idx, e);
lua_rawseti(L, tbl_idx, e-1);
}
lua_pushnil(L, val_idx);
lua_rawseti(L, tbl_idx, n);
}