연결리스트 큐

C/C자료구조 : 2007. 11. 9. 09:50

-배열로 구현된 큐에 비해 크기가 제한되지 않지만

코드가 더 복잡해지고 링크필드때문에 메모리 공간을 더 많이 사용한다.

- 기본적인 구조는 단순 연결 리스트에 2개의 포인터를 추가한 것과 같다.

- front - 연결리스트의 맨앞으로 삭제와 관련된다.

- rear - 연결리스트의 맨 뒤로 삽입과 관련된다.

- 공백의 경우 front와 rear는 NULL값.

- 큐의 각 요소는 (데이터+링크)로 이루어진 구조체로 정의된다.


#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>


typedef int element;
typedef struct QueueNode {
 element item;
 struct QueueNode *link;
} QueueNode;

typedef struct {
 QueueNode *front, *rear;    //큐노드를 가리킬 수 있는 front와 rear 포인터
} QueueType;


//에러처리

void error(char *message)
{
 fprintf(stderr, "%s\n", message);
 exit(1);
}


//초기화

void init(QueueType *q)
{
 q->front = q->rear =0;
}


//공백상태 검출
int is_empty(QueueType *q)
{
 return (q->front == NULL);
}
//포화상태 검출
int is_full(QueueType *q)
{
 return 0;
}


//삽입함수
void enqueue(QueueType *q, element item)
{
 QueueNode *temp = (QueueNode *)malloc(sizeof(QueueNode));
 if(temp == NULL) error("메모리를 할당 할 수 없습니다.");
 else {
  temp->item = item;
  temp->link = NULL;
  if(is_empty(q)) {
   q->front = temp;
   q->rear = temp;
  }
  else {
   q->rear->link = temp;
   q->rear = temp;
  }
 }
}


//삭제

element dequeue(QueueType *q)
{
 QueueNode *temp = q->front;                  //아리송...
 element item;

 if(is_empty(q)) error("큐가 비어있습니다.");
 else {
  item = temp->item;
  q->front = q->front->link;

  if(q->front == NULL) q->rear = NULL;
  free(temp);
  return item;
 }
}


//peek

element peek(QueueType *q)
{
 element item;
 if(is_empty(q)) error("큐가 비어있습니다.");
 else {
  item = q->front->item;
  return item;
 }
}


//main

void main()
{
 QueueType q;


 init(&q);              //초기화


 enqueue(&q, 1);
 enqueue(&q, 2);
 enqueue(&q, 3);


 printf("dequeue() = %d\n", dequeue(&q));
 printf("dequeue() = %d\n", dequeue(&q));
 printf("dequeue() = %d\n", dequeue(&q));
}


Posted by 청웨일