1. 程式人生 > >資料結構C/C++佇列演算法

資料結構C/C++佇列演算法

假設以帶頭結點的迴圈連結串列來表示佇列,並且只設一個指標指向隊尾,編寫相應的置隊空、入隊、出隊演算法。並且還要設計直觀的使用者操作介面,能直觀看到操作結果。

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