C语言队列(排队)先进先出.实现全部函数

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

/************************************************************************/
/* 队列

	  结构要素:队列容量  内存指针  元素个数  队列头  对列尾

	*/
/************************************************************************/

#define QUEUE_CAPACITY 3    //队列容量

typedef struct tag_queue
{
	int *pQueue;   //队列内存指针
	int head;      //队列头
	int tail;      //队列尾
	int length;    //元素个数
}LineQueue;

int InitQueue(LineQueue **myQueue);               //InitQueue(&Q)             创建队列
void DestroyQueue(LineQueue *myQueue);           //DestroyQueue(&Q)          销毁队列
void ClearQueue(LineQueue *myQueue); //已有的元素清空掉            //ClearQueue(&Q)            清空队列
int QueueEmpty(LineQueue *myQueue);              //QueueEmpty(&Q)            判空队列
int QueueFull(LineQueue *myQueue);               //QueueFull(&Q)             判满队列
int QueueLength(LineQueue *myQueue);             //QueueLength(&Q)           队列长度
int EnQueue(LineQueue *myQueue, int element);    //EnQueue(&Q, element)      新元素入队
int DeQueue(LineQueue *myQueue, int *element);   //DeQueue(&Q, &element)     首元素出队
void QueueTraverse(LineQueue *myQueue);          //QueueTraverse(Q, visit()) 遍历队列

int InitQueue(LineQueue **myQueue)
{
	(*myQueue) = (LineQueue *)malloc(sizeof(LineQueue));//申请内存.强制转换,不然会为void无类型。分配结构体内存
	//printf("queue1 = %p\n", (*myQueue));
	if(myQueue == NULL)
	{
		return 0;
	}
	(*myQueue)->pQueue = (int *)malloc(sizeof(int) * QUEUE_CAPACITY);//分配队列内存
	if((*myQueue)->pQueue == NULL)
	{
		return 0;
	}
	(*myQueue)->head = 0;
	(*myQueue)->tail = 0;
	(*myQueue)->length = 0;

	return 1;
}

void DestroyQueue(LineQueue *myQueue)
{
	free(myQueue->pQueue);
	myQueue->pQueue = NULL;
	free(myQueue);
	myQueue = NULL;
}

void ClearQueue(LineQueue *myQueue)//把队列里面所有的元素删除掉
{
	myQueue->length = 0;
	myQueue->tail = 0;
}

int QueueEmpty(LineQueue *myQueue)
{
	if(myQueue->length == 0)
	{
		return 1;
	}
	return 0;
}

int QueueFull(LineQueue *myQueue)
{
	if(myQueue->length >= QUEUE_CAPACITY)//#define QUEUE_CAPACITY 3    //队列容量
	{
		return 1;
	}
	return 0;
}

int QueueLength(LineQueue *myQueue)
{
	return myQueue->length;
}

int EnQueue(LineQueue *myQueue, int element)
{
	if(QueueFull(myQueue))//判断他是否为满的操作,满了就不能进队列了
	{
		return 0;
	}
	myQueue->pQueue[myQueue->tail] = element;//把元素放入队尾
	myQueue->tail++;//因为进队列,所以++1
	myQueue->length++;//大小++1
	return 1;
}

int DeQueue(LineQueue *myQueue, int *element)//取出来,是从head开始取出的啦
{
	int i = 0;
	if(QueueEmpty(myQueue))
	{
		return 0;
	}
	*element = myQueue->pQueue[myQueue->head];

	for(i = 1; i < myQueue->length; i++)
	{
		myQueue->pQueue[i-1] = myQueue->pQueue[i];//所有元素往前靠一步
	}
	myQueue->length--;//因为少了一个,所以--
	myQueue->tail--;//因为所有元素往前移动一位了,所以--1
	return 1;
}

void QueueTraverse(LineQueue *myQueue, int flag)
{
	int i = 0;
	if(flag == 0)  //从头到尾
	{
		for(i = 0; i < myQueue->length; i++)
		{
			printf("%d ", myQueue->pQueue[i]);
		}
	}
	
	if(flag == 1)  //从尾到头
	{
		for(i = myQueue->length - 1; i >= 0; i--)
		{
			printf("%d ", myQueue->pQueue[i]);
		}
	}
}

int main(void)
{
	int elem = 0;
	LineQueue *queue = NULL;
	InitQueue(&queue);

	if(QueueEmpty(queue))
	{
		printf("当前队列为空\n");
	}

	EnQueue(queue, 2);
	EnQueue(queue, 4);
	EnQueue(queue, 5);

	if(QueueFull(queue))
	{
		printf("当前队列为满\n");
	}

	QueueTraverse(queue, 0);

	printf("\n-----------------------\n");

	
	/*DeQueue(queue, &elem);
	printf("elem = %d\n", elem);

	DeQueue(queue, &elem);
	printf("elem = %d\n", elem);

	DeQueue(queue, &elem);
	printf("elem = %d\n", elem);*/

	printf("queueLength = %d\n", QueueLength(queue));

	ClearQueue(queue);

	if(QueueEmpty(queue))
	{
		printf("当前队列为空\n");
	}

	//QueueTraverse(queue, 1);

	//printf("queue2 = %p\n", queue);
	DestroyQueue(queue);

	system("pause");
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
队列是一种基于链表实现队列数据结构,它支持入队和出队操作,可以用来实现银行排队管理系统。下面是一个简单的C语言实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点 typedef struct node { int data; struct node* next; } Node; // 定义链队列 typedef struct queue { Node* front; // 队头指针 Node* rear; // 队尾指针 } Queue; // 初始化队列 void initQueue(Queue* q) { q->front = q->rear = NULL; } // 判断队列是否为空 int isEmpty(Queue* q) { return q->front == NULL; } // 入队操作 void enqueue(Queue* q, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (isEmpty(q)) { q->front = q->rear = newNode; } else { q->rear->next = newNode; q->rear = newNode; } } // 出队操作 int dequeue(Queue* q) { if (isEmpty(q)) { printf("Queue is empty\n"); return -1; } Node* temp = q->front; int data = temp->data; q->front = q->front->next; if (q->front == NULL) { q->rear = NULL; } free(temp); return data; } // 输出队列 void printQueue(Queue* q) { printf("Queue: "); Node* p = q->front; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 测试链队列 int main() { Queue q; initQueue(&q); enqueue(&q, 1); enqueue(&q, 2); enqueue(&q, 3); printQueue(&q); printf("Dequeue: %d\n", dequeue(&q)); printf("Dequeue: %d\n", dequeue(&q)); printQueue(&q); enqueue(&q, 4); enqueue(&q, 5); printQueue(&q); return 0; } ``` 上述代码定义了一个链表节点结构体 `Node` 和链队列结构体 `Queue`,并实现了初始化队列、判断队列是否为空、入队、出队、输出队列等基本操作。在 `main` 函数中,我们可以通过调用这些操作来测试链队列的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贵哥的编程之路(热爱分享)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值