lista następników w grafie

0

Witam, otóż napisałem sobie listę następników grafu skierowanego bez cykli (DAG). Problem pojawia się, gdy chce wyświetlić ją po raz drugi (ponownie użyć show_nlist(n)). Program zapętla sie w nieskończoność... Nie mam pojecia, gdzie leży błąd. Przed tworzeniem listy mam macierz NxN losowo wypełnioną 1/0 tak aby była DAG.

 
struct nlist{     // lista nastepnikow
    int value;
    nlist * next;
};nlist nlist_tab[N*1000]; //// N=20000


void make_nlist(int n){
    nlist * prev;
    int p=0;


    for (int i=0 ; i<n ; i++){
        nlist *x = new nlist;
        prev = x;
        x->value = i;
        x->next = NULL;


        for (int j=i ; j<n ; j++){
            if (tab[i][j]){
                nlist *y = new nlist;
                y->value = j;
                prev->next = y;
                prev = y;
                y->next = NULL;
            }
        }
        nlist_tab[p] = *x;
        p++;
    }
}

void show_nlist(int n){
    nlist *x = new nlist;
    for (int i=0 ; i<n ;i++){
        *x = nlist_tab[i];
        printf ("%2d ",1+x->value);
        while (x->next){
            x=x->next;
            printf ("-> %2d ",1+x->value);
        }
        printf ("\n");
    }
}
0

w końcu udało mi się samemu napisać sprawną wersje wyświetlania

void show_nlist(int n){
    for (int i=0 ; i<n ; i++){
        nlist *x;
        x = &nlist_tab[i];

        while (x){
            printf ("%2d -> ",1+x->value);
            x = x->next;
        }
        printf ("\n");
    }
}
0

Więc ta też będzie działać:

void show_nlist(int n)
  {
   for(int i=0;i<n;++i,printf ("\n")) for(nlist *x=nlist_tab+i;x;x=x->next) printf("%2d -> ",1+x->value);
  }

A może lepiej przerób to po ludzku:

struct nlist { int value; nlist *next; } *nlist_tab[N];
 
void make_nlist(int n)
  {
   for(int y=0;y<n;++y)
     {
      nlist *head=NULL;
      for(int x=n-1;x>=0;--x)
        {
         if(tab[y][x])
           {
            nlist *tmp=new nlist;
            tmp->next=head;
            tmp->value=x;
            head=tmp;
           }
        }
      nlist_tab[y]=head;
     }
  }
 
void show_nlist(int n)
  {
   for(int i=0;i<n;++i,printf ("\n")) for(nlist *x=nlist_tab[i];x;x=x->next) printf("%2d -> ",1+x->value);
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1