allora premetto che io non conosco bene il c++ cmq in questo caso e' quasi uguale al codice in C.....
A occhi ho visto alcuni errori:
nella struct ls:
struct Ls{
string irq;
struct Ls *next;
}Lista;
poi per prima cosa devi allorare della memoria per la lista, cioe' di per se
primoel = prima;
non vuol dire nulla dato che sono entrambi puntatori a NULL....quindi devi allocare la memoria per le liste.....in C si usa una malloc in C++ c'e' new che e' piu' veloce....
e lo stesso devi fare ogni volta che crei un elemento della lista....il puntatore *next serve proprio a tener memoria dell'indirizzo dove si trova l'elemento della lista.
sempre a occhi il codice dovrebbe essere:
codice:
#include <iostream>
#include <string>
#include <cmath>

using namespace std;

struct Ls
{
    string irq;
   struct Ls *next;
};

typedef struct Ls NodoLista
typedef NodoLista * Lista


int main()
{
    Lista primoel, prima, seconda, terza;
    primoel = new NodoLista;
    prima = primoel;
    prima->irq = "9";
    prima->next = new NodoLista;
    seconda = prima->next;
    seconda->irq = "8";
    seconda->next = new NodoLista;
    terza = seconda->next;
    terza->irq = "7";  
    terza->next = NULL;
    // cerca 
    Lista cercare = primoel;
    const unsigned indicenodo = 2;
    for(unsigned i=0; i < indicenodo; i++)
    {
       cercare = cercare->next;    
    }
    cout << cercare->irq;
    return 0;
}
ho cercato di rimanere il piu' possibile vicino al tuo codice....puo' anche essere che abbia fatto qualche errore dato che non conosco bene il c++ ma il concetto e' questo.
Devi:
-allocare
-riempire i campi
-allocare un altro nodo nel puntatore next oppure metterlo a NULL x indicare la fine della lista.
Spero di essere stato chiaro....sulle lista cmq c'e' tantissimo altro da dire ci sono algoritmi per inserimenti in testa, in coda, inserimenti ordinati...cancellazione di elementi e molto altro....