数据结构C/C++队列算法

来源:互联网 发布:钢结构三维建模软件 编辑:程序博客网 时间:2024/05/29 14:02

假设以带头结点的循环链表来表示队列,并且只设一个指针指向队尾,编写相应的置队空、入队、出队算法。并且还要设计直观的用户操作界面,能直观看到操作结果。


#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;
}
原创粉丝点击