[C언어 알고리즘] 6.1.4 순열 알고리즘 소스 코드
//common.h
#pragma once //헤더 파일을 한 번만 포함해서 컴파일
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>
#include <memory.h>
#include <time.h>
#pragma warning(disable:4996) //4996컴파일 경고 메시지 출력 해제
//Array.h
#pragma once
typedef void * Element;
typedef struct _Array Array;
struct _Array
{
Element *base;
int capacity;
int usage;
};
typedef Element *Iterator;
Array *New_Array();
void Delete_Array(Array *arr);
void Array_SetSize(Array *arr,int capacity,Element data);
void Array_PushBack(Array *arr,Element data);
void Array_Insert(Array *arr,Iterator pos,Element data);
void Array_SetAt(Array *arr,int index,Element data);
Element Array_GetAt(Array *arr,int index);
Iterator Array_Begin(Array *arr);
Iterator Array_End(Array *arr);
void Array_Erase(Array *arr,Iterator pos);
//Array.c
#include "Array.h"
#include <malloc.h>
#include <memory.h>
Array *New_Array()
{
Array *arr = 0;
arr = (Array *)malloc(sizeof(Array));
arr->base = 0;
arr->capacity = arr->usage = 0;
return arr;
}
void Delete_Array(Array *arr)
{
if(arr->base)
{
free(arr->base);
}
free(arr);
}
void Array_SetSize(Array *arr,int capacity,Element data)
{
arr->capacity = capacity;
arr->base = (Element *)realloc(arr->base,sizeof(Element)*arr->capacity);
for( ;arr->usage<arr->capacity; arr->usage++)
{
arr->base[arr->usage] = data;
}
}
void Array_PushBack(Array *arr,Element data)
{
Iterator at = Array_End(arr);
Array_Insert(arr,at,data);
}
void Array_Insert(Array *arr,Iterator pos,Element data)
{
int index = pos - arr->base;
int mcount = arr->usage - index;
if(arr->capacity == arr->usage)
{
if(arr->capacity)
{
arr->capacity*=2;
}
else
{
arr->capacity = 1;
}
arr->base = (Element *)realloc(arr->base,sizeof(Element)*arr->capacity);
}
memcpy(arr->base+index+1,arr->base+index,sizeof(Element)*mcount);
arr->base[index] = data;
arr->usage++;
}
void Array_SetAt(Array *arr,int index,Element data)
{
if((index>=0)&&(index<arr->usage))
{
arr->base[index] = data;
}
}
Element Array_GetAt(Array *arr,int index)
{
if((index>=0)&&(index<arr->usage))
{
return arr->base[index];
}
return 0;
}
Iterator Array_Begin(Array *arr)
{
return arr->base;
}
Iterator Array_End(Array *arr)
{
return arr->base+arr->usage;
}
void Array_Erase(Array *arr,Iterator pos)
{
int index = pos - arr->base;
int mcount = arr->usage - index -1;
memcpy(pos,pos+1,sizeof(Element)*mcount);
arr->usage--;
}
//LinkedList.h
#pragma once
typedef void * Element;
typedef struct _Node Node;
typedef Node *Link;
struct _Node
{
Link next;
Link prev;
Element data;
};
typedef struct _LinkedList LinkedList;
struct _LinkedList
{
Link head;
Link tail;
int usage;
};
LinkedList *New_LinkedList();
void Delete_LinkedList(LinkedList *linkedlist);
void LinkedList_PushBack(LinkedList *linkedlist,Element data);
void LinkedList_Insert(LinkedList *linkedlist,Link pos,Element data);
Link LinkedList_Begin(LinkedList *linkedlist);
Link LinkedList_End(LinkedList *linkedlist);
void LinkedList_Erase(LinkedList *linkedlist,Link pos);
////LinkedList.c
#include "LinkedList.h"
#include <malloc.h>
#include <memory.h>
Link New_Node(Element data)
{
Link link = (Link)malloc(sizeof(Node));
link->data = data;
link->next = link->prev = 0;
return link;
}
void HangNode(Link link,Link pos)
{
link->prev = pos->prev;
link->next = pos;
pos->prev->next = link;
pos->prev = link;
}
void DisconnectNode(Link pos)
{
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
}
LinkedList *New_LinkedList()
{
LinkedList *linkedlist = 0;
linkedlist = (LinkedList *)malloc(sizeof(LinkedList));
linkedlist->head = New_Node(0);
linkedlist->tail = New_Node(0);
linkedlist->head->next = linkedlist->tail;
linkedlist->tail->prev = linkedlist->head;
linkedlist->usage = 0;
return linkedlist;
}
void Delete_LinkedList(LinkedList *linkedlist)
{
Link seek = linkedlist->head;
while( seek != linkedlist->tail)
{
seek = seek->next;
free(seek->prev);
}
free(linkedlist->tail);
free(linkedlist);
}
void LinkedList_PushBack(LinkedList *linkedlist,Element data)
{
LinkedList_Insert(linkedlist,linkedlist->tail,data);
}
void LinkedList_Insert(LinkedList *linkedlist,Link pos,Element data)
{
Link link = New_Node(data);
HangNode(link,pos);
linkedlist->usage++;
}
Link LinkedList_Begin(LinkedList *linkedlist)
{
return linkedlist->head->next;
}
Link LinkedList_End(LinkedList *linkedlist)
{
return linkedlist->tail;
}
void LinkedList_Erase(LinkedList *linkedlist,Link pos)
{
DisconnectNode(pos);
linkedlist->usage--;
}
//EHStack.h
#pragma once
#include "LinkedList.h"
typedef LinkedList EHStack;
EHStack *New_EHStack();
void Delete_EHStack(EHStack *ehs);
void EHStack_Push(EHStack *ehs, Element data);
Element EHStack_Pop(EHStack *ehs);
int EHStack_IsEmpty(EHStack *ehs);
//EHStack.c
#include "EHStack.h"
#include <malloc.h>
#include <memory.h>
EHStack *New_EHStack()
{
return New_LinkedList();
}
void Delete_EHStack(EHStack *ehs)
{
Delete_LinkedList(ehs);
}
void EHStack_Push(EHStack *ehs, Element data)
{
LinkedList_PushBack(ehs,data);
}
Element EHStack_Pop(EHStack *ehs)
{
Element element = 0;
if( ! EHStack_IsEmpty(ehs))
{
Link last = LinkedList_End(ehs);
last = last->prev;
element = last->data;
LinkedList_Erase(ehs,last);
}
return element;
}
int EHStack_IsEmpty(EHStack *ehs)
{
return ehs->usage == 0;
}
//Heuristic.h
#pragma once
#include "Array.h"
typedef struct _Heuristic Heuristic;
struct _Heuristic
{
Array *ori_bucket;
Array *out_bucket;
};
Heuristic *MakeInitHeuristic(Array *bucket);
void DeleteHeuristic(Heuristic *now);
void FindNextHeuristics(Heuristic *now, Array *next_heus);
int GetOutCount(Heuristic *now);
void ViewHeuristic(Heuristic *now);
////Heuristic.c
#include "Heuristic.h"
#include <malloc.h>
#include <stdio.h>
Heuristic *MakeNextHeu(Heuristic *now,int ball)
{
Heuristic *heu = 0;
Iterator seek=0, end=0;
heu = (Heuristic *)malloc(sizeof(Heuristic));
heu->ori_bucket = New_Array();
heu->out_bucket = New_Array();
seek = Array_Begin(now->out_bucket);
end = Array_End(now->out_bucket);
for(seek = seek; seek != end; ++seek)
{
Array_PushBack(heu->out_bucket, *seek);
}
seek = Array_Begin(now->ori_bucket);
end = Array_End(now->ori_bucket);
for(seek = seek; seek != end; ++seek)
{
if((int)(*seek) == ball)
{
Array_PushBack(heu->out_bucket,*seek);
}
else
{
Array_PushBack(heu->ori_bucket,*seek);
}
}
return heu;
}
Heuristic *MakeInitHeuristic(Array *bucket)
{
Heuristic *heu = 0;
Iterator seek=0, end=0;
heu = (Heuristic *)malloc(sizeof(Heuristic));
heu->ori_bucket = New_Array();
heu->out_bucket = New_Array();
seek = Array_Begin(bucket);
end = Array_End(bucket);
for(seek = seek; seek != end; ++seek)
{
Array_PushBack(heu->ori_bucket, *seek);
}
return heu;
}
void DeleteHeuristic(Heuristic *now)
{
Delete_Array(now->ori_bucket);
Delete_Array(now->out_bucket);
free(now);
}
void FindNextHeuristics(Heuristic *now, Array *next_heus)
{
Iterator seek=0, end=0;
Heuristic *next = 0;
seek = Array_Begin(now->ori_bucket);
end = Array_End(now->ori_bucket);
for(seek = seek; seek != end; ++seek)
{
next = MakeNextHeu(now,(int)*seek);
Array_PushBack(next_heus,next);
}
}
int GetOutCount(Heuristic *now)
{
return now->out_bucket->usage;
}
void ViewHeuristic(Heuristic *now)
{
Iterator seek=0, end=0;
seek = Array_Begin(now->out_bucket);
end = Array_End(now->out_bucket);
for(seek = seek; seek != end; ++seek)
{
printf("%d ",(int)*seek);
}
printf("\n");
}
//Program.c
#include "EHStack.h"
#include "Heuristic.h"
Array * InitSimulation()
{
int ball = 0;
Array *bucket = 0;
bucket = New_Array();
for(ball = 0; ball<=9; ++ball)
{
Array_PushBack(bucket,(Element)ball);
}
return bucket;
}
int main()
{
EHStack *ehs = 0;
Heuristic *heu = 0;
Array *bucket = 0;
Array *next_heus = 0;
Iterator seek=0, end=0;
bucket = InitSimulation();
ehs = New_EHStack();
heu = MakeInitHeuristic(bucket);
EHStack_Push(ehs,heu);
while( ! EHStack_IsEmpty(ehs) )
{
heu = (Heuristic *)EHStack_Pop(ehs);
next_heus = New_Array();
FindNextHeuristics(heu,next_heus);
seek = Array_Begin(next_heus);
end = Array_End(next_heus);
for(seek=seek; seek != end; ++seek)
{
heu = (Heuristic *)(*seek);
if(GetOutCount(heu) == 3)
{
ViewHeuristic(heu);
DeleteHeuristic(heu);
}
else
{
EHStack_Push(ehs,heu);
}
}
Delete_Array(next_heus);
}
Delete_Array(bucket);
Delete_EHStack(ehs);
return 0;
}
'언어 자료구조 알고리즘 > 디딤돌 알고리즘 (C언어)' 카테고리의 다른 글
[C언어 알고리즘] 6.2.4 그래프 테스트 소스 코드 (0) | 2016.12.01 |
---|---|
[C언어 알고리즘] 6.2.3 그래프 테스트(DFS 알고리즘에 사용할 그래프) (0) | 2016.12.01 |
[C언어 알고리즘] 6.2.2 그래프 구현(DFS 알고리즘에 사용할 그래프) (0) | 2016.12.01 |
[C언어 알고리즘] 6.2.1 그래프 설계(DFS 알고리즘에 사용할 그래프) (0) | 2016.12.01 |
[C언어 알고리즘] 6.2 깊이우선탐색(DFS) 알고리즘 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1.3 순열 알고리즘 테스트 코드 작성 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1.2 순열 알고리즘의 경험 정보 구현 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1.1 순열 알고리즘의 경험(Heuristic)정보 설계 (0) | 2016.12.01 |
[C언어 알고리즘] 6.1 순열 알고리즘 (0) | 2016.12.01 |
[C언어 알고리즘] 6.동적 프로그래밍 (0) | 2016.12.01 |