李成笔记网

专注域名、站长SEO知识分享与实战技巧

C语言 环形队列 c语言实现环形队列

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

#define MAXSIZE 100       /* 环状队列空间的存储量 */

typedef int DataType;     /* 环状队列元素类型 */
typedef struct {
	DataType *data;       /* 环状队列元素存储空间基址 */
	int front, rear;      /* 环状队列头、尾 */
} SeqQueue;               /* 环状队列类型 */

void wait()
{
	printf("\n请按任意键...\n");
	getch();
}

int go_on()
{
	int flag = 1;
	char choice;
	while(1) {
		printf("\n继续吗?[Y/N]");
		choice = getche();
		if (choice == 'Y' || choice == 'y')
			break;
		else if (choice == 'N' || choice == 'n') {
			flag = 0;
			break;
		}
	}
	return (flag);
}

/* 初始化,构造一个空环状队列 */
void Init_SeqQueue(SeqQueue *Q, int n)
{
	Q->data = (DataType *)malloc(n*sizeof(DataType));
	if(Q->data == NULL) {
		printf("\n内存分配失败.\n");
		exit(-1);
	}
	Q->front = Q->rear = 0;
}

/* 判断环状队列是否为空 */
int Empty_SeqQueue(SeqQueue *Q)
{
	if(Q->front == Q->rear)
		return (1);
	else
		return (0);
}

/* 判断环状队列是否为满 */
int Full_SeqQueue(SeqQueue *Q)
{
	if((Q->rear+1) % MAXSIZE == Q->front)
		return (1);
	else
		return (0);
}

/* 求环状队列队长 */
int Length_SeqQueue(SeqQueue *Q)
{
	int k;
	k = (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
	return (k);
}

void Length(SeqQueue *Q)
{
	int k;
	k = Length_SeqQueue(Q);
	printf("\n队长:%d\n", k);
}

/* 入队,插入元素e为新的队头元素 */
int EnQueue_SeqQueue(SeqQueue *Q, DataType e)
{
	if(Full_SeqQueue(Q) == 1) {    /* 队满,不能入队 */
		printf("队满,不能入队.\n");
		return (0);
	}
	else {
		Q->data[Q->rear] = e;     /* 元素e入队 */
		Q->rear = (Q->rear + 1) % MAXSIZE;
		return (1);
	}
}

void EnQueue(SeqQueue *Q)
{
	DataType x;
	int flag = 1, enqueue_flag;
	while(flag) {
		printf("\n请输入要入队元素:");
		scanf("%d", &x);
		enqueue_flag = EnQueue_SeqQueue(Q, x);
		if (enqueue_flag == 1)
			printf("\n入队成功.\n");
		else
			printf("\n入队失败.\n");
		flag = go_on();
	}
}

/* 出队,删除队头元素,并由*e返回其值 */
int DeQueue_SeqQueue(SeqQueue *Q, DataType *e)
{
	if(Empty_SeqQueue(Q)) {    /* 队空,不能出队 */
		printf("\n队空,不能出队.\n");
		return (0);
	}
	else {
		*e = Q->data[Q->front];
		Q->front = (Q->front + 1) % MAXSIZE;
		return (1);
	}
}

void DeQueue(SeqQueue *Q)
{
	DataType x;
	int flag = 1, dequeue_flag;
	while (flag) {
		dequeue_flag = DeQueue_SeqQueue(Q, &x);
		if(dequeue_flag == 1)
			printf("\n出队成功,出队元素为:%d\n", x);
		else
			printf("\n出队失败.\n");
		flag = go_on();
	}
}

/* 取队头元素,由*e返回其值 */
int GetFront_SeqQueue(SeqQueue *Q, DataType *e)
{
	if(Empty_SeqQueue(Q)) {    /* 队空,不能取队头元素 */
		printf("\n队空,不能取队头元素.\n");
		return (0);
	}
	else {
		*e = Q->data[Q->front];
		return (1);
	}
}

/* 输出队头元素 */
void Display_Front(SeqQueue *Q)
{
	DataType e;
	if(Empty_SeqQueue(Q) == 1)
		printf("\n队空,没有元素.\n");
	else {
		GetFront_SeqQueue(Q, &e);
		printf("\n队头元素:\n");
		printf("%4d\n", e);
	}
}

/* 输出队全部元素 */
void Display_SeqQueue(SeqQueue *Q)
{
	int k, len;
	if(Empty_SeqQueue(Q)==1)
		printf("\n队空,没有元素.\n");
	else {
		printf("\n队全部元素\n");
		printf("\n队头<--------------------->队尾\n");
		len = Length_SeqQueue(Q);
		for(k=0; k<len; k++)
			printf("%4d", Q->data[(Q->front+k)%MAXSIZE]);
	}
}

int main(void)
{
	SeqQueue Q;
	char choice;
	int flag = 1;
	Init_SeqQueue(&Q, MAXSIZE);
	do {
		printf("\n");
		printf("-----环状顺序队列(动态数组实现)-----\n");
		printf("     1........入队元素\n");
		printf("     2........出队元素\n");
		printf("     3........输出队长\n");
		printf("     4........输出队头元素\n");
		printf("     5........输出全部元素\n");
		printf("     0........退出\n");
		printf("请选择[1/2/3/4/5/0]: ");
		choice = getche();
		switch(choice) {
			case '1': 
				EnQueue(&Q);
				break;
			case '2':
				DeQueue(&Q);
				break;
			case '3':
				Length(&Q);
				break;
			case '4':
				Display_Front(&Q);
				break;
			case '5':
				Display_SeqQueue(&Q);
				break;
			case '0':
				flag = 0;
				break;
		}
		wait();
	} while(flag == 1);
	
	return (0);
}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言