Data Structure——舞伴问题(队列)

#include<bits/stdc++.h>
using namespace std;

#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
//舞者名字,姓名结构体 
typedef struct{
    char name[20];
    char sex;  
}Person;
typedef int Status;
typedef Person QElemType;
//链队结构体 
typedef struct QNode{
    QElemType date;
    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 EnQueue(LinkQueue &Q,QElemType e){
    QueuePtr p;
    p=new QNode;  //为入队元素分配节点空间,用指针P指向 
    p->date=e;    //将新节点的数据域值为e 
    p->next=NULL;Q.rear->next=p;  //将新节点插入到队尾 
    Q.rear=p;   //修改队尾指针 
    return OK;
}

//出队
Status DeQueue(LinkQueue &Q,QElemType &e){
    //删除Q的队头元素,用e返回其值 
    QueuePtr p=new QNode;  
    if(Q.front==Q.rear) return ERROR;  //若队列空,返回ERROR 
    p=Q.front->next;  //p指向队头元素 
    e=p->date;   //e保存队头元素的值 
    Q.front->next=p->next;  //修改头结点的指针域 
    if(Q.rear==p)    //最后一个元素被删,队尾指针指向头结点 
        Q.rear=Q.front;  
    delete p;   //释放原队头元素的空间 
    return OK;

//取链队的队头元素 
QElemType GetHead(LinkQueue Q){ 
    if(Q.front!=Q.rear)  //队列非空 
        return Q.front->next->date;   //返回队头元素的值,队头指针不变 
}
//判断队是否为空 
Status QueueEmpty(LinkQueue Q){
    if(Q.front==Q.rear)
        return TRUE;
    else return FLASE;
}


void DancePartner(Person dancer[],int num){
    int i;
    Person p;
    LinkQueue Mdancers,Fdancers;
    InitQueue(Mdancers);   //男士队列初始化 
    InitQueue(Fdancers);   //女士队列初始化 
    for(i=0;i<num;i++){    //依次将跳舞者根据性别入队 
        p=dancer[i];
        if(p.sex=='F')  EnQueue(Fdancers,p);   //插入女队 
        else EnQueue(Mdancers,p);       //插入男队 
    }
    cout<<"舞伴是 :\n";
    //cout<<QueueEmpty(Fdancers)<<QueueEmpty(Mdancers)<<endl;
    while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers)){
        //依次输入男女舞伴姓名 
        DeQueue(Fdancers,p);    //女士出队 
        cout<<p.name<<" and ";  //输出出队女士姓名 
        DeQueue(Mdancers,p);   //男士出队
        cout<<p.name<<endl;   //输出出队男士姓名
    }
    if(!QueueEmpty(Fdancers)){    //女士队列非空,输出队头女士的姓名 
        p=GetHead(Fdancers);  //取女士队头 
        cout<<p.name<<" 正在等待舞伴."<<endl;
    }
    else if(!QueueEmpty(Mdancers)){   //男士队列非空,输出队头男士的姓名 
        p=GetHead(Mdancers);    //取男士队头 
        cout<<p.name<<" 正在等待舞伴."<<endl; 
    }
}

int main(){
    int i,num;
    Person dancer[100];
    cout<<"请输入跳舞的总人数:"; 
    cin>>num;
    while(num<=0)
    {
        cout<<"您的输入错误,请重新输入跳舞的人数:"; 
        cin>>num;
    }
    for(i=1;i<=num;i++)
    {
        cout<<"请输入第"<<i<<"位舞者的名字:"<<endl;
        cin>>dancer[i-1].name;
        cout<<"请输入第"<<i<<"个人的性别(F or M):"<<endl;
        cin>>dancer[i-1].sex;
        while(dancer[i-1].sex!='F'&&dancer[i-1].sex!='M')
        {
            cout<<"*******输入错误,请重新输入:\n";
            cout<<dancer[i-1].sex;
            cout<<"请输入第"<<i<<"个舞者的性别(F/M):"<<endl;
            cin>>dancer[i-1].sex;
            break;
        }
    }
    DancePartner(dancer,num);
    return 0;
}

