Circular Queue 원형큐(환형큐) 질문드립니다

msi0124의 이미지

구현한 큐를 버퍼로 이용하여 Uart 통신에서 Receive data를
큐에 데이터 삽입 및 출력용도로 사용하려합니다.

코드는 visual상에서 블로그 참고하여 구조체 형식으로 생성한 형태입니다
통신쪽에 Receive data(받는쪽) 데이터 프로토타입은 char 형태인데,

구조체로 생성한 Queue에 매게변수 형식을 바꿔보려해도 구조체 배열형식을
어떻게 처리해야할지 감이안옵니다 ㅠ.ㅠ

// *********** CircularQ.c
 
#define _CRT_SECURE_NO_WARNINGS
 
 
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include "CircularQ.h"
 
 
 
 
CircularQueue *QIsInit() 
{
	CircularQueue *queue=(CircularQueue *)malloc(sizeof(CircularQueue)); 
 
	queue->front=0;
	queue->rear=0;
	queue->length=0;
 
	return queue;
 
}
 
 
 
 
 
void Q_IsFree(CircularQueue *queue) 
{
 
	free(queue);
}
 
 
 
 
 
BOOL Q_IsFull(CircularQueue *queue)
{
	if(queue->front == (queue->rear+1) % MAX_QUEUE_SIZE)
	{ return TRUE; }
	else
	{ return FALSE; }
 
}
 
 
 
 
 
void Enqueue(CircularQueue *queue)
{
 
 
	if(Q_IsFull(queue)==FALSE)
	{
		printf("input you data => ");
		(queue->rear)=(queue->rear+1)%MAX_QUEUE_SIZE;
 
		gets(queue->CQ[queue->rear]);
 
 
		printf(" Enqueue String data : \"%s\" \n",queue->CQ[queue->rear]);
		(queue->length)++;
		printf("\n");
	}
	else
	{
 
		printf("Circular Queue is Full \n");
 
 
 
	}
}
 
 
 
BOOL Q_IsEmpty(CircularQueue *queue)
{
 
		if(queue->front == queue->rear)
		{return TRUE; }
		else
		{return FALSE; }
 
}
 
 
 
void Dequeue(CircularQueue *queue ,char *data)
{
 
 
	if(Q_IsEmpty(queue)==FALSE) 
	{
		(queue->front)=(queue->front+1)%MAX_QUEUE_SIZE;
		strcpy(data,queue->CQ[queue->front]);
 
		(queue->length)--; 
 
		printf("Dequeue Data :  \" %s \" \n",data);
	}
 
	else
	{
		printf("Circular Queue is Empty !\n");
	}
 
}
 
 
 
 
int Q_IsLength(CircularQueue *queue)
{
 
 return queue->length;
 
}
 
 
 
 
 *************************************************************************************
 
 
// ******************* CircularQ.h
 
 
 
#define _CRT_SECURE_NO_WARNINGS
 
 
#define MAX_QUEUE_SIZE 6  //큐 사이즈 
#define MAX_STRING_SIZE 100 // 큐 Str 길이 
 
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
 
typedef enum{FALSE,TRUE} BOOL ;
 
typedef struct
{
	char CQ[MAX_QUEUE_SIZE][MAX_STRING_SIZE];
	int front;
	int rear;
	int length;
	char *data[MAX_QUEUE_SIZE][MAX_STRING_SIZE];
} CircularQueue ;
 
 
CircularQueue* QIsInit();
 
void Q_IsFree(CircularQueue *queue);
int Q_IsLength(CircularQueue *queue);
 
void Enqueue(CircularQueue *queue);
void Dequeue(CircularQueue *queue ,char *data);
 
BOOL Q_IsEmpty(CircularQueue *queue);
BOOL Q_IsFull(CircularQueue *queue);
 
 
<\code>

 의 이미지

질문이 아니라 선언이로군요.
뭔지는 모르겠지만 감이 오지 않는다니 안타깝네요.

