C語言 環形隊列

<code>#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define MAXSIZE 100 /* 環狀隊列空間的存儲量 */

typedef int DataType; /* 環狀隊列元素類型 */
typedef struct {
\tDataType *data; /* 環狀隊列元素存儲空間基址 */
\tint front, rear; /* 環狀隊列頭、尾 */
} SeqQueue; /* 環狀隊列類型 */

void wait()
{
\tprintf("\\n請按任意鍵...\\n");
\tgetch();
}

int go_on()
{
\tint flag = 1;
\tchar choice;
\twhile(1) {
\t\tprintf("\\n繼續嗎?[Y/N]");
\t\tchoice = getche();
\t\tif (choice == 'Y' || choice == 'y')
\t\t\tbreak;
\t\telse if (choice == 'N' || choice == 'n') {
\t\t\tflag = 0;
\t\t\tbreak;
\t\t}
\t}
\treturn (flag);
}

/* 初始化,構造一個空環狀隊列 */
void Init_SeqQueue(SeqQueue *Q, int n)
{
\tQ->data = (DataType *)malloc(n*sizeof(DataType));
\tif(Q->data == NULL) {
\t\tprintf("\\n內存分配失敗.\\n");
\t\texit(-1);
\t}
\tQ->front = Q->rear = 0;
}

/* 判斷環狀隊列是否為空 */

int Empty_SeqQueue(SeqQueue *Q)
{
\tif(Q->front == Q->rear)
\t\treturn (1);
\telse
\t\treturn (0);
}

/* 判斷環狀隊列是否為滿 */
int Full_SeqQueue(SeqQueue *Q)
{
\tif((Q->rear+1) % MAXSIZE == Q->front)
\t\treturn (1);
\telse
\t\treturn (0);
}

/* 求環狀隊列隊長 */
int Length_SeqQueue(SeqQueue *Q)
{
\tint k;
\tk = (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
\treturn (k);
}

void Length(SeqQueue *Q)
{
\tint k;
\tk = Length_SeqQueue(Q);
\tprintf("\\n隊長:%d\\n", k);
}

/* 入隊,插入元素e為新的隊頭元素 */
int EnQueue_SeqQueue(SeqQueue *Q, DataType e)
{
\tif(Full_SeqQueue(Q) == 1) { /* 隊滿,不能入隊 */
\t\tprintf("隊滿,不能入隊.\\n");
\t\treturn (0);
\t}
\telse {
\t\tQ->data[Q->rear] = e; /* 元素e入隊 */
\t\tQ->rear = (Q->rear + 1) % MAXSIZE;
\t\treturn (1);
\t}
}


void EnQueue(SeqQueue *Q)
{
\tDataType x;
\tint flag = 1, enqueue_flag;
\twhile(flag) {
\t\tprintf("\\n請輸入要入隊元素:");
\t\tscanf("%d", &x);
\t\tenqueue_flag = EnQueue_SeqQueue(Q, x);
\t\tif (enqueue_flag == 1)
\t\t\tprintf("\\n入隊成功.\\n");
\t\telse
\t\t\tprintf("\\n入隊失敗.\\n");
\t\tflag = go_on();
\t}
}

/* 出隊,刪除隊頭元素,並由*e返回其值 */
int DeQueue_SeqQueue(SeqQueue *Q, DataType *e)
{
\tif(Empty_SeqQueue(Q)) { /* 隊空,不能出隊 */
\t\tprintf("\\n隊空,不能出隊.\\n");
\t\treturn (0);
\t}
\telse {
\t\t*e = Q->data[Q->front];
\t\tQ->front = (Q->front + 1) % MAXSIZE;
\t\treturn (1);
\t}
}

void DeQueue(SeqQueue *Q)
{
\tDataType x;
\tint flag = 1, dequeue_flag;
\twhile (flag) {
\t\tdequeue_flag = DeQueue_SeqQueue(Q, &x);
\t\tif(dequeue_flag == 1)
\t\t\tprintf("\\n出隊成功,出隊元素為:%d\\n", x);
\t\telse
\t\t\tprintf("\\n出隊失敗.\\n");
\t\tflag = go_on();
\t}
}


/* 取隊頭元素,由*e返回其值 */
int GetFront_SeqQueue(SeqQueue *Q, DataType *e)
{
\tif(Empty_SeqQueue(Q)) { /* 隊空,不能取隊頭元素 */
\t\tprintf("\\n隊空,不能取隊頭元素.\\n");
\t\treturn (0);
\t}
\telse {
\t\t*e = Q->data[Q->front];
\t\treturn (1);
\t}
}

/* 輸出隊頭元素 */
void Display_Front(SeqQueue *Q)
{
\tDataType e;
\tif(Empty_SeqQueue(Q) == 1)
\t\tprintf("\\n隊空,沒有元素.\\n");
\telse {
\t\tGetFront_SeqQueue(Q, &e);
\t\tprintf("\\n隊頭元素:\\n");
\t\tprintf("%4d\\n", e);
\t}
}

/* 輸出隊全部元素 */
void Display_SeqQueue(SeqQueue *Q)
{
\tint k, len;
\tif(Empty_SeqQueue(Q)==1)
\t\tprintf("\\n隊空,沒有元素.\\n");
\telse {
\t\tprintf("\\n隊全部元素\\n");
\t\tprintf("\\n隊頭隊尾\\n");
\t\tlen = Length_SeqQueue(Q);
\t\tfor(k=0; k\t\t\tprintf("%4d", Q->data[(Q->front+k)%MAXSIZE]);
\t}
}

int main(void)

{
\tSeqQueue Q;
\tchar choice;
\tint flag = 1;
\tInit_SeqQueue(&Q, MAXSIZE);
\tdo {
\t\tprintf("\\n");
\t\tprintf("-----環狀順序隊列(動態數組實現)-----\\n");
\t\tprintf(" 1........入隊元素\\n");
\t\tprintf(" 2........出隊元素\\n");
\t\tprintf(" 3........輸出隊長\\n");
\t\tprintf(" 4........輸出隊頭元素\\n");
\t\tprintf(" 5........輸出全部元素\\n");
\t\tprintf(" 0........退出\\n");
\t\tprintf("請選擇[1/2/3/4/5/0]: ");
\t\tchoice = getche();
\t\tswitch(choice) {
\t\t\tcase '1':
\t\t\t\tEnQueue(&Q);
\t\t\t\tbreak;
\t\t\tcase '2':
\t\t\t\tDeQueue(&Q);
\t\t\t\tbreak;
\t\t\tcase '3':
\t\t\t\tLength(&Q);
\t\t\t\tbreak;
\t\t\tcase '4':
\t\t\t\tDisplay_Front(&Q);
\t\t\t\tbreak;
\t\t\tcase '5':
\t\t\t\tDisplay_SeqQueue(&Q);
\t\t\t\tbreak;
\t\t\tcase '0':
\t\t\t\tflag = 0;
\t\t\t\tbreak;
\t\t}
\t\twait();
\t} while(flag == 1);
\t
\treturn (0);
}
/<conio.h>/<stdlib.h>/<stdio.h>/<code>


分享到:


相關文章: