Contenu connexe Similaire à 이산수학 C1 프로젝트 5 Similaire à 이산수학 C1 프로젝트 5 (20) 이산수학 C1 프로젝트 52. 순서
•조원별 업무분담
•일정 계획
•문제 파악
•알고리즘 계획
•소스구현
•문제점 파악 / 해결법 토의
•최종소스
3. 1)조원별 업무 분담
최종 보고서 작성 및 프로젝트 총괄
민영지
및 자료 조사
박구남 알고리즘 구상 및 소스 구현
정준용 알고리즘 구상 및 소스 구현
최고봉 알고리즘 구상 및 소스 구현
2)일정계획
과제에 대한 자료 조사 및 업무분담
05.14~05.16
일정 계획
프로젝트 알고리즘 구성 및 소스 구
05.16~05.21
현
05.21~05.23 최종 소스 확인 및 최종보고서 작성
5. 4)알고리즘 계획
노드의 개수를 입력 받은 후 그 개수만큼의 빈 Node를 만든
다. 입력받은 Edge의 값과 비교하여 indegree와 outdegree의
값을 증가시킨다. 출력하는 부분에서 indegree의 값이 0이면
Source, outdegree의 값이 0이면 Sink를 출력하고 끝낸다.
5)소스 구현
1차 소스
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char name;
struct Node *next;
struct Node *prev;
}Node;
typedef struct rst {
int indgree;
int outdgree;
}rst;
Node **graph;
void InitGraph(int n);
Node *AppendNode(Node *Target, Node *aNode);
int DeleteNode(Node *Target);
void UnInitGraph(int n);
6. void main() {
int n, i, j, x;
char name[3];
Node *Now, temp;
rst *result;
temp.name = 0; temp.next = NULL; temp.prev = NULL;
printf("노드의 개수를 입력해주세요.n");
scanf("%d",&n);
result = (rst *)malloc(n*sizeof(rst));
for( i = 0 ; i < n ; i++ ) {
result[i].indgree = 0;
result[i].outdgree = 0;
}
InitGraph(n);
printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0을
입력하세요.n");
while(1) {
scanf("%s",name);
if( name[0] == '0' ) break;
for( x = 0 ; x < n ; x++ ) {
Now = graph[x];
if( graph[x]->name == name[0] ) {
temp.name = name[1];
AppendNode(Now,&temp);
result[x].outdgree++;
break;
}
else if( graph[x]->next == NULL ) {
graph[x]->name = name[0];
temp.name = name[1];
AppendNode(Now,&temp);
result[x].outdgree++;
break;
}
}
}
for( i = 0, j = 0 ; ; j++ ) {
7. if( j >= n ) {
j = -1;
i++;
if( i >= n ) break;
continue;
}
Now = graph[j]->next;
while(1) {
if( Now == NULL )
break;
if( graph[i]->name == Now->name )
result[i].indgree++;
Now = Now->next;
}
}
for( i = 0 ; i < n ; i++ ) {
printf("%c %d %d ", graph[i]->name, result[i].indgree,
result[i].outdgree);
if( result[i].indgree == 0 )
printf("Source");
else if( result[i].outdgree == 0 )
printf("Sink");
printf("n");
}
free(result);
UnInitGraph(n);
printf("n계속하시려면 아무키나 누르세요....");
getch();
system("PAUSE");
}
void InitGraph(int n) {
int i;
graph = (Node **)malloc(n*sizeof(Node *));
for( i = 0 ; i < n ; i++ ) {
graph[i] = (Node *)malloc(sizeof(Node));
graph[i]->next = NULL;
graph[i]->prev = NULL;
}
8. }
Node *AppendNode(Node *Target, Node *aNode) {
Node *New;
Node *Right;
Node *tail;
New = (Node *)malloc(sizeof(Node));
for(tail=Target;tail->next;tail=tail->next);
*New = *aNode;
Right = tail->next;
New->next = Right;
New->prev = tail;
tail->next = New;
if (Right) {
Right->prev = New;
}
return New;
}
int DeleteNode(Node *Target) {
Node *Left, *Right;
if( Target == NULL )
return 0;
Left = Target->prev;
Right = Target->next;
Left->next = Right;
if (Right)
Right->prev = Left;
free(Target);
return 1;
}
void UnInitGraph(int n) {
int i;
for( i = 0 ; i < n ; i++ )
while(DeleteNode(graph[i]->next));
free(graph);
graph = NULL;
}
9. 1차 소스 문제점
- 입력하여 출력할 때 Sink가 되면 제대로 출력되지 않았다.
for( i = 0 ; i < n ; i++ ) {
printf("%c %d %d ", graph[i]->name, result[i].indgree,
result[i].outdgree);
if( result[i].indgree == 0 )
printf("Source");
else if( result[i].outdgree == 0 )
printf("Sink");
printf("n");
}
최종소스
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char name;
struct Node *next;
struct Node *prev;
}Node;
typedef struct rst {
int indgree;
int outdgree;
}rst;
Node **graph;
void InitGraph(int n);
Node *AppendNode(Node *Target, Node *aNode);
int DeleteNode(Node *Target);
void UnInitGraph(int n);
void main() {
int n, i, j, x;
char name[3];
10. Node *Now, temp;
rst *result;
temp.name = 0; temp.next = NULL; temp.prev = NULL;
printf("노드의 개수를 입력해주세요.n");
scanf("%d",&n);
result = (rst *)malloc(n*sizeof(rst));
for( i = 0 ; i < n ; i++ ) {
result[i].indgree = 0;
result[i].outdgree = 0;
}
InitGraph(n);
printf("Edge를 입력해주세요.(예, AB, BD)n입력을 끝내시려면 0 을
입력하세요.n");
while(1) {
scanf("%s",name);
if( name[0] == '0' ) break;
for( x = 0 ; x < n ; x++ ) {
Now = graph[x];
if( graph[x]->name == name[0] ) {
temp.name = name[1];
AppendNode(Now,&temp);
result[x].outdgree++;
break;
}
else if( graph[x]->next == NULL ) {
graph[x]->name = name[0];
temp.name = name[1];
AppendNode(Now,&temp);
result[x].outdgree++;
break;
}
}
for( x = 0 ; x < n ; x++ ) {
Now = graph[x];
if( graph[x]->name == name[1] ) {
break;
}
11. else if( graph[x]->next == NULL ) {
graph[x]->name = name[1];
temp.name = '0';
AppendNode(Now,&temp);
break;
}
}
}
for( i = 0, j = 0 ; ; j++ ) {
if( j >= n ) {
j = -1;
i++;
if( i >= n ) break;
continue;
}
Now = graph[j]->next;
while(1) {
if( Now == NULL )
break;
if( graph[i]->name == Now->name )
result[i].indgree++;
Now = Now->next;
}
}
for( i = 0 ; i < n ; i++ ) {
printf("%c %d %d
",graph[i]->name,result[i].indgree,result[i].outdgree);
if( result[i].indgree == 0 )
printf("Source ");
if( result[i].outdgree == 0 )
printf("Sinkn");
else
printf("n");
}
free(result);
UnInitGraph(n);
printf("n계속하시려면 아무키나 누르세요....");
getch();
}
12. void InitGraph(int n) {
int i;
graph = (Node **)malloc(n*sizeof(Node *));
for( i = 0 ; i < n ; i++ ) {
graph[i] = (Node *)malloc(sizeof(Node));
graph[i]->next = NULL;
graph[i]->prev = NULL;
}
}
Node *AppendNode(Node *Target, Node *aNode) {
Node *New;
Node *Right;
Node *tail;
New = (Node *)malloc(sizeof(Node));
for(tail=Target;tail->next;tail=tail->next);
*New = *aNode;
Right = tail->next;
New->next = Right;
New->prev = tail;
tail->next = New;
if (Right) {
Right->prev = New;
}
return New;
}
int DeleteNode(Node *Target) {
Node *Left, *Right;
if( Target == NULL )
return 0;
Left = Target->prev;
Right = Target->next;
Left->next = Right;
if (Right)
Right->prev = Left;
free(Target);
return 1;
13. }
void UnInitGraph(int n) {
int i;
for( i = 0 ; i < n ; i++ )
while(DeleteNode(graph[i]->next));
free(graph);
graph = NULL;
}
코딩결과