【数据结构】 链式队列的一些操作

详细见代码:

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

typedef struct ElemType
{
	int data;
	ElemType *next;
}ElemType;                        // next 是 元素的指针 指向下一个元素的位置

typedef struct
{
	ElemType *front;
	ElemType *rear;
}Queue,*PsQueue;                  // 队列头指针 和 队列尾指针


void initQueue(Queue * sq);       // 初始化
void DestoryQueue (Queue * sq);   //销毁队列  
void EnQueue (Queue * sq,int e);  //进队列  
void DeQueue (Queue * sq);        //出队列  
void GetHead (Queue * sq);        //取队头元素值  
bool QueueEmpty (Queue sq);       //判队列空否  
void DisQueue(Queue * sq);        // 遍历队列中元素  

void main()
{
	int size = 0;  
	char choice = '\0'; 
	Queue sQueue = {0,};
	PsQueue PsQueue = &sQueue;

	initQueue(PsQueue);

	while (choice != 'q')  
	{  
		printf("******************************\n");  
		printf("---    1   元素进队       --- \n");  
		printf("---    2   队头出队       --- \n");  
		printf("---    3   遍历队中元素   --- \n");  
		printf("---    4   判队列空否     --- \n");  
		printf("---    5   取队头元素值   --- \n");  
		printf("---    6   销毁队列       --- \n");  
		printf("---    q   退出           --- \n");  
		printf("******************************\n");  

		scanf("\n%c",&choice);  

		switch (choice)  
		{  
		case '1':  
			printf("输入进栈元素个数:");  
			scanf("%d",&size);  

			for (int i = 0; i < size; i++)  
				EnQueue (&sQueue, i+1) ; //进队列   
			break;  
		case '2':  
			DeQueue(&sQueue);  
			break;  
		case '3':  
			DisQueue(&sQueue);  
			break;  
		case '4':  
			QueueEmpty(sQueue);
			break;  
		case '5':  
			GetHead(&sQueue);  
			break;  
		case '6':  
			DestoryQueue(&sQueue);  
			break;  
		case 'q':  
			return;  

		} 
	}  
}

void initQueue(Queue * sq)  // 初始化
{
	sq->rear = sq->front = (ElemType *)malloc(sizeof(ElemType)); // 指向同一处内存空间
}


void DestoryQueue (Queue * sq) //销毁队列
{
	while (sq->front->next != NULL)
	{
		ElemType *p = sq->front->next;
		sq->front->next = sq->front->next->next;
		free(p);
	}

	free(sq->front);
}


void EnQueue (Queue * sq,int e) //进队列
{
	sq->rear->next = (ElemType *)malloc(sizeof(ElemType));
	sq->rear = sq->rear->next;

	sq->rear->data = e;
	sq->rear->next = NULL;
}


void DeQueue (Queue * sq) //出队列
{
	// 队头出队
	if (sq->front == sq->rear)
	{
		printf("队列为空,不能出队~\n");
		return;
	}
	else
	{
		ElemType *p =sq->front->next;
		printf("出队元素为 %d\n",p->data);

		sq->front->next = sq->front->next->next;
		free(p);
	}
}


void GetHead (Queue * sq) //取队头元素值
{
	printf("队头元素为 %d\n",sq->front->next->data);
}


bool QueueEmpty (Queue sq) //判队列空否
{
	if (sq.front == sq.rear)
	{
		printf("队列为空~\n");
		return true;
	}
	else
	{
		printf("队列不为空~\n");
		return false;
	}
}


void DisQueue(Queue * sq)  // 遍历队列中元素
{
	ElemType * p = sq->front;

	while (p->next != NULL)
	{
		p = p->next;
		printf("%d\t",p->data);	
	}

	printf("\n");	
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值