대체 뭘 하려고 하시는지 확실해지면 그 때 다시 제작의뢰든 질문이든 하시길 바랍니다.

msi0124의 이미지

질문을한겁니다 선언이아닙니다

shint의 이미지

정적 배열의 큐'를 사용하는 예제 입니다.
rear 는 마지막에 1개씩 뒤에 추가 하는거고.
front 는 앞에 있는거 1개씩 빼는 겁니다. (큐에서 다음 순서의 위치로 이동합니다.)

각 데이터의 초기화는 별도로 확인해봐야 합니다.

구조체 안에 있는.
배열은 2중 배열로.
배열의 첫번째는 rear (마지막)와 front (맨앞) 순서 번호'이고.
배열의 두번째는 입력받은 값입니다.

http://codepad.org/QdiC05b4

#define _CRT_SECURE_NO_WARNINGS
 
#define MAX_QUEUE_SIZE 6  //큐 사이즈 
#define MAX_STRING_SIZE 100 // 큐 Str 길이 
 
#include <stdio.h>
//#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
 
typedef enum{FALSE,TRUE} BOOL ;
 
typedef struct
{
	char CQ[MAX_QUEUE_SIZE][MAX_STRING_SIZE];
	int front;
	int rear;
	int length;
	char *data[MAX_QUEUE_SIZE][MAX_STRING_SIZE];
} CircularQueue ;
 
 
CircularQueue* QIsInit();
 
void Q_IsFree(CircularQueue *queue);
int Q_IsLength(CircularQueue *queue);
 
void Enqueue(CircularQueue *queue);
void Dequeue(CircularQueue *queue ,char *data);
 
BOOL Q_IsEmpty(CircularQueue *queue);
BOOL Q_IsFull(CircularQueue *queue);
 
 
 
//초기화
CircularQueue *QIsInit() 
{
	CircularQueue *queue=(CircularQueue *)malloc(sizeof(CircularQueue)); 
 
	queue->front=0;  //앞
	queue->rear=0;   //뒤
	queue->length=0; //길이
 
	return queue;
 
}
 
 
//해제
void Q_IsFree(CircularQueue *queue) 
{ 
	free(queue);
}
 
 
//큐 rear 값을 입력 받아서 출력 한다.
void Enqueue(CircularQueue *queue)
{
	if(Q_IsFull(queue)==FALSE)
	{
                printf("[Enqueue] rear+1\n");
		printf("input you data => ");
 
                //rear+1의 최대값이 MAX_QUEUE_SIZE-1 값
		(queue->rear)=(queue->rear+1)%MAX_QUEUE_SIZE;
 
                //마지막 값을 입력 받는다.
//		gets(queue->CQ[queue->rear]);
//		strcpy(queue->CQ[queue->rear], "test");
sprintf(queue->CQ[queue->rear], "test%d.%d.%d", queue->rear, queue->front, queue->length);
 
                //얻은 값을 출력한다.
 		printf(" Enqueue String data : \"%s\" \n", queue->CQ[queue->rear]);
 
                //길이를 증가 시킨다.
		(queue->length)++;
		printf("rear : %d , front : %d, len : %d \n", queue->rear, queue->front, queue->length);
	}
	else
	{
		printf("Circular Queue is Full \n");
 	}
}
 
 
//
BOOL Q_IsFull(CircularQueue *queue)
{
        //앞과 나머지 값이 같으면...
	if(queue->front == (queue->rear+1) % MAX_QUEUE_SIZE)
	{ return TRUE; }
	else
	{ return FALSE; }
 
}
 
 
//비었는가? 
BOOL Q_IsEmpty(CircularQueue *queue)
{ 
		if(queue->front == queue->rear)
		{return TRUE; }
		else
		{return FALSE; } 
}
 
 
 
