|
컴공과 대학생인데요.
그래프를 구현해서 깊이우선탐색 너비우선탐색 소스를 만들어서 실행했습니다.
그런데 실행하면 이런 메세지가 뜨더군요.
[Linker Error] Error: Unresolved external '_error' referenced from C:\DOCUMENTS AND SETTINGS\김진우\MY DOCUMENTS\BORLAND STUDIO PROJECTS\DEBUG_BUILD\UNIT1.OBJ
제가 볼때 마지막에 있는 bfs함수때문에 저런 메세지가 뜨는거 같은데 왜 뜨는지 알수가 없습니다. 비주얼c++은 안깔려있어서 아직 테스트를 못해봤네요.
왜 이런 에러가 뜨는지 알고싶습니다. 소스자체 문법은 별 문제 없는거 같은데요.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define NUM 8
#define MAX 10
typedef struct node node;
typedef node* nodeptr;
typedef int element;
typedef struct {
element queue[MAX];
int front, rear;
} QueueType;
struct node {
int vertex; // 정점 표현
nodeptr link;
};
typedef struct {
int v1;
int v2;
} edge;
int visited[NUM] = {0};
int start = 1;
int i;
int main()
{
nodeptr headers[NUM];
void createGraph(nodeptr headers[]);
void insertEdge(nodeptr headers[], edge e);
void printGraph(nodeptr headers[]);
void dfs(nodeptr headers[], int vertex);
void bfs(nodeptr headers[], int vertex);
createGraph(headers); // 그래프를 생성한다.
printGraph(headers);// 그래프를 출력한다.
printf("Graph traversal by depth first search\n");
dfs(headers, start); // 깊이 우선순서에 의해서
bfs(headers, start);
getch();
}
void createGraph(nodeptr headers[])
{
edge e;
void initGraph(nodeptr []);
edge createEdge(void);
void insertEdge(nodeptr[], edge);
int isMoreEdge(void);
initGraph(headers); // 그래프를 초기화한다.
// 그래프에 간선을 추가한다
while (isMoreEdge()) { // 추가할 간선이 존재하면,
e = createEdge(); // 간선을 생성하고,
insertEdge(headers, e); // 간선을 그래프에 추가한다.
}
}
int isMoreEdge()
{
char ans, dummy;
printf("\n");
printf("Do you want to insert a edge? (y/N): ");
ans = getchar();
dummy = getchar();
// 사용자가 y나 Y를 입력하면 1을 반환, 그렇지 않으면 0을 반환
if (ans == 'y' || ans == 'Y')
return 1;
else
return 0;
}
void initGraph(nodeptr headers[])
{
int i;
for (i=0; i<NUM; i++)
{
headers[i] = NULL;
}
}
edge createEdge()
{
int v1, v2;
char dummy;
edge e;
// 시작 정점을 읽어들인다
printf("\n");
printf("Enter a starting vertex: ");
scanf("%d", &v1);
// 끝 정점을 읽어들인다.
printf("Enter an ending vertex: ");
scanf("%d", &v2);
dummy = getchar();
// 간선을 생성한다.
e.v1 = v1;
e.v2 = v2;
return e;
}
void insertEdge(nodeptr headers[], edge e)
{
nodeptr tmp;
tmp = (nodeptr) malloc(sizeof(node)); // 노드 생성
tmp->vertex = e.v2;
tmp->link = headers[e.v1]; // 헤드 노드 앞에 삽입
headers[e.v1] = tmp;
}
void printGraph(nodeptr headers[])
{
nodeptr tmp;
int i;
for (i = 0;i < NUM; i++) { // 각 헤드 노드에 대해서
printf("Vertex %d:", i);
tmp = headers[i];
while (tmp != NULL) { // 정점에 인접된 각 노드에 대해서
printf("%d ", tmp->vertex);
tmp = tmp->link; // tmp를 다음 인접노드로 이동
}
printf("\n");
}
}
void dfs(nodeptr headers[], int i)
{
nodeptr tmp; //생성된 노드
printf("vertex %d\n", i);
visited[i] = 1;
for (tmp = headers[i]; tmp!= NULL; tmp = tmp->link)
if (visited[tmp->vertex] != 1)
dfs(headers, tmp->vertex);
}
// 공백 상태 검출 함수
int is_empty(QueueType *q)
{
return (q->front == q->rear);
}
// 포화 상태 검출 함수
int is_full(QueueType *q)
{
return ((q->rear+1)%MAX == q->front);
}
// 삽입 함수
void enqueue(QueueType *q, element item)
{
if( is_full(q) )
error("큐가 포화상태입니다");
q->rear = (q->rear+1) % MAX;
q->queue[q->rear] = item;
}
// 삭제 함수
element dequeue(QueueType *q)
{
if( is_empty(q) )
error("큐가 공백상태입니다");
q->front = (q->front+1) % MAX;
return q->queue[q->front];
}
// 삭제 함수
element peek(QueueType *q)
{
if( is_empty(q) )
error("큐가 공백상태입니다");
return q->queue[(q->front+1) % MAX];
}
void bfs(nodeptr headers[], int i)
{
nodeptr tmp; // 생성된 노드
QueueType q; // 너비우선탐색에 사용될 큐
initGraph(&q); // 큐 초기화
visited[i] = 1; // 정점 v 방문 표시
while(!is_empty(&q))
{
i = dequeue(&q); // 큐에 저장된 정점 선택
for(tmp = headers[i]; tmp; tmp = tmp->link)
{
if(!visited[tmp->vertex])
{ // 미방문 정점 탐색
visited[tmp->vertex] = 1; // 방문 표시
printf("%d ", tmp->vertex);
enqueue(&q, tmp->vertex); //정점을 큐에 삽입
}
}
} // 방문한 정점 출력 // 시작정점을 큐에 저장
}
|