http://blog.naver.com/simtwolove/30022216350
자료구조가 무엇인지는 본 블로그의 "자료구조알고리즘" 항목의
 
첫번째 글에 자료구조에 대한 설명이 대략 있음을 알린다.
 
 
Part5 큐 - 연결리스트로 구현한 큐
--------------------------------------
이 강의를 펴기전에, 배열로 구현한 큐, 원형큐 의 강의가 블로그에 있음을 알린다.
 
큐 - 연결리스트로 구현한 큐를 말 그래도 연결리스트로 구현한 큐
 
또는 링크드 큐. (linked queue)라고 부른다.
 
배열로 큐를 만들었을 때엔 불편한 점이 몇가지 있다.
 
당연히! 데이터 크기 문제이다.
 
즉, 배열의 크기보다 더 많은 양의 정보가 삽입 될 수 없다는 점(overflow)이 가장 큰 단점이다.
 
이러한 점을 고치기 위해 최대 크기를 잘 고려하여서 충분한 크기로 배열을 할당해야 할 필요가 있다.
 
또는 큐를 원형큐 로 구현하는 방법이 있었다.
 
또한 배열로 구현한 큐는 연속적인 메모리 공간을 차지하기 때문에, 삽입 및 삭제가 번거로웠다.
 
그래서 배열대신 연결리스트로 큐를 구현하면 이런 불편함을 해결할 수 있다.
 
먼저 소스를 보인다.
 
//시작--------------------이 줄은 소스에 포함되지 않습니다.
 
·미리보기 | 소스복사·
  1. #include<stdio.h>   
  2. #include<malloc.h>   
  3. struct aa   
  4. {   
  5.  int data;   
  6.  struct aa *ptr;   
  7. };   
  8. struct aa *head, *tail;   
  9. void put(int x)   
  10. {   
  11.  struct aa *New, *temp;   
  12.  temp = head;   
  13.  New = (struct aa *)malloc(sizeof(struct aa));   
  14.  New->data = x;   
  15.  while( temp->ptr != tail ) temp = temp->ptr;   
  16.  New->ptr = tail;   
  17.     temp->ptr = New;   
  18. }   
  19. void init_queue()   
  20. {   
  21.  head = (struct aa *)malloc(sizeof(struct aa));   
  22.  tail = (struct aa *)malloc(sizeof(struct aa));   
  23.  head->ptr = tail;   
  24. }   
  25. void print_queue()   
  26. {   
  27.  struct aa *Now;   
  28.  for (Now=head->ptr;Now!=tail;Now=Now->ptr)   
  29.  {   
  30.   printf("%dt",Now->data);   
  31.     }   
  32.  printf("n");   
  33. }   
  34. void get()   
  35. {   
  36.     struct aa *del;   
  37.  if(head->ptr == tail)   
  38.  {   
  39.   printf("queue underflown");   
  40.   return;   
  41.  }   
  42.  del = head->ptr;   
  43.  head->ptr = del->ptr;   
  44.  free(del);   
  45. }   
  46. void main()   
  47. {   
  48.  init_queue();   
  49.  put(1);   
  50.  put(2);   
  51.  put(3);   
  52.  print_queue();   
  53.  get();   
  54.  get();   
  55.  print_queue();   
  56.  get();   
  57.  get();   
  58. }  
 
//끝--------------------이 줄은 소스에 포함되지 않습니다.
-- 실행결과 --
1 2 3
3
queue underflow
------------
 
자, 소스를 분석해보자.
 
1. init_queue()
init_queue는 링크드리스트에서 필수인 head와 tail 을 할당했고,
 
head는 tail을 가리키게 했다.
 
2. put(int x)
put은 연결리스트를 구현했을 때와 마찬가지로
 
메모리를 하나 할당하고, 그 안에 데이터 x를 넣으며,
 
tail의 바로 전 곳 까지 가다가 그 곳에 도착하게 되서야 할당한 메모리를 그 곳에 잇는다
(tail의 바로전 노드는 할당한 노드를 메모리를 가리키고, 할당한 메모리는 tail을 가리킨다)
 
3. get()
get함수는 head의 바로 뒤 의 노드를 삭제한다.
 
head가 tail을 가리킬때, 즉, head와 tail이외의 노드가 없을 때 언더플로우 메세지를 띄운다.
 
head의 바로 뒤 노드를 del이라 임시 지칭했으며 head는 del의 바로 뒤 노드를 가리키며,
 
