1. 程式人生 > >資料結構之佇列

資料結構之佇列

一、順序佇列

待補充、、、、、、、

二、鏈佇列

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef int ElemType;
typedef enum{
    OVERFLOW=-1,
    ERROR=0,
    OK=1
}Status;
typedef struct Qnode{
    ElemType data;
    struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
    Q.front=Q.rear=new Qnode;
    Q.front->next=NULL;
    return OK;
}
Status QueueExit(LinkQueue Q){
    return Q.front&&Q.rear?OK:ERROR;
}
Status ClearQueue(LinkQueue &Q){
    if(!QueueExit(Q)) return ERROR;
    Qnode *p=Q.front->next;
    while(p){
        Q.front->next=p->next;
        delete p;
        p=Q.front->next;
    }
    Q.rear=Q.front;
    return OK;
}
Status DestroyQueue(LinkQueue &Q){
    if(!QueueExit(Q)) return ERROR;
    ClearQueue(Q);
    Q.front=Q.rear=NULL;
    return OK;
}
Status QueueEmpty(LinkQueue Q){
    return Q.front==Q.rear?OK:ERROR;
}
int QueueLenth(LinkQueue Q){
    if(!QueueExit(Q)) return -1;
    Qnode *p=Q.front->next;
    int len=0;
    while(p){
        len++;
        p=p->next;
    }
    return len;
}
Status EnQueue(LinkQueue &Q,ElemType e){
    Qnode *p=new Qnode;
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return OK;
}
Status DeQueue(LinkQueue &Q,ElemType &e){
    if(Q.front==Q.rear) return ERROR;
    Qnode *p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p) Q.rear=Q.front;
    delete p;
    return OK;
}
ElemType GetHead(LinkQueue Q){
    if(Q.front!=Q.rear) return Q.front->next->data;
}
void QueueTraverse(LinkQueue Q){
    if(!QueueExit(Q)){
        printf("鏈隊不存在,遍歷失敗!\n");
        return;
    }
    if(QueueEmpty(Q)){
        printf("鏈隊為空,遍歷失敗!\n");
        return;
    }
    Qnode *p=Q.front->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\b\n");
}
void Menu(){
    printf("輸入數字選擇測試函式\n");
    printf("1、入隊\n");
    printf("2、出隊\n");
    printf("3、隊頭\n");
    printf("4、隊長\n");
    printf("5、隊空\n");
    printf("6、清空\n");
    printf("7、銷燬\n");
    printf("8、遍歷\n");
    printf("0、退出\n");
}
void BacktoMenu(){
    printf("按任意鍵返回選單\n");
    getchar();
}
int main(){
    printf("按任意鍵建立鏈棧\n");
    getchar();
    LinkQueue Q;
    if(InitQueue(Q)) printf("建立成功\n");
    else printf("建立失敗\n");
    printf("按任意鍵進入選單\n");
    getchar();
    while(1){
        system("cls");
        Menu();
        int op;
        ElemType e;
        scanf("%d",&op);
        getchar();
        switch(op){
            case 1:
                if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n");
                else{
                    printf("請輸入要入隊的元素\n");
                    scanf("%d",&e);
                    getchar();
                    EnQueue(Q,e);
                    printf("入隊成功\n");
                }
                BacktoMenu();
                break;
            case 2:
                if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n");
                else if(DeQueue(Q,e)) printf("出隊成功,隊頭元素為%d\n",e);
                else printf("隊空,出隊失敗\n");
                BacktoMenu();
                break;
            case 3:
                if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n");
                else if(QueueEmpty(Q)) printf("隊空,取頂失敗\n");
                else{
                    e=GetHead(Q);
                    printf("取頂成功,頂頭元素為%d\n",e);
                }
                BacktoMenu();
                break;
            case 4:
                if(QueueLenth(Q)==-1) printf("鏈隊不存在,請先建立鏈隊\n");
                else printf("隊長為%d\n",QueueLenth(Q));
                BacktoMenu();
                break;
            case 5:
                if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n");
                else QueueEmpty(Q)?printf("隊空\n"):printf("隊非空\n");
                BacktoMenu();
                break;
            case 6:
                if(ClearQueue(Q)) printf("清空成功\n");
                else printf("鏈隊不存在,請先建立鏈隊\n");
                BacktoMenu();
                break;
            case 7:
                if(DestroyQueue(Q)) printf("銷燬成功\n");
                else printf("鏈隊不存在,請先建立鏈隊\n");
                BacktoMenu();
                break;
            case 8:
                QueueTraverse(Q);
                BacktoMenu();
                break;
            case 0:
                exit(0);
        }
    }
    return 0;
}