資料結構C/C++佇列演算法
阿新 • • 發佈:2019-01-23
假設以帶頭結點的迴圈連結串列來表示佇列,並且只設一個指標指向隊尾,編寫相應的置隊空、入隊、出隊演算法。並且還要設計直觀的使用者操作介面,能直觀看到操作結果。
#include <iostream>
#include <malloc.h>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
using namespace std;
typedef int Datatype;
typedef struct Node//指標結構體
{
Datatype data;
struct Node* next;
}Node;
typedef struct//頭指標和尾指標結構體
{
struct Node *front;
struct Node *rear;
}QNode,*LinkQueue;
void InitQueue( LinkQueue &Q);//初始化置空佇列
void EnQueue( LinkQueue &Q, Datatype x);//入隊
Datatype DeQueue( LinkQueue &Q,Datatype &x);//出隊
void ShowAllData(LinkQueue &Q);//顯示佇列所有元素
int main()
{
LinkQueue Q;
Datatype x;
int choice;
printf("請輸入你的選項:\n");
printf("1.初始化佇列\n");
printf("2.置隊空\n");
printf("3.入隊\n");
printf("4.出隊\n");
printf("其他鍵:退出\n");
while(~scanf("%d",&choice))//迴圈,使一直輸入“choice"
{
if(choice==1){InitQueue(Q);printf("初始化成功,按任意鍵繼續\n");}
else if (choice==2){InitQueue(Q);printf("佇列置空成功,按任意鍵繼續\n");}
else if (choice==3){printf("請輸入插入的元素:");scanf("%d",&x);EnQueue(Q,x);}
else if (choice==4){DeQueue(Q,x);printf("出隊的元素為%d\n",x);}
else exit(0);
printf("佇列元素為:");
ShowAllData(Q);//顯示全部元素
getchar();
system("cls");
printf("請輸入你的選項:\n");
printf("1.初始化佇列\n");
printf("2.置隊空\n");
printf("3.入隊\n");
printf("4.出隊\n");
printf("其他鍵:退出\n");
}
return 0;
}
void InitQueue( LinkQueue &Q )//初始化佇列
{
Q = new QNode;//申請佇列空間
Q->rear = Q->front = new Node;//申請指標空間並使頭尾指標地址相同
Q->front->next = NULL;//令佇列內無元素
getchar();
return;
}
void EnQueue( LinkQueue &Q, Datatype x)//尾插法入隊,將x儲存在Q連結串列的尾部
{
Node* p = new Node; //申請新結點
p->data=x; //將x存入p中的資料域
Q->rear->next=p;//令Q的尾節點下一位指向p
Q->rear=p;//將尾指標移至新結點
Q->rear->next = Q->front;//迴圈佇列,使尾節點下一位指向頭結點
return;//完成入隊
}
int DeQueue( LinkQueue &Q,Datatype &x)//出隊操作,將在最前面的元素出隊
{
if(Q->front == Q->rear)return 0;
Node* p=Q->front->next;//將Q的佇列頭元素地址賦給p
//p 指向將要摘下的結點
x=p->data; //儲存結點中資料
Q->front->next = p->next;//令p的下一節點指向第一個元素
if (p==Q->rear)//如果佇列為空
{
Q->rear = Q->front;//當佇列中只有一個結點時,p 結點出隊後, 要將隊尾指標指向頭結點
}
delete p;//釋放被刪結點
return 1;
}
void ShowAllData(LinkQueue &Q)//顯示所有元素
{
if(Q->front->next == NULL)//如果佇列中無元素
{
printf("無元素");
return;
}
Node* p=Q->front->next;//令p指標指向第一個元素
while(p!=Q->front)//當p遍歷所有結點時
{
printf("%d ",p->data);//輸出佇列中所有元素
p = p->next;//p指向下一元素
}
getchar();
return;
}