2016-04-03 12 views
-1

Dieser Code dient zum Erstellen eines Graphen mit Adjazenzliste.
node ist die Struktur für die horizontale verknüpfte Liste für jedes Element der vertikalen verknüpften Liste,
, während graphnode die Struktur für die vertikale verknüpfte Liste ist.Warum erhalte ich in meinem Code einen Segmentierungsfehler (Core Dumped)?

Der Code wird richtig kompiliert, aber wenn die erste Eingabe gegeben wird, zeigt es Segmentierungsfehler danach.

#include<iostream> 
using namespace std; 
struct node  //struct 
{ 
    struct node *next; 
    char value; 
}; 
struct graphnode 
{ 
    struct node *start; 
    struct graphnode *down; 
    char value; 
    int count; 
}; 
graphnode * creategraphnode(char val) 
{ 
    struct graphnode *newnode=new graphnode; 
    newnode->start=NULL; 
    newnode->down=NULL; 
    newnode->value=val; 
    newnode->count=0; 
    return newnode; 
} 
node *createnode(char val) 
{ 
    struct node *newnode=new node; 
    newnode->next=NULL; 
    newnode->value=val; 
} 
void insertgraphnode(char value,graphnode *graph) 
{ 
    struct graphnode *newnode=creategraphnode(value); 
    if(graph==NULL) 
    { 
     graph=newnode; 
    } 
    else 
    { 
     graphnode *temp=graph; 
     while(temp->down) 
      temp=temp->down; 
     temp->down=newnode; 
    } 
} 
void insertnode(graphnode *graph) 
{ 
    char val; 
    struct node *temp=graph->start; 
    cout<<"What is the outdegree of "<<graph->value; 
    cin>>graph->count; 
    cout<<"\nEnter"<<graph->count<<" nodes separated by space:"; 
    for(int i=1;i<=graph->count;i++) 
    { 
     cin>>val; 
     node* newnode=createnode(val); 
     temp=newnode; 
     temp=temp->next; 
    } 
} 
void display(struct graphnode *graph) 
{ 
    if(graph==NULL) 
    { 
     cout<<"\nNo data to display"; 
     return; 
    } 
    struct graphnode *temp=graph; 
    while(temp) 
    { 
     struct node *temp1=temp->start; 
     cout<<temp->value<<"=>> "; 
     if(temp1==NULL) 
     { 
      continue; 
     } 
     else 
     { 
      while(temp1) 
      { 
       cout<<temp1->value<<"-> "; 
       temp1=temp1->next; 
      } 
     } 
     cout<<"/\n"; 
    } 
} 
int main() 
{ 
    struct graphnode *graph=NULL; 
    int totalnodes; 
    char val; 
    cout<<"\nHow many nodes does the graph contain? : "; 
    cin>>totalnodes; 
    cout<<"\nEnter "<<totalnodes<<" space separated nodes : "; 
    for(int i=1;i<=totalnodes;i++) 
    { 
     cin>>val; 
     insertgraphnode(val,graph); 
    } 
    struct graphnode *temp=graph; 
    while(temp->down) 
    { 
     insertnode(temp); 
     temp=temp->down; 
    } 
    display(graph); 
    return 0; 
} 
+0

Gibt es ein Plugin, das automatisch Frage auf SO erstellt, wenn ap Programm zerbricht? – Slava

+0

'struct node * temp = graph-> start;' ist ein Problem, wenn der erste Knoten eingefügt wird. Zu dieser Zeit ist "graph" "NULL". –

+0

Ich werde nicht die Funktion insertnode() aufrufen, wenn ich vorher die Funktion insertgraphnode() benutzt habe –

Antwort

0

Wenn ich nicht falsch liege, hat Ihr Code mindestens drei Probleme.

1) Ihre createnode() geben den erstellten Knoten nicht zurück; add return newnode;

2) Ihre insertgraphnode() nicht den zweiten Parameter in der aufrufenden Funktion ändern; also, wenn Sie es in main() anrufen

insertgraphnode (val, Grafik);

ist NULL; Innerhalb insertgraphnode() ändern Sie den Wert, aber außerhalb der Funktion bleiben NULL; je. Dies verursacht den Segmentierungsfehler.

Sie können diese Änderung insertgraphnode() lösen, so der zweite Parameter ist ein Zeiger auf Zeiger und &graph übergeben.

Eine andere Lösung ist insertgraphnode() ändern zurückzukehren, um den Wert

graphnode * insertgraphnode(char value,graphnode *graph) 
{ 
    struct graphnode *newnode=creategraphnode(value); 
    if(graph==NULL) 
    { 
     graph=newnode; 
    } 
    else 
    { 
     graphnode *temp=graph; 
     while(temp->down) 
      temp=temp->down; 
     temp->down=newnode; 
    } 
    return graph; 
} 

und es auf diese Weise ruft

graph = insertgraphnode(val,graph); 

3) die while in display() in Schleife geht, weil man das nicht ändern Wert von temp

Verwandte Themen