1. 程式人生 > >資料結構-鏈隊的基本操作函式的實現(含全部程式碼)

資料結構-鏈隊的基本操作函式的實現(含全部程式碼)

主要包含以下函式:   

  •     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;
}

結果截圖:

結果截圖

有問題請下方評論,轉載請註明出處,並附有原文連結,謝謝!如有侵權,請及時聯絡。