c 언어 순환 대기 열 실현

20982 단어 데이터 구조
  • 인 터 페 이 스 는 엄 울 민 선생님 의 데이터 구조 참조
  • 난점
  • 시작 대기 열 이 비어 있 을 때 front = rear = 0, 대기 열 이 가득 찼 을 때 도 front = rear 라면 두 상 태 를 가득 채 웠 다 고 판단 하기 어렵 기 때문에 대기 열 에 하나의 공간 을 비 워 서 꼬리 지침 을 놓 는 데 사용 합 니 다.
  • 순환 대기 열 이 어떻게 순환 상태 에 이 르 는 지, 인터페이스 함수 가 실현 되 는 과정 은 그림 을 그 려 서 이미 지 를 보 여 주 는 것 이 좋 습 니 다. 나중에 디 버 깅 을 실현 하 는 것 은 조심 하지 않 으 면 오류 가 발생 할 수 있 기 때 문 입 니 다.

  • 실현 환경: Liux
  • 다음은 실현 과정.
    데이터 구조:
    typedef struct {
    	Item *base;
    	int front;
    	int rear;
    }Queue;
    

    queue.h
    #ifndef QUEUE_H_
    #define QUEUE_H_
    #include 
    
    #define MAXQSIZE 6
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -1
    
    typedef int Item;
    
    typedef struct {
    	Item *base;
    	int front;
    	int rear;
    }Queue;
    
    /*initialize the queue*/
    void InitQueue(Queue *q);
    
    /*return the length of the queue*/
    unsigned int QueueLength(Queue q);
    
    /*Destroy the queue*/
    void DestroyQueue(Queue *q);
    
    /*determine if the queue is empty*/
    bool IsEmpty(Queue q);
    
    /*determine if the queue is full*/
    bool IsFull(Queue q);
    
    /*return the head elem of the queue*/
    Item Top(Queue q);
    
    /*return the back elem of the queue*/
    Item Back(Queue q);
    
    /*enqueue, insert the rear*/
    bool EnQueue(Queue *q, Item e);
    
    /*dequeue, pop the front*/
    bool DeQueue(Queue *q);
    
    /*print the queue*/
    void PrintQueue(Queue q);
    
    #endif
    
    
    
    

    queue.c
    #include "queue.h"
    #include 
    #include 
    
    void InitQueue(Queue *q) {
    	q->base = (Item*)malloc(MAXQSIZE * sizeof(Item));
    	if (q->base == NULL)
    		exit(OVERFLOW);
    	q->front = 0;
    	q->rear = 0;
    }
    
    /*return the length of the queue*/
    unsigned int QueueLength(Queue q) {
    	return (q.rear - q.front + MAXQSIZE) % MAXQSIZE;
    }
    /*Destroy the queue*/
    void DestroyQueue(Queue *q) {
    	q->base = NULL;
    	q->rear = 0;
    	q->front = 0;
    	free(q->base);
    }
    
    /*determine if the queue is empty*/
    bool IsEmpty(Queue q) {
    	return q.rear == q.front;
    }
    
    bool IsFull(Queue q) {
    	return (q.rear + 1) % MAXQSIZE == q.front;
    }
    
    /*return the head elem of the queue*/
    Item Top(Queue q) {
    	return q.base[q.front];
    }
    
    /*return the back elem of the queue*/
    Item Back(Queue q) {
    	return q.base[(q.rear - 1 + MAXQSIZE) % MAXQSIZE];
    }
    
    /*enqueue, insert the rear*/
    bool EnQueue(Queue *q, Item e) {
    	if (IsFull(*q))
    		return ERROR;
    	q->base[q->rear] = e;
    	q->rear = (q->rear + 1) % MAXQSIZE;
    	
    	return OK;
    }
    /*dequeue, pop the front*/
    bool DeQueue(Queue *q) {
    	if(IsEmpty(*q))
    		return ERROR;
    	q->front = (q->front + 1) % MAXQSIZE;
    	return OK;
    }
    
    /*print the queue*/
    void PrintQueue(Queue q) {
    	int i, j;
    	for (i = 0, j = q.front; i < QueueLength(q); i++, j = (j + 1) % MAXQSIZE) {
    		printf("%d
    "
    ,q.base[j]); } }

    main.c
    #include "queue.h"
    #include 
    int main () {
    	Queue q;
    	InitQueue(&q);
    	EnQueue(&q, 1);
    	EnQueue(&q, 2);
    	EnQueue(&q, 3);
            EnQueue(&q, 4);
    	EnQueue(&q, 5);
    	if (IsFull(q))
    		printf("hihi
    "
    ); DeQueue(&q); printf("%d
    %d
    "
    , q.front, q.rear); EnQueue(&q, 6); printf("%d
    "
    , Top(q)); //printf("%d
    ", q.base[0]);
    printf("%d
    "
    , Back(q)); PrintQueue(q); DestroyQueue(&q); }

    Makefile
    object = main.o queue.o
    
    test : $(object)
    	gcc -g -Wall -o test $(object)
    
    main.o : queue.h
    queue.o : queue.h
    
    .PHONY : clean
    clean :
    	rm -rf *.o
    
    

    좋은 웹페이지 즐겨찾기