2016-03-09 38 views
0

我想用一個鄰接表來表示一個圖,但是我目前正在努力。由於某些原因,邊緣被分配到錯誤的頂點,我不知道爲什麼。我一步一步通過代碼,前3個頂點對添加得很好,但由於某種原因,4日沒有正常工作,我最終創建了多個新邊,甚至沒有它們的值是正確的。下面的示例輸入以及C代碼。任何人都知道爲什麼這可能會發生?需要注意的是在創建鄰接表時遇到問題

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

尚未實施,但語句來嘗試添加new1 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; 
      } 
     } 
    } 
} 

回答

0

在你create_new_edge功能在第二if。我認爲這是一個複製粘貼錯誤,你應該將其更改爲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; 
     } 
    } 
} 
+0

是的,我剛剛注意到,就在我看到這個答案之前,感謝敏銳的眼睛!它通常總是容易的東西! :) –

+0

@BrandonTomblinson將這些代碼片段放在單獨的函數中總是更好,以避免代碼重複和複製粘貼錯誤。祝你好運! –