본문 바로가기

Study

(15)
#15 비선형구조 - 그래프(graph) 그래프(graph)그래프(Graph)란 정점(Vertex)과 그 정점들을 연결하는 간선(Edge)으로 이루어진 비선형 자료구조이자 수학적 모델이다.객체들 간의 관계, 연결, 경로를 표현하기 위해 사용된다. 간단히 말해 정점과 간선의 집합이라 생각하면 된다. 정점 (vertex)노드라고 불리며 그래프를 형성하는 기본 단위.분할 할 수 없는 객체이자 점으로 표현되는 위치, 사람, 물건 등이 될 수 있다. 간선 (edge)정점을 잇는 선. 관계 경로 등이 될 수 있다.기차역과 기차경로를 그래프로 표현하면 아래와 같다. 기차역 (검정색동그라미)를 정점(Vertex) 경로 (빨간색 선)를 간선(Edge)라 한다. 방향그래프(Directed Graph)방향성 간선(Directed Edge = arc)을 갖은 그래..
#14 덱(Deque)의 이해와 구현 Dequedouble-ended queue를 줄여서 표현한 것.앞으로도 뒤로도 데이터를 넣을 수 있고, 앞으로도 뒤로도 데이터를 뺄수 있는 자료구조를 말한다. ADT* void DequeInit(Deque * pdeq);- 덱의 초기화를 진행한다.- 덱 생성 후 제일 먼저 호출되어야 하는 함수이다.* int DQIsEmpty(Deque * pdeq);- 덱이 빈 경우 TRUE(1)를, 그렇지 않은 경우 FALSE(0)을 반환한다.* void DQAddFirst(Deque * pdeq, Data data);- 덱의 머리에 데이터를 저장한다. data로 전달된 값을 저장한다.* void DQAddLast(Deque * pdeq, Data data);- 덱의 꼬리에 데이터를 저장한다. data로 전달된 값을 ..
#13 큐(Queue)를 응용한 예제(햄버거가게) ADT* 점심시간은 1시간이고 그 동안 고객은 15초에 1명씩 주문을 하는 것으로 간주한다.* 한 명의 고객은 하나의 버거만을 주문한다고 가정한다.* 주문하는 메뉴에는 가중치를 두지 않는다. 모든 고객은 무작위로 메뉴를 선택한다.* 햄버거를 만드는 사람은 1명이다. 그리고 동시에 둘 이상의 버거가 만들어지지 않는다.* 주문한 메뉴를 받을 다음 고객은 대기실에서 나와서 대기한다.* 고객이 주문하는 메뉴에 가중치를 두기 않기 위해서 다음 함수르 사용하기로 하겠다. int rant(void) //무직위 메뉴의 선택을 위해서 Main.c#include #include #include #include "CircularQueue.h"#define CUS_COME_TERM 15 // 고객의 주문 가격: 초 단위#..
#12 큐(Queue) 큐 자료구조의 ADT* void QueueInit(Queue * pq);- 큐의 초기화를 진행한다.- 큐 생성 후 제일 먼저 호출되어야 하는 함수이다.* int QIsEmpty(Queue * pq);- 큐가 빈 경우 TRUE(1)을, 그렇지 않은 경우 FALSE(0)을 반환한다.* void Enqueue(Queue * pq, Data data);- 큐에 데이터를 저장한다. 매개변수 data로 전달된 값을 저장한다.* Data Dequeue(Queue * pq);- 저장순서가 가장 앞선 데이터를 삭제한다.- 삭제된 데이터는 반환한다.- 본 함수의 호출을 위해서는 데이터가 하나 이상 존재함이 보장되어야 한다.* Data QPeek(Queue * pq);- 저장순서가 가장 앞선 데이터를 반환하되 삭제하지 않는..
#11 스택으로 계산기 만들기 전위연산으로 계산기 만들기중위연산을 전위연산으로 변경하기main.c#include #include "InfixToPostfit.h"int main(void){ char exp1[] = "1+2*3"; char exp2[] = "(1+2)*3"; char exp3[] = "((1-2)+3)*(5-2)"; ConvToRPNExp(exp1); ConvToRPNExp(exp2); ConvToRPNExp(exp3); printf("%s \n", exp1); printf("%s \n", exp2); printf("%s \n", exp3); return 0;}ListBaseStack.h#ifndef __LB_STACK_H__#define __LB_STACK_H__#define TRUE 1#define FALSE 0t..
#10 스택(Stack) 스택의 ADT* void StackInit(Stack* pstack); - 스택의 초기화를 진행한다. - 스택 생성 후 제일 먼저 호출되어야 하는 함수이다. * int SIsEmpty(Stack* pstack); - 스택이 빈 경우 TRUE(1)을, 그렇지 않은 경우 FALSE(0)를 반환한다. * void SPush(Stack* pstack, Data data); - 스택에 데이터를 저장한다. 매개변수 data로 전달된 값을 저장한다. * Data SPop(Stack* pstack); - 마지막에 저장된 요소를 삭제한다. - 삭제된 데이터는 반환이 된다. - 본 함수의 호출을 위해서는 데이터가 하나 이상 존재함이 보장되어야 한다. * Data SPeek(Stack* pstack); - 마지막에 저장된 ..
#09 자료구조 양방향연결리스트 양방향 연결리스트Main.h#include #include "DBLinkedList.h"int main(void){ // 양방향 연결 리스트의 생성 및 초기화 List list; int data; ListInit(&list); // 8개의 데이터 저장 LInsert(&list, 1); LInsert(&list, 2); LInsert(&list, 3); LInsert(&list, 4); LInsert(&list, 5); LInsert(&list, 6); LInsert(&list, 7); LInsert(&list, 8); // 저장된 데이터의 조회 if (LFirst(&list, &data)) { printf("%d ", data); // 오른쪽 노드로 이동하며 데이터 조회 while (LNext(&l..
#08 자료구조 원형연결리스트(Circular Linked List) 원형 연결 리스트 (Circular Linked List) Main.h#include #include "CLinkedList.h"int main(void){ // 원형 연결 리스트의 생성 및 초기화 List list; int data, i, nodeNum; ListInit(&list); // 리스트에 5개의 데이터를 저장 LInsert(&list, 3); LInsert(&list, 4); LInsert(&list, 5); LInsertFront(&list, 2); LInsertFront(&list, 1); // 리스트에 저장된 데이터를 연속 3회 출력 if (LFirst(&list, &data)) { printf("%d ", data); for (i = 0; i CLinkedList.h#ifndef..