c
1#ifndef ADJ_LIST 2#define ADJ_LIST 3 4/* 隣接リスト (adjacency list) */ 5typedef struct edge { 6 int destination; 7 struct edge* next; 8} edge; 9 10typedef struct { 11 int n; // ノード数 12 edge **edge_lists; // 辺リスト 13} adj_list; 14 15/* 頂点数nの隣接リストを作成する */ 16adj_list* adj_list_create(int n); 17 18/* 頂点aと頂点bとを結ぶ無向辺を追加する */ 19void adj_list_add_undirected_edge(adj_list* list, int a, int b); 20 21/* 隣接リストを解放する */ 22void adj_list_free(adj_list* list); 23 24/* 隣接リストを表示する */ 25void adj_list_print(adj_list* list); 26 27#endif
c
1#include <stdlib.h> 2#include <stdio.h> 3#include "adj_list.h" 4 5/* 頂点数nの隣接リストを作成する */ 6adj_list* adj_list_create(int n) { 7 int i; 8 9 adj_list* list = (adj_list*)malloc(sizeof(adj_list)); 10 list->n = n; 11 list->edge_lists = (edge**)malloc(sizeof(edge*)*n); 12 for(i=0; i<n; i++) { 13 list->edge_lists[i] = NULL; 14 } 15 return list; 16} 17 18/* 頂点aと頂点bとを結ぶ無向辺を追加する */ 19void adj_list_add_undirected_edge(adj_list* list, int a, int b) { 20 // TODO この関数を実装する 21 edge* p; 22 p->next = list->edge_list[a]; 23 list -> edge_lists[a] = p; 24 p->destination = b; 25 26 27} 28 29/* 隣接リストを解放する */ 30void adj_list_free(adj_list* list) { 31 int i; 32 33 for(i=0; i<list->n; i++) { 34 edge* p = list->edge_lists[i]; 35 while(p != NULL) { 36 edge* next = p->next; 37 free(p); 38 p = next; 39 } 40 } 41 free(list->edge_lists); 42 free(list); 43} 44 45/* 隣接リストを表示する */ 46void adj_list_print(adj_list* list) { 47 int i; 48 for(i=0; i<list->n; i++) { 49 edge* p = list->edge_lists[i]; 50 printf("%2d:", i); 51 while(p != NULL) { 52 edge* next = p->next; 53 printf(" %d", p->destination); 54 p = next; 55 } 56 printf("\n"); 57 } 58}
こちらのプログラムを実行すると下記のようなエラーが出てきます。調べてみるとこのエラーには原因になりうる理由がいくつか存在し、はっきりした原因がわからなかったので教えてください。
txt
1Undefined symbols for architecture x86_64: 2 "_adj_list_add_undirected_edge", referenced from: 3 _main in print_list-cd19c2.o 4 "_adj_list_create", referenced from: 5 _main in print_list-cd19c2.o 6 "_adj_list_print", referenced from: 7 _main in print_list-cd19c2.o 8ld: symbol(s) not found for architecture x86_64 9clang: error: linker command failed with exit code 1 (use -v to see invocation)
開発環境は、macでVScodeを使用しています。
実行を行っているディレクトリにはadj_list.h、adj_list.c、adj_list.oがあります。
どういう環境で、コンパイルはどうしたのでしょうか? main()を含むファイルの提示がありませんが、どうなっているのでしょう?
エラーとしては、単に、該当する関数(の実体)が無いといってるので、単なるリンク時のエラーみたいですが。(リンクファイルの指定ミス)
言葉の使い方が色々間違っているので誤解があるようですが、
・「clang: error: linker command failed」→と出ているのでコンパイルはできています。リンクのエラーです。
・「こちらのプログラムを実行すると」→リンクのエラーでプログラム、実行ファイルは出来上がっていないので、プログラムは実行できていません。コンパイル~リンクまでのビルド(の実行)がエラーで終わっているということです。
どのような開発環境、手順で作業をされているのか、詳細を質問文中に示しましょう。
p->next = list->edge_list[a];
edge_list は edge_lists の間違いなので、コンパイルエラーになります。
エラーメッセージに対応したソースを提示してください。
あなたの回答
tips
プレビュー