Ошибка времени выполнения C в реализации графа

Я пытаюсь реализовать график, который будет иметь целочисленное значение в качестве данных. Здесь проблема, по-видимому, заключается в том, что программа не может манипулировать указателем ptr в функции insertNode и, следовательно, не выполняет оператор ptr->connectsTo=pointer[j];. Я храню узлы в массиве указателей на узлы *. Затем каждый узел указывает на список ссылок, который содержит ребра, которые, в свою очередь, содержат ссылку на узел, к которому этот узел подключен. Это манипуляция списками смежности. Я много пробовал. Пожалуйста, помогите. Также объясните, почему происходит такое поведение? Эта реализация связана с 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");
        }
    }
}

person Rishabh Shah    schedule 02.12.2014    source источник
comment
Скомпилировать со всеми предупреждениями и отладочной информацией (gcc -Wall -Wextra -g). Узнайте, как использовать отладчик (gdb)   -  person Basile Starynkevitch    schedule 02.12.2014


Ответы (1)


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

в insertNode() в момент, когда вы вызываете это:

ptr->connectsTo=pointer[j];

ptr всегда будет NULL из-за цикла непосредственно перед этим, который не завершится, пока ptr не станет NULL:

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

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

while(ptr->next !=NULL)
person dethorpe    schedule 02.12.2014
comment
Да, я понял, что вы пытаетесь сказать, поэтому я выясняю, как это решить. Я дам вам знать как можно скорее :) - person Rishabh Shah; 02.12.2014
comment
Да, ты был прав. Это была ошибка. Большое спасибо :) - person Rishabh Shah; 03.12.2014