del을 free(할당 헤제) 한다.
 
4. print_queue()
현재 큐의 내용을 출력한다.
 
--------------------
배열로 구현한 큐와 마찬가지로 언더플로우는 있지만,
 
연결리스트로 구현한 큐는 오버플로우(더이상 자료를 입력할 수 없는 상태)가 없다는 것이 큰 특징이다.
 
하지만, 어쩌면 이것이 때론 더 위험할 수 있다.
 
프로그램에 논리적인 에러가 있을 경우 시스템의 전 메모리를 다 까먹을 때까지 할당을 해 댈 것이므로 차라리 오버플로우가 발생하는 것이 더 나을지도 모른다.
 
사실 큐를 사용하는 실제 예도 무한대의 큐를 요구하지는 않기 때문에 때로는 오버플로우가 필요하기도 하다.
 
또다른 큰 장점으론, 삽입, 삭제가 번거롭지 않다는 점이며, 다만 속도가 조금 느려지긴 했다.
 
연결 리스트는 데이터를 삽입할 때 노드를 동적으로 할당해서 뒤에 덧붙일 수 있으므로 이론적으로 메모리 한계까지 큐의 크기를 늘릴 수 있다.
 
따라서 큐가 가득차는 오버플로우가 발생하지 않으며 처음부터 큐의 크기를 미리 정할 필요도 없다.
 
또한 노드가 메모리의 임의 위치에 생성되었다가도 언제든지 파괴될 수 있으므로 원형으로 만들지 않아도 상관없다.
 
위의 소스의 구조는 아래 그림과 같다.

이것은 필자가 생각한 가장 이상적인 연결리스트로 구현한 큐 이기 때문에,
 
자기의 생각과 이 소스의 구조가 다를 수 있는 것은 당연한 것이다.
 
------------------------
written by 호근
20420 선린 인터넷 고등학교

번호 제목 글쓴이 날짜 조회 수
공지 Software Development Trend (with Java) 황제낙엽 2024.01.19 2912
154 페이스북에서 알게된 AI의 현주소 황제낙엽 2026.05.22 116
153 MIT License 의 AI Coding Agent - Opencode 황제낙엽 2026.01.23 176
152 개발자를 위한 바이브 코딩 추천 툴 7가지 황제낙엽 2025.12.07 192
151 현재 유행하는 AI 들을 이용하는 방법 황제낙엽 2025.01.31 1136
150 SAP GUI AI Agent를 생성했습니다. 황제낙엽 2025.01.12 592
149 프로그래밍에서 polling 의 의미 황제낙엽 2025.01.05 459
148 [Gemini] server 에서 client 의 function call 를 위한 방안과 특징 황제낙엽 2025.01.03 418
147 Gretty 와 Jetty 에 대하여 황제낙엽 2024.11.01 602
146 naver(네이버) developers에서 제공하는 OAuth REST API 관련 링크 황제낙엽 2023.12.31 452
145 (bing) 소프트웨어의 일반적인 버전 관리 규칙 황제낙엽 2023.10.24 456
144 kakao(카카오) developers에서 제공하는 OAuth REST API 관련 링크 황제낙엽 2023.10.22 506
143 식품(상품) 바코드를 조회하여 제품 정보 획득하기 file 황제낙엽 2023.08.07 1454
142 식약처(식품의약품안전처) 공공데이터 API 황제낙엽 2023.08.07 652
141 서비스 이용약관과 개인정보 처리방침 황제낙엽 2023.07.15 446
140 프로젝트 운영 관리 소프트웨어로 100% 자동화된 '데브옵스(DevOps)' 구축하기 (LG CNS) secret 황제낙엽 2023.07.12 65
139 개발자이기 전에 노동자로써의 삶에 대한 고찰 (지극히 개인적인 사설) 황제낙엽 2023.02.28 472
138 [SDC22 키노트 요약정리] 더 쉽게, 끊김 없이 매끄럽게! ‘캄 테크’ 향해 진화하는 미래의 집 황제낙엽 2022.12.24 501
137 변수 네이밍 표기법 종류 file 황제낙엽 2022.11.30 478
136 이미지에서 텍스트를 추출하는 OCR 방법들 file 황제낙엽 2022.09.23 565
135 지수(과학적 표기법, "E") 서식 지정자 (2) 황제낙엽 2021.07.06 495