Проблема со вставкой в ​​список смежности - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь вставить узлы в неориентированный граф, при первой же вставке код работает очень хорошо, но во второй раз код больше не работает, и я не понимаю, почему.Может кто-нибудь помочь мне с этой проблемой?

Я уже пытался скомпилировать в Dev-c ++, и иногда код запускается, а другие нет, но в CodeBlocks и CMD (Windows) просто не работает.

Вот мой код:

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

typedef struct tedge {
    int vdest; //destiny vertex
    double weight;
    struct tedge* next;
}TypeEdge;

typedef TypeEdge* TypePointer;

typedef struct {
    TypePointer* listAdj;
    int numVertex;
    int numEdges;
}TypeGraph;

//initialize the graph
bool initializeGraph(int nv, TypeGraph* graph) {
    if(nv <= 0) return false;

    int i;

    if(graph->listAdj = (TypePointer*)malloc(nv*sizeof(TypePointer))) {

        graph->numEdges = 0;
        graph->numVertex = nv;

        for(i = 0; i < nv; i++)
            graph->listAdj[i] = NULL;

        return true;
    }

    return false;
}


//insertion
bool insertEdge(int v1, int v2, double weight, TypeGraph *graph) {
    if(!graph) return false;
    if((v1 < 0) || (v1 >= graph->numVertex)) return false;
    if((v2 < 0) || (v2 >= graph->numVertex)) return false;

    TypePointer new = (TypePointer)malloc(sizeof(TypePointer));
    new->vdest = v2;
    new->weight = weight;
    new->next = graph->listAdj[v1];
    graph->listAdj[v1] = new;

    TypePointer simetry = (TypePointer)malloc(sizeof(TypePointer));
    simetry->vdest = v1;
    simetry->weight = weight;
    simetry->next = graph->listAdj[v2];
    graph->listAdj[v2] = simetry;

    graph->numEdges++;

    return true;
}

void printGraph(TypeGraph* graph) {
    int i;

    for(i = 0; i < graph->numVertex; i++) {
        TypePointer actual = graph->listAdj[i];
        printf("v %i: ", i);

        while(actual != NULL) {
            printf("(adj %i, weight %g); ", actual->vdest, actual->weight);
            actual = actual->next;
        }

        printf("\n");
    }
}

int main() {
    TypeGraph graph;


    initializeGraph(9, &graph);

    insertEdge(0, 1, 8, &graph);
    insertEdge(0, 3, 4, &graph);
    insertEdge(0, 6, 11, &graph);
    insertEdge(1, 2, 7, &graph);
    insertEdge(1, 4, 2, &graph);
    insertEdge(1, 8, 4, &graph);
    insertEdge(2, 5, 9, &graph);
    insertEdge(2, 8, 14, &graph);
    insertEdge(3, 6, 8, &graph);
    insertEdge(4, 6, 7, &graph);
    insertEdge(5, 8, 10, &graph);
    insertEdge(6, 7, 1, &graph);
    insertEdge(7, 8, 2, &graph);

    printGraph(&graph);

    return 0;
}

Если кто-то может помочь мне с этим, я принимаю любое предложение.Спасибо.

1 Ответ

1 голос
/ 29 марта 2019

См. Опасность в typedef указателей с

TypePointer new = (TypePointer)malloc(sizeof(TypePointer));
new->vdest = v2;
new->weight = weight;
new->next = graph->listAdj[v1];

, который только выделяет достаточно памяти для указателя. Я бы предложил

TypePointer new = malloc(sizeof(*new));

Также здесь

TypePointer simetry = (TypePointer)malloc(sizeof(TypePointer));

, который должен быть

TypePointer simetry = malloc(sizeof(*simetry));

Сделав эти исправления, программа сообщает:

v 0: (adj 6, weight 11); (adj 3, weight 4); (adj 1, weight 8);
v 1: (adj 8, weight 4); (adj 4, weight 2); (adj 2, weight 7); (adj 0, weight 8);
v 2: (adj 8, weight 14); (adj 5, weight 9); (adj 1, weight 7);
v 3: (adj 6, weight 8); (adj 0, weight 4);
v 4: (adj 6, weight 7); (adj 1, weight 2);
v 5: (adj 8, weight 10); (adj 2, weight 9);
v 6: (adj 7, weight 1); (adj 4, weight 7); (adj 3, weight 8); (adj 0, weight 11);
v 7: (adj 8, weight 2); (adj 6, weight 1);
v 8: (adj 7, weight 2); (adj 5, weight 10); (adj 2, weight 14); (adj 1, weight 4);

Я также заметил, что функции возвращают состояние, которое игнорируется, хотя это не способствовало сбою здесь.

...