数据结构-链队的基本操作函数的实现(含全部代码)

版权声明:本文为博主原创文章,转载请注明出处,并附有原文链接。 https://blog.csdn.net/lady_killer9/article/details/82751565

主要包含以下函数:   

  •     InitQueue(LinkQueue &Q) 参数:链队Q 功能:初始化  时间复杂度O(1)
  •     EnQueue(LinkQueue &Q,QElemType e) 参数:链队Q,元素e 功能:将e入队 时间复杂度:O(1)
  •     DeQueue(LinkQueue &Q,QElemType &e) 参数:链队Q,元素e 功能:队头出队,e接收出队元素值 时间复杂度O(1)
  •     GetHead(LinkQueue &Q,QElemType &e)  参数:链队Q,元素e 功能:得到队顶元素 时间复杂度O(1)

    注意:有头结点

代码:

/*
    Project: single_linked_queue (链队列)
    Date:    2018/09/17
	Author:  Frank Yu
    InitQueue(LinkQueue &Q) 参数:链队Q 功能:初始化  时间复杂度O(1)
	EnQueue(LinkQueue &Q,QElemType e) 参数:链队Q,元素e 功能:将e入队 时间复杂度:O(1)
	DeQueue(LinkQueue &Q,QElemType &e) 参数:链队Q,元素e 功能:队头出队,e接收出队元素值 时间复杂度O(1)
	GetHead(LinkQueue &Q,QElemType &e)  参数:链队Q,元素e 功能:得到队顶元素 时间复杂度O(1)
	注意:有头结点
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define QElemType int
//链队结点数据结构
typedef struct QNode
{
	QElemType data;//数据域
	struct QNode *next;//指针域
	
}QNode,*QueuePtr;
typedef struct
{
	struct QNode *front,*rear;//rear指针指向队尾 用于入队 front指针指向队头 用于出队
}LinkQueue;
//**************************基本操作函数***************************//
//初始化函数
Status InitQueue(LinkQueue &Q)
{
	Q.front=Q.rear=new QNode;//生成新节点作为头结点,队头队尾指针均指向它
	Q.front->next=NULL;
	return 1;
}
//入队函数 
Status EnQueue(LinkQueue &Q,QElemType e)
{
	QNode *p;
	p=new QNode;//生成新节点
	p->data=e;    //赋值
	p->next=NULL;
	Q.rear->next=p;//加入队尾
	Q.rear=p;      //尾指针后移
	return 1;
}
//出队函数  队头出队用e返回 注意释放空间
bool DeQueue(LinkQueue &Q,QElemType &e)
{
	QueuePtr p;
	if(Q.front==Q.rear)return false;//队空
	e=Q.front->next->data;           //e返回值 之前写的Q.front->data 炸了,头结点没数据的,一定要注意头结点
	p=Q.front->next;                //保留,一会儿释放空间
	Q.front->next=p->next;          //出队,注意Q.front->next 不是Q.front 还有头结点
	if(Q.rear==p)Q.rear=Q.front;    //最后一个元素出队,rear指向头结点
	free(p);
	return true;
}
//取队顶函数 用e返回
bool GetHead(LinkQueue &Q,QElemType &e) 
{
	if(Q.front==Q.rear) return false;//队列为空
	e=Q.front->next->data;
	return true;
}
//**************************功能实现函数***************************//
//菜单
void menu()
{
   printf("********1.入队          2.出队*********\n");
   printf("********3.取队顶元素    4.退出*********\n");
}
//入队功能函数 调用EnQueue函数 
void EnterToQueue(LinkQueue &Q)
{
	int n;QElemType e;int flag;
	printf("请输入入队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 printf("请输入第%d个元素的值:",i+1);
	 scanf("%d",&e);
	 flag=EnQueue(Q,e);
	 if(flag)printf("%d已入队\n",e);
	}
}
//出队功能函数 调用DeQueue函数
void DeleteFromQueue(LinkQueue &Q)
{
	int n;QElemType e;int flag;
	printf("请输入出队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 flag=DeQueue(Q,e);
	 if(flag)printf("%d已出队\n",e);
	 else {printf("队已空!!!\n");break;}
	}
}
//取队顶功能函数 调用GetHead函数
void GetHeadOfStack(LinkQueue Q)
{
	QElemType e;bool flag; 
	flag=GetHead(Q,e);
	if(flag)printf("队头元素为:%d\n",e);
	else printf("队已空!!!\n");
}
//主函数
int main()
{
 LinkQueue Q;int choice;
 InitQueue(Q);
 while(1)
 {
  menu();
  printf("请输入菜单序号:\n");
  scanf("%d",&choice);
  if(4==choice) break;
  switch(choice)
  {
  case 1:EnterToQueue(Q);break;
  case 2:DeleteFromQueue(Q);break;
  case 3:GetHeadOfStack(Q);break;
  default:printf("输入错误!!!\n");
  }
 }
 return 0;
}

结果截图:

结果截图

更多数据结构实现:数据结构严蔚敏版的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

猜你喜欢

转载自blog.csdn.net/lady_killer9/article/details/82751565
今日推荐