数据结构算法实现(严蔚敏版配套实现程序) 1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 范例1-4 显示杨辉三角 7 ∷相关函数:c函数 8 1.1.5 魔方阵 9 范例1-5 魔方阵 9 1.1.6 三维数组的表示 14 范例1-6 三维数组的表示 14 ∷相关函数:InitArray函数 1.1.7 多项式的数组表示 17 范例1-7 多项式数组的表示 17 1.1.8 查找矩阵的马鞍点 19 范例1-8 查找矩阵的马鞍点 19 ∷相关函数:Get_Saddle函数 1.1.9 对角矩阵建立 21 范例1-9 对角矩阵建立 21 ∷相关函数:Store函数 1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相关函数:Store函数 1.1.11 三角矩阵建立 24 范例1-11 三角矩阵建立 24 ∷相关函数:Store函数 1.1.12 对称矩阵的建立 25 范例1-12 对称矩阵的建立 25 ∷相关函数:store函数 1.1.13 字符串长度的计算 28 范例1-13 字符串长度的计算 28 ∷相关函数:strlen函数 1.1.14 字符串的复制 29 范例1-14 字符串的复制 29 ∷相关函数:strcpy函数 1.1.15 字符串的替换 31 范例1-15 字符串的替换 31 ∷相关函数:strrep函数 1.1.16 字符串的删除 33 范例1-16 字符串的删除 33 ∷相关函数:strdel函数 1.1.17 字符串的比较 35 范例1-17 字符串的比较 35 ∷相关函数:strcmp函数 1.1.18 字符串的抽取 36 范例1-18 字符串的抽取 36 ∷相关函数:substr函数 1.1.19 字符串的分割 38 范例1-19 字符串的分割 38 ∷相关函数:partition函数 1.1.20 字符串的插入 40 范例1-20 字符串的插入 40 ∷相关函数:insert函数 1.1.21 字符串的匹配 42 范例1-21 字符串的匹配 42 ∷相关函数:nfind函数 1.1.22 字符串的合并 43 范例1-22 字符串的合并 43 ∷相关函数:catstr函数 1.1.23 文本编辑 45 范例1-23 文本编辑 45 ∷相关函数:StrAssign函数 1.2 栈和队列 54 1.2.1 用数组仿真堆栈 54 范例1-24 用数组仿真堆栈 54 ∷相关函数:push函数 pop函数 1.2.2 用链表仿真堆栈 57 范例1-25 用链表仿真堆栈 57 ∷相关函数:push函数 pop函数 1.2.3 顺序栈公用 59 范例1-26 顺序栈公用 59 ∷相关函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相关函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相关函数:push函数 pop函数 1.2.6 循环队列 66 范例1-29 循环队列 66 ∷相关函数:EnQueue函数 DeQueue函数 1.2.7 链队列的入队、出队 69 范例1-30 链队列入队、出队 69 ∷相关函数:push函数 pop函数 1.2.8 舞伴问题 71 范例1-31 舞伴问题 71 ∷相关函数:EnQueue函数 DeQueue函数 DancePartner函数 1.3 链表 75 1.3.1 头插法建立单链表 75 范例1-32 头插法建立单链表 75 ∷相关函数:createlist函数 1.3.2 限制链表长度建立单链表 77 范例1-33 限制链表长度建立长单链表 77 ∷相关函数:createlist函数 1.3.3 尾插法建立单链表 79 范例1-34 尾插法建立单链表 79 ∷相关函数:createlist函数 1.3.4 按序号查找单链表 80 范例1-35 按序号查找单链表 80 ∷相关函数:getnode函数 1.3.5 按值查找单链表 82 范例1-36 按值查找单链表 82 ∷相关函数:locatenode函数 1.3.6 链表的插入 84 范例1-37 链表的插入 84 ∷相关函数:insertnode函数 1.3.7 链表的删除 86 范例1-38 链表的删除 86 ∷相关函数:deletelist函数 1.3.8 归并两个单链表 88 范例1-39 归并两个单链表 88 ∷相关函数:concatenate函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值