//큐 front 값을 얻어서 출력
void Dequeue(CircularQueue *queue ,char *data)
{
	if(Q_IsEmpty(queue)==FALSE) 
	{
                printf("          [Dequeue]front+1\n");
 
                //+1된 값을 추가해서. 최대 MAX_QUEUE_SIZE-1 값을 입력
		(queue->front)=(queue->front+1)%MAX_QUEUE_SIZE;
 
                //front 값을 data 에 넣는다.
		strcpy(data, queue->CQ[queue->front]);
 
                //길이를 줄인다.
		(queue->length)--; 
 
		printf("Dequeue Data [front]:  \" %s \" \n",data);
		printf("rear : %d , front : %d, len : %d \n", queue->rear, queue->front, queue->length);
	} 
	else
	{
		printf("Circular Queue is Empty !\n");
	}
}
 
 
 
//큐 길이
int Q_IsLength(CircularQueue *queue)
{
 
 return queue->length;
 
}
 
 
int main()
{
    CircularQueue * pQueue;
    pQueue = QIsInit();
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    char * pData = (char*) malloc (MAX_STRING_SIZE);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
 
    Enqueue(pQueue);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Enqueue(pQueue);
    Enqueue(pQueue);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
 
    Enqueue(pQueue);
    Enqueue(pQueue);
    Dequeue(pQueue, pData);
    Dequeue(pQueue, pData);
 
    free(pData);
    Q_IsFree(pQueue);
    return 0;
}
 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test1.0.0" 
rear : 1 , front : 0, len : 1 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test2.0.1" 
rear : 2 , front : 0, len : 2 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test3.0.2" 
rear : 3 , front : 0, len : 3 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test4.0.3" 
rear : 4 , front : 0, len : 4 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test5.0.4" 
rear : 5 , front : 0, len : 5 
Circular Queue is Full 
Circular Queue is Full 
Circular Queue is Full 
Circular Queue is Full 
          [Dequeue]front+1
Dequeue Data [front]:  " test1.0.0 " 
rear : 5 , front : 1, len : 4 
          [Dequeue]front+1
Dequeue Data [front]:  " test2.0.1 " 
rear : 5 , front : 2, len : 3 
          [Dequeue]front+1
Dequeue Data [front]:  " test3.0.2 " 
rear : 5 , front : 3, len : 2 
          [Dequeue]front+1
Dequeue Data [front]:  " test4.0.3 " 
rear : 5 , front : 4, len : 1 
          [Dequeue]front+1
Dequeue Data [front]:  " test5.0.4 " 
rear : 5 , front : 5, len : 0 
Circular Queue is Empty !
Circular Queue is Empty !
Circular Queue is Empty !
Circular Queue is Empty !
[Enqueue] rear+1
input you data =>  Enqueue String data : "test0.5.0" 
rear : 0 , front : 5, len : 1 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test1.5.1" 
rear : 1 , front : 5, len : 2 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test2.5.2" 
rear : 2 , front : 5, len : 3 
          [Dequeue]front+1
Dequeue Data [front]:  " test0.5.0 " 
rear : 2 , front : 0, len : 2 
          [Dequeue]front+1
Dequeue Data [front]:  " test1.5.1 " 
rear : 2 , front : 1, len : 1 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test3.1.1" 
rear : 3 , front : 1, len : 2 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test4.1.2" 
rear : 4 , front : 1, len : 3 
          [Dequeue]front+1
Dequeue Data [front]:  " test2.5.2 " 
rear : 4 , front : 2, len : 2 
          [Dequeue]front+1
Dequeue Data [front]:  " test3.1.1 " 
rear : 4 , front : 3, len : 1 
          [Dequeue]front+1
Dequeue Data [front]:  " test4.1.2 " 
rear : 4 , front : 4, len : 0 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test5.4.0" 
rear : 5 , front : 4, len : 1 
[Enqueue] rear+1
input you data =>  Enqueue String data : "test0.4.1" 
rear : 0 , front : 4, len : 2 
          [Dequeue]front+1
Dequeue Data [front]:  " test5.4.0 " 
rear : 0 , front : 5, len : 1 
          [Dequeue]front+1
Dequeue Data [front]:  " test0.4.1 " 
rear : 0 , front : 0, len : 0 

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.