2016-07-28 22 views
-6

Ich habe Probleme beim Drucken von Vertices, wenn Adjacency Lists verwendet werden. Ich möchte nur die Anfangscheitelpunkte ohne die Nachbarn erhalten, aber ich bekomme stattdessen ihre Adressen. Also, ich habe ein Problem mit Zeigern. Im Moment verstehe ich nicht, warum die richtige Ausgabe nicht gedruckt wird. Mein Code ist:Adjazenzliste für Graphen in C

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
typedef struct ADI{ 
    int val; 
    struct ADI *urm; 
}ADI; 

ADI *adjancencyList(int vertex) 
{ 
    int neigh,i; 
    ADI *head, *elem, *vec; 
    head = (ADI*) malloc(sizeof(ADI)); 
    head->val = vertex; 
    elem = head; 
    printf("Input number of neighbours:"); 
    scanf("%d", &neigh); 
    for(i = 0; i < neigh ; i++) 
    { printf("Neighbour:"); 
     vec = (ADI*) malloc(sizeof(ADI)); 
     elem->urm = vec; 
     scanf("%d", &elem->val); 
    } 

    return head; 
} 
int main() 
{ int i, n, v; 
    printf("Input number of vertices "); 
    scanf("%d", &n); 
    ADI *A = (ADI*) malloc(n * sizeof(ADI)); 

    for(i = 0; i < n; i++) 
    { 
     printf("Input vertex name:"); 
     scanf(" %d ", &v); 
     A = adjancencyList(v); 
     A++; 
    } 

    A = &(A[0]); 

    for(i = 0; i < n; i++) 
    { 
    printf(" %d ", A->val ); 
    printf(" \n "); 
    A++; 
    } 
    return 0; 

} 
+2

Bitte geben Sie ein Beispiel für die Eingabe, die erwartete Ausgabe und der tatsächlichen Ausgabe. –

+1

@MichaelWalz: "Großartige Gedanken ..." –

+0

Beachten Sie, dass nachstehende Leerzeichen in 'scanf()' -Familienformatzeichenfolgen diabolisch sind, wenn die Eingabe jemals von einem Benutzer und nicht von einer Datei kommt. Das Grundproblem ist, dass die 'scanf()' Funktion nicht zurückkommt, bis sie auf etwas trifft, das nach der eigentlichen Eingabe kein Leerzeichen ist. –

Antwort

1

Ihr Programm verursacht Speicherverlust. Sie sollten ein Array von ADI*, nicht ein Array von ADI verwenden, um zu speichern, was von adjancencyList() zurückgegeben wird. Die Verwendung von Subskriptionen sieht in diesem Fall besser aus als inkrementiert. Ein weiterer Tipp ist, dass A = &(A[0]); praktisch nichts tut.

Beachten Sie auch, dass sie 10 sagen.

Try this:

int main(void) 
{ 
    int i, n, v; 
    printf("Input number of vertices "); 
    scanf("%d", &n); 
    ADI **A = malloc(n * sizeof(ADI*)); 

    for(i = 0; i < n; i++) 
    { 
     printf("Input vertex name:"); 
     scanf(" %d ", &v); 
     A[i] = adjancencyList(v); 
    } 

    for(i = 0; i < n; i++) 
    { 
     printf(" %d ", A[i]->val ); 
     printf(" \n "); 
    } 
    return 0; 

} 
+0

Danke für die Antwort! Von dem, was ich gelesen habe, erwartete ich die Verwendung von Doppelzeigern. Können Sie mir bitte erklären, warum das die richtige Form ist? Spreche ich nicht auf die erste Adresse meines Vektors? Außerdem habe ich A = & (A [0]) verwendet, also war ich nach dem Ende von for wieder an dieser ersten Adresse. –

+0

@AlexPostolache Diese Verwendung von 'A' in' main() 'ist korrekt (Ihre' adjacencyList() 'ist auch falsch, wie von @JonathanLeffler gezeigt), weil der Typ von' A' für den Typ von Elementen ('ADI * '). Ihr 'A' * war * pointinag bei dem, was über' malloc() 'zugewiesen wurde, aber es wird durch die Zuweisung' A = adjancencyList (v); 'überschrieben. 'A = & (A [0])' ist äquivalent zu 'A = & (* (A + 0)', was äquivalent zu 'A = & * A' ist, was äquivalent zu 'A = A' ist, was hat keine Mühe. – MikeCAT

Verwandte Themen