2016-04-03 54 views
-1

このコードは、adjacency-listを使用してグラフを作成するためのコードです。
nodeは、垂直リンクリストの各要素の水平リンクリストの構造体で、
です。一方、graphnodeは、垂直リンクリストの構造体です。私のコードでセグメンテーションフォルト(コアダンプ)エラーが発生するのはなぜですか?

コードは正しくコンパイルされていますが、最初の入力が与えられると、コードの後に​​セグメンテーションフォールトが表示されます。

#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

apが自動的に質問を作成するプラグインはありますか?君はおろす? – Slava

+0

'struct node * temp = graph-> start;'は、最初のノードが挿入されたときの問題です。その時、 'graph'は' NULL'です。 –

+0

私は関数insertgraphnode()を使わない限り、関数insertnode()を呼び出さない –

答えて

0

私が間違っていない場合、コードには少なくとも3つの問題があります。

1)createnode()は作成したノードを返しません。 add return newnode;

2)insertgraphnode()は、呼び出し元関数の2番目のパラメータを変更しません。だから、あなたがそれを呼び出すときmain()

insertgraphnode(val、graph);

NULLです。 insertgraphnode()の内部で値を変更しますが、機能の外にはのままです。NULL;これまでこれにより、セグメンテーションフォルトが発生します。

insertgraphnode()を変更して、2番目のパラメータがポインタへのポインタで、&graphを渡すようにすることができます。

別の解決策は)値

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; 
} 

graph = insertgraphnode(val,graph); 

3この方法でそれを呼び出すを返すようにinsertgraphnode()を変更しているあなたは変更されませんのでdisplay()whileは、ループに入ります値がtemp

関連する問題