프로그래밍[Univ]/데이터구조

[큐] 연결리스트로 구현한 큐 6/8

Cloud Travel 2011. 6. 8. 11:15

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

typedef struct nodetype{
 int data;
 struct nodetype *next;
}node;

typedef struct Quetype{
 int count;
 node * rear; 
 node * front;
}Que;

//자료형태 구조체 및 Que구조체 생성
//배열 큐와의 차이점 : ⓐ최대 저장개수가 불필요 / ⓑ rear/front가 포인터로써 쓰임

Que *makeQue(){
 Que *returnQue;
 returnQue = (Que *)malloc(sizeof(Que));
 if ( returnQue != NULL ){
  returnQue -> count = 0;  // 현재저장된 개수 초기화
  returnQue -> rear = NULL;  // 현재 꼬리 위치 초기화
  returnQue -> front = NULL; // 현재 머리 위치 초기화
 }else{
  printf("Memory returnQue!!\n");
  return 0;
 }
 return returnQue;
}

void enQue(Que *p,node data){
 node *temp = (node *)malloc(sizeof(node));
 *temp = data;
 if ( p -> count == 0 ){ 
  p -> front = temp;
  p -> rear = temp;
  p -> count++;
 }else{
  p -> rear -> next = temp;
  p -> rear = temp;
  p -> count++;
 }
 //현재 저장되있는 자료의 개수가 0개인지 아닌지에 의해 알고리즘이 달라짐!!
}

void deQue(Que *p){
 if ( p -> count <= 0 ){
  printf("This is Empty!!\n");
  return;
 }else{
  node *temp;
  temp = p -> front;
  p -> front = temp -> next;
  free(temp);
  if ( p -> count == 1 ){ //현재 자료개수가 하나밖에 없었던 상황이면 rear 값 초기화!!
   p -> rear = NULL;
  }
  p -> count--;
 }
}

void display(Que *p){
 int i;
 node *temp;
 temp = p -> front;
 for ( i = 0 ; i < p -> count ; i++ ){
  printf("%d번째 값 : %d\n",i,temp -> data);
  temp = temp -> next;
 }
}

void main(){
 Que *Q;
 int select;
 node data;

 printf("Queue구조를 생성합니다.\n");
 Q = makeQue();

 while(1){
  printf("현재 %d개 저장\n",Q->count);
  printf("1.저장\t2.삭제\t3.출력\t4.종료\n");
  scanf("%d",&select);
  switch(select){
  case 1:
   printf("Input data : ");
   scanf("%d",&data.data);
   data.next = NULL;
   enQue(Q,data);
   break;
  case 2:
   deQue(Q);
   break;
  case 3:
   display(Q);
   break;
  case 4:
   return ;
  default:
   printf("Input Other number\n");
  }
 }
}
-------------------------------------------------------------------------------

주의깊게 보셧으면 하는데의 글씨색만 다르게 했습니다~

수고하세용~