EulerianPath Algorithm.

Any questions do not hesitate to contact.

/**
 * Author: Dean Zhu
 * Date: 2018-11-15
 * License: CC0
 * Description: Same as Eulerian Cycle but with any end vertex.
 * Time: O(E)
 * Status:
 */

struct Edge;
typedef list<Edge>::iterator iter; 
struct Edge 
{        
	int next_vertex;        
	iter reverse_edge;
    Edge(int next_vertex) :next_vertex(next_vertex) { } 
};

const int max_vertices = ; 
int num_vertices; 
list<Edge> adj[max_vertices]; // adjacency list
vector<int> path; 

void find_path(int v) 
{        
	while(adj[v].size() > 0)        
	{                
		int vn = adj[v].front().next_vertex;
        adj[vn].erase(adj[v].front().reverse_edge);                
        adj[v].pop_front();                
        find_path(vn);        
    }        
    path.push_back(v); 
}

void add_edge(int a, int b) 
{        
	adj[a].push_front(Edge(b));        
	iter ita = adj[a].begin();        
	adj[b].push_front(Edge(a));        
	iter itb = adj[b].begin();        
	ita->reverse_edge = itb;        
	itb->reverse_edge = ita; 
}

Don't miss anything.

Keep in touch with Isaac Lozano Osorio!