목록자료구조 (12)
헬창 개발자
설계도 오른쪽 회전의 알고리즘 루트 노드 n에서 불균형이 발견된다면, n.left를 x로 선언하고 n.left를 x.right로 만들어줘 연결을 끊는다. x.right에 n을 연결해줘 서브트리로 갱신한다. 왼쪽 회전은 방향만 바꿔주면 된다. 코드 class Node: def __init__(self, key, height, left=None, right=None): self.key = key self.height = height self.left = left self.right = right class AVL: def __init__(self): self.root = None def height(self, n): if n == None: return 0 return n.height def put(self..
브릿지란 단절선, 절단선을 의미하며 그래프가 2개로 나눠지는 간선을 의미한다. 다음과 같은 그래프가 있다. 이 그래프에 단절선은 어떻게 찾을까?? 우리가 필요한 자료구조는 순회 체크 리스트, 현재 정점, 부모 정점, 브리지를 담을 리스트, 우회로 변수, (a, b) = (본인 순번, 주변 최소 순번)이다. 이제 알고리즘을 살펴보자 요약은 다음과 같다. # 자식 노드에서 부모 노드로 역으로는 검사 불가 (a, b)=(순번, 주변 최소 순번)를 비교하여 탐색하고 자식 노드의 b가 부모 노드의 a와 같으면 다른 노드를 통해 부모로 갈 수 있기 때문에 우회로가 있다고 판단하여 브리지가 아니게 되고 자식 노드의 b가 부모 노드의 a 보다 크면 우회로가 없기 때문에 브리지라고 판단한다. 정점 1에서 탐색을 시작한다..
설계도 a 테이블은 밸류값이 들어가 있고 각 값들을 이스크 코드값으로 변환시켜 키값을 만든다. 만든 키값에 테이블 사이즈만큼 나눠줘 진짜 키값을 만들어준다. 이제 키값과 밸류값으로 해시 함수를 통해 테이블에 넣기만 하면 된다. 코드 table_size=13 # 태이블 사이즈 class hash: # 해시 함수 def fx(self, num): self.key = self.find_key(num) self.re_key = [] for i in self.key: self.re_key.append(i % 12) return self.re_key # 이중 해싱 함수 def fx2(self, key): self.re_key = key % 5 return self.re_key #선형 조사법 def hash_lp_a..
import random maxsize=5 # 큐 사이즈 class que: class customer: # 고객 정보 def __init__(self, ids, arrival_time, service_time): self.id = ids self.arrival_time = arrival_time self.service_time = service_time def __init__(self): self.front = 0 self.rear = 0 self.data=[None]*maxsize def isempty(self): return self.front == self.rear def isfull(self): return self.front == (self.rear+1)%maxsize def enque(sel..
설계도 코드 class stack: def __init__(self): self.data= [] #스택 생성 self.cnt =0 def push(self,data): # 삽입 함수 self.data.append(data) self.cnt += 1 def isempty(self): # 공백 체크 return len(self.data)==0 def pop(self): # 삭제 함수 if not self.isempty(): self.cnt -= 1 return self.data.pop() def size(self): return len(self.data) def postfix(self, a): # 후위표기식 변경 self.temp = '' # 후위표기식 저장 for i in a: if i.isdigit():..
설계도 코드 #include #include #include #define MAX_NAME 20 // name 사이즈 정의 #define MAX_NUMBER 40 // number 사이즈 정의 typedef struct list { // 정보 저장 구조체 char name[MAX_NAME]; //이름 char number[MAX_NUMBER]; //전화번호 }list; typedef struct tree { // 노드 구조체 list key; //정보 저장 구조체 struct tree* left; // 링크 struct tree* right; // 링크 }tree; void insert(tree** root, list data) { // 삽입 함수 tree* p = NULL; //부모 노드 tree* t..
설계도 코드 #include #define MAX 5 // 배열의 범위 정의 typedef struct que { // 구조체 정의 int front; // 큐의 첫 요소의 앞을 가리킴 int rear; // 큐의 마지막 요소를 가리킴 int data[MAX]; // 큐 }que; int is_full(que *fx) { // 큐가 가득 찼는지 검사하는 함수 if ((fx->rear+1)%MAX == fx->front) return 1; // front+1의 값과 rear의 값이 같으면 가득참 else 0; } int is_empty(que* fx) { // 큐가 비어있는지 검사하는 함수 if (fx->front == fx->rear) return 1; // front의 값과 rear의 값이 같으면 비어..
#include #include #define TRUE 1 #define FALSE 0 #define MAX_VERTICES 50 typedef struct GraphType { int n;// 정점의 개수 int adj_mat[MAX_VERTICES][MAX_VERTICES]; } GraphType; int visited[MAX_VERTICES]; // 그래프 초기화 void init(GraphType* g) { int r, c; g->n = 0; for (r = 0; rn) + 1) > MAX_VERTICES) { fprintf(stderr, "그래프: 정점의 개수 초과"); return; } g->n++; } // 간선 삽입 연산 void insert_edge(GraphType* g, int sta..
#include #define MAX 100 typedef struct stacktype { // 스택 구조체 정의 char stack[MAX]; int top; }stacktype; void init(stacktype* s) { // 스택 초기화 함수 s->top = -1; } int is_full(stacktype* s) { // 스택 포화 검사 함수 return (s->top == MAX - 1); } int is_empty(stacktype* s) { // 스택 공백 검사 함수 return (s->top == -1); } char pop(stacktype* s) { // 스택 팝 함수 char out; // 입력 받을 변수 out = s->stack[(s->top)--]; // 스택에 상단에 있는..
#include typedef struct NodeList { //노드 리스트 구조체 struct NodeList* Llink; // L링크: 이전 노드를 가리킴 struct NodeList* Rlink; // R링크: 다음 노드를 가리킴 int data; // 데이터 }Node; void reverseprint(Node* head) { //노드 역출력 함수 Node* search;// 헤드가 가리키는 링크를 검색노드에 대입 -> 마지막 노드를 가리키는 것이다. printf("데이터 정상 출력\n"); for (search= head->Llink; search!=head ; search = search->Llink)// Llink를 타면서 정상방향으로 노드를 탐색한다. { printf("%d\n", se..