【问题标题】:Having trouble creating an adjacency list创建邻接列表时遇到问题
【发布时间】:2016-03-09 21:04:51
【问题描述】:

我正在尝试使用邻接列表来表示图形,但我目前正在努力解决它。由于某种原因,边缘被分配给错误的顶点,我不知道为什么。我逐步执行代码,前 3 个顶点对添加得很好,但由于某种原因,在第 4 天没有任何工作正常,我最终创建了多个新边,甚至它们的值都不正确。下面是一个示例输入以及 C 代码。有谁知道为什么会发生这种情况?请注意,

void print_distance(vertex*, int);
    int check_an_edge(edge*);
void free_head(vertex*); 

尚未实现但free_head用于释放整个列表

5 (2,3) (1,4) (1,3) (3,4) (4,5)
#include <stdio.h>
#include <stdlib.h>
#include "input_error.h"
#define VertexToSearch 1

typedef struct node {
    int value;
    struct node* nextedge;
} edge;

typedef struct node1 {
    int vertexnumber;
    int distance;
    struct node* edge;
} vertex;


vertex* load_file(char*);
void create_vertex_list(vertex*, int);
void create_new_edge(int, int, vertex*);
void print_distance(vertex*, int);
int check_an_edge(edge*);
void free_head(vertex*);
enum error program_error;

int main(int argc, char** argv) {
    vertex* array;
    array = load_file(argv[1]);
    free_head(array);
    return 0;
}

vertex* load_file(char* filename) {
    int count;
    int vertex1;
    int vertex2;
    FILE* file = fopen(filename, "r");

    if (file == NULL) {
        printf("%s did not open", filename);
        program_error = FILE_FAILED_TO_OPEN;
        exit(program_error);
    }

    fscanf(file, "%d", &count);
    vertex* head = malloc(sizeof(vertex)* count);
    create_vertex_list(head, count);
    for (int i = 0; i < count; i++) {
        fscanf(file, "\n(%d,%d)", &vertex1, &vertex2);
        create_new_edge(vertex1, vertex2, head);
    }
    fclose(file);
    return head;
}

void create_vertex_list(vertex head[], int count) {
    vertex *new_node;
    for (int i = 0; i < count; i++) {
        new_node = malloc(sizeof (vertex));
        new_node->vertexnumber = i + 1;
        new_node->edge = NULL;
        new_node->distance = -1;

        *(head +i)= *new_node;
    }
}

void create_new_edge(int vertex1, int vertex2, vertex* head) {
    edge* new = malloc(sizeof (edge));
    edge* new1 = malloc(sizeof (edge));
    new->value = vertex1;
    new1->value = vertex2;
    new->nextedge = NULL;
    new->nextedge = NULL;
    if ((head +vertex1 - 1)->edge == NULL) {
        (head +vertex1 - 1)->edge  = new1;
    } else {
        edge* temp = (head +vertex1 - 1)->edge;
        while (temp != NULL) {
            if (temp->nextedge == NULL) {
                temp->nextedge = new1;
                break;
            } else {
                temp = temp->nextedge;
            }
        }
    }
    if ((head +vertex2 - 1)->edge  == NULL) {
        (head +vertex2 - 1)->edge  = new;
    } else {
        edge* temp = (head +vertex2 - 1)->edge ;
        while (temp != NULL) {
            if (temp->nextedge == NULL) {
                temp->nextedge = new1;
                break;
            } else {
                temp = temp->nextedge;
            }
        }
    }
}

【问题讨论】:

    标签: c adjacency-list


    【解决方案1】:

    在第二个if 语句的create_new_edge 函数中,您尝试添加new1。我认为这是一个复制粘贴错误,您应该将其更改为new

    if ((head +vertex2 - 1)->edge  == NULL) {
        (head +vertex2 - 1)->edge  = new;
    } else {
        edge* temp = (head +vertex2 - 1)->edge ;
        while (temp != NULL) {
            if (temp->nextedge == NULL) {
                temp->nextedge = new1; // Change here new1 to new
                break;
            } else {
                 emp = temp->nextedge;
            }
        }
    }
    

    【讨论】:

    • 是的,我在看到这个答案之前就注意到了,感谢您的敏锐眼光!它通常总是简单的东西! :)
    • @BrandonTomblinson 最好将这些代码片段放在单独的函数中,以避免代码重复和复制粘贴错误。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2020-10-21
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    相关资源
    最近更新 更多