2014-12-02 10 views
0

Я пытаюсь реализовать граф, который будет иметь целочисленное значение в качестве данных. Здесь проблема заключается в том, что программа не в состоянии манипулировать указателем ptr в funtion insertNode и, следовательно, не исключает оператор ptr-> connectsTo = pointer [j] ;. Я храню узлы в массиве указателей struct node *. Каждый узел затем указывает на список ссылок, который содержит ребра, которые, в свою очередь, содержат ссылку на узел, к которому подключен этот узел. Его манипулирование списками смежности. Я много пробовал. Пожалуйста, помогите. Также объясните, почему такое поведение происходит? Эта реализация относится к http://www.spoj.com/problems/BUGLIFE/.Ошибка выполнения во время выполнения графика

#include<stdio.h> 
#include<malloc.h> 
#include<ctype.h> 
#include<stdlib.h> 

struct node 
{ 
    int data; 
    int visited; 
    struct link_edges *edges; 
}; 

struct link_edges 
{ 
    struct node *connectsTo; 
    struct link_edges *next; 
}; 


struct node *head = NULL; 
struct node *pointer[2002]; 



void insertNode(int i,int j) 
{ 
    struct node *temp=NULL; 
    temp = (struct node *)malloc(sizeof(struct node)); 
    struct link_edges *ptr; 
    ptr = (struct link_edges *)malloc(sizeof(struct link_edges)); 
    struct node *tempo; 
    tempo = (struct node *)malloc(sizeof(struct node)); 
    //struct link_edges *temporary; 
    //temp = (struct link_edges *)malloc(sizeof(struct link_edges)); 

    if(pointer[i]==NULL) 
    { 
     temp->data=i; 
     temp->visited=-1; 
     temp->edges=NULL; 
     ptr=temp->edges; 
     pointer[i]=temp; 

    } 
    else 
    { 
     ptr = pointer[i]->edges; 
    } 
    while(ptr!=NULL) 
    { 
     ptr=ptr->next; 
    } 
    tempo->data=j; 
    tempo->edges=NULL; 
    tempo->visited=-1; 

    pointer[j]=tempo;//from this line onwards runtime error is originating. I am unable to print values beyond this line thats how i know the runtime error. 
    ptr->connectsTo=pointer[j]; 
    ptr->next=NULL; 
} 


int main() 
{ 
    int t,n,m,bugs[2002],a,b,flag,i; 
    int count; 
    scanf("%d",&t); 
    count = 0; 
    while(t--) 
    { 
     for(i=1;i<=2000;i++) 
     { 
      bugs[i] = 0; 
      pointer[i]=NULL; 
     } 
     flag=1; 
     scanf("%d %d", &n, &m); 
     while(m--) 
     { 
      scanf("%d %d", &a, &b); 
      if(bugs[a]==0&&bugs[b]==0) 
      { 
       insertNode(a,b); 
       bugs[a]=1; 
       bugs[b]=1; 
      } 
      else if(bugs[a]) 
      { 

      } 
      else if(bugs[b]==0) 
      { 

      } 
      else 
      { 

      } 
     } 
     if(flag==0){ 
      printf("Scenario %d:\n",++count); 
      printf("Suspicious bugs found!\n"); 
     } 
     else{ 
      printf("Scenario %d:\n",++count); 
      printf("No suspicious bugs found!\n"); 
     } 
    } 
} 
+0

Скомпилируйте все предупреждения и информацию об отладке ('gcc -Wall -Wextra -g'). Узнайте, как ** использовать отладчик ** ('gdb') –

ответ

1

Я думаю, что существует проблема с использованием переменной ptr.

в insertNode() в точке, которую вы называете это:

ptr->connectsTo=pointer[j]; 

PTR всегда будет NULL из-за петли непосредственно перед которой не будет выхода, пока PTR не NULL:

while(ptr!=NULL) 
    { 
     ptr=ptr->next; 
    } 

Таким образом, вы получите ошибку нулевого указателя времени выполнения. Не уверен, что вы пытаетесь сделать с этим циклом, но нужно переосмыслить его. Может быть, вы хотели использовать?

while(ptr->next !=NULL) 
+0

Да, у меня есть идея, что вы пытаетесь сказать, поэтому я выясняю, как ее решить. Я сообщу вам как можно скорее :) –

+0

Да, вы были правы. Это была ошибка. Большое спасибо :) –

Смежные вопросы