队列的链式存储(C语言实现)

队列:

是一种先进先出的线性表,只允许在表的一端进行插入,而在另一端删除元素。和日常的排队一致。允许插入的一端叫做队尾,允许删除的一端叫做队头。(尾进头出)

存储结构

typedef struct QNode{
	ElemType data;//数据域 
	struct QNode *next;//指针域 
} QNode, *QPtrl; 

typedef struct {
	QPtrl front;//头指针 
	QPtrl rear;//尾指针 
}*LinkQueue;

 

各个函数

 初始化队列 

//初始化队列 
LinkQueue InitQueue(LinkQueue Q)
{
	Q->front = Q->rear = (QPtrl)malloc(sizeof(QNode));//生成新的结点作为头节点且让头尾指针指向它 
	if (!Q->front) exit(OVERFLOW);
	Q->front->next = NULL;//头节点 
	return Q;
}

 入队函数  

//入队函数 
LinkQueue EnQueue(LinkQueue Q, ElemType *e)
{
	QPtrl p = (QPtrl)malloc(sizeof(QNode));
	if(!p) exit(OVERFLOW);
	p->data = *e; p->next = NULL;
	Q->rear->next = p;
	Q->rear = p;
	return Q; 
}

 定义一个新的指向结构体的指针p,储存存入的值,并指向空处,并且原来队尾指向它,使p作为新的队尾。

 记得最后队尾指针需要改变(指向p)。

 出队函数  

//出队函数 
LinkQueue DeQueue(LinkQueue Q, ElemType *e)
{
	if (Q->front == Q->rear ) exit(OVERFLOW);
	*e = Q->front->next->data;
	QPtrl p = (QPtrl)malloc(sizeof(QNode));
	p = Q->front->next;
	Q->front->next = p->next;
	if (Q->rear == p) Q->rear = Q->front;
    free(p);
	return Q; 
}

 删除队列头元素算法中的特殊情况,一般情况下,删除队列头元素时仅需修改结点中的指针,但当队列中最后一个元素被删后,队列尾指针也丢失了,因此需要对队尾指针重新赋值(指向头节点)。

 取队头元素 

//取队头元素 
LinkQueue GetHead(LinkQueue Q, ElemType *e)
{
	if (Q->front == Q->rear ) exit(OVERFLOW);
	*e = Q->front->next->data;
}

 调用入队功能函数

//调用入队功能函数
LinkQueue  Use_EnQueue(LinkQueue Q)
{
	ElemType e, num;
	printf("请输入入队元素个数:\n");
	scanf("%d", &num);
	printf("请输入入队元素:\n");
	for (int i=0; i<num; i++)
	{
		scanf("%d", &e);
		EnQueue(Q,&e);
	}
	return Q;
}

 调用出队功能函数    

//调用出队功能函数	
LinkQueue Use_DeQueue(LinkQueue Q)
{
	ElemType e, num;
	printf("请输入出队元素个数:\n");
	scanf("%d", &num);
	for (int i=0; i<num; i++)
	{
		DeQueue(Q,&e);
	}
	return Q;
}	

调用取队头元素功能函数 

//调用取队头元素功能函数
void Use_GetHead(LinkQueue Q)
{
	ElemType e;
	GetHead(Q,&e);
	printf("队头元素是%d\n", e);
}

 遍历队列

//遍历队列
void TravelQueue(LinkQueue Q)
{
	QPtrl p = (QPtrl)malloc(sizeof(QNode));
	p = Q->front->next;
	while (p != NULL)
	{
		printf("%d", p->data);
		p=p->next;
	}
	printf("\n");
} 

全部代码 

#include <Stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define OVERFLOW -1
#define Status int
#define bool int
#define true 1
#define flase 0
#define ElemType int

typedef struct QNode{
	ElemType data;//数据域 
	struct QNode *next;//指针域 
} QNode, *QPtrl; 

typedef struct {
	QPtrl front;//头指针 
	QPtrl rear;//尾指针 
}*LinkQueue;

//初始化队列 
LinkQueue InitQueue(LinkQueue Q)
{
	Q->front = Q->rear = (QPtrl)malloc(sizeof(QNode));//生成新的结点作为头节点且让头尾指针指向它 
	if (!Q->front) exit(OVERFLOW);
	Q->front->next = NULL;//头节点 
	return Q;
}
//入队函数 
LinkQueue EnQueue(LinkQueue Q, ElemType *e)
{
	QPtrl p = (QPtrl)malloc(sizeof(QNode));
	if(!p) exit(OVERFLOW);
	p->data = *e; p->next = NULL;
	Q->rear->next = p;
	Q->rear = p;
	return Q; 
}
//出队函数 
LinkQueue DeQueue(LinkQueue Q, ElemType *e)
{
	if (Q->front == Q->rear ) exit(OVERFLOW);
	*e = Q->front->next->data;
	QPtrl p = (QPtrl)malloc(sizeof(QNode));
	p = Q->front->next;
	Q->front->next = p->next;
	if (Q->rear == p) Q->rear = Q->front;
	free(p); 
	return Q; 
}
//取队头元素 
LinkQueue GetHead(LinkQueue Q, ElemType *e)
{
	if (Q->front == Q->rear ) exit(OVERFLOW);
	*e = Q->front->next->data;
}

//菜单
void menu()
{
   printf("********1.入队          2.出队*********\n");
   printf("********3.取队顶元素    4.遍历*********\n");
   printf("********5.退出    	6.*********\n");
}
//调用入队功能函数
LinkQueue  Use_EnQueue(LinkQueue Q)
{
	ElemType e, num;
	printf("请输入入队元素个数:\n");
	scanf("%d", &num);
	printf("请输入入队元素:\n");
	for (int i=0; i<num; i++)
	{
		scanf("%d", &e);
		EnQueue(Q,&e);
	}
	return Q;
}
//调用出队功能函数	
LinkQueue Use_DeQueue(LinkQueue Q)
{
	ElemType e, num;
	printf("请输入出队元素个数:\n");
	scanf("%d", &num);
	for (int i=0; i<num; i++)
	{
		DeQueue(Q,&e);
	}
	return Q;
}	

//调用取队头元素功能函数
void Use_GetHead(LinkQueue Q)
{
	ElemType e;
	GetHead(Q,&e);
	printf("队头元素是%d\n", e);
}
//遍历队列
void TravelQueue(LinkQueue Q)
{
	QPtrl p = (QPtrl)malloc(sizeof(QNode));
	p = Q->front->next;
	while (p != NULL)
	{
		printf("%d", p->data);
		p=p->next;
	}
	printf("\n");
} 
int main()
{
	LinkQueue Q;
	int num;
	Q = InitQueue(Q);
//	printf("123");
	while(1)
	{
		menu();
		scanf("%d", &num);
		switch(num)
		{
			case 1: Q=Use_EnQueue(Q); break;
			case 2: Q=Use_DeQueue(Q); break; 
			case 3: Use_GetHead(Q); break; 
			case 4: TravelQueue(Q); break; 
			case 5: exit(OVERFLOW);
			default:printf("replace!\n");
		}
	}
	return 0;
}	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

猜你喜欢

转载自blog.csdn.net/weixin_46272577/article/details